含笑阁 发表于 2019-4-2 22:51

【web】简单的CSS动画特效----RGB走马灯边框线

本帖最后由 含笑阁 于 2019-4-2 22:52 编辑

今天给大家分享一个简单的CSS动画:
具体效果如下:














所需要的最重要的样式是:clip 也是本次教程的核心
W3C对其的定义:


好,预习完后我们开始本次的内容讲解:
首先是HTML的布局:由于边框是用CSS的伪类before和after加上去的,所以本次的布局非常简单
只需要一个div即可:
<body>
      <div class="box"></div>
</body>
好,接下来是对其添加样式:
首先是对div本身的样式,这里我为body添加了背景色,以及清空了本身自带的margin
body {
      margin: 0;
      background: #333;
}

.box {
      width: 200px;
      height: 200px;
      box-sizing: border-box;
      border: 1px solid #cb6341;
      position: fixed;
      left: 50%;
      top: 50%;
      margin-top: -100px;
      margin-left: -100px;

}
这时,我们已经可以看到div的基本形状了,接下来就是用CSS中的伪类before和after为其添加外层的边框
.box:after,
.box:before {
      content: '';
      width: 220px;
      height: 220px;
      box-sizing: border-box;
      border: 1px solid;
      position: absolute;
      top: -5%;
      left: -5%;
      animation: boxBorder 6s linear infinite;
}
.box:before {
      animation-delay: -3s;
}
上面的代码我需要说明一下:
首先,这次里并没有设置边框的颜色,是为了在接下来的动画中动态的改变yanse
其次,为before添加了动画延迟,为了方式和after重叠在一起。

好了,接下来就是本次教程的核心内容了,动画!如果懂的话,可以去W3C预习一下{:301_1001:}

@keyframes boxBorder {
      0% {
                border-color: #fff;
                clip: rect(0, 220px, 2px, 0);
      }
      25% {
                border-color: yellow;
                clip: rect(0px, 2px, 220px, 0)
      }
      50% {
                border-color: blue;
                clip: rect(218px, 220px, 220px, 0)
      }
      75% {
                border-color: green;
                clip: rect(0, 220px, 220px, 218px)
      }
      100% {
                border-color: #fff;
                clip: rect(0, 220px, 2px, 0)
      }
}
说明一下:这里的border-color是前面没有设置的,这里加上,为了让其颜色变化
clip是裁剪图像:括号里面的4个值分别代表上右下左
有兴趣的同学可以自行研究一下~{:301_978:}

最后放上全部的代码:
ps:这里面的代码包含开始gif动画中演示那种,div中间又两个椭圆的那种,代码原理相似,不单独拉出来了
至此,本次教程结束,谢谢各位~
<!doctype html>
<html lang="en">
      <head>
                <meta charset="UTF-8">
                <title>Document</title>
                <style>
                        body {
                              margin: 0;
                              background: #333;
                        }

                        .box {
                              width: 200px;
                              height: 200px;
                              box-sizing: border-box;
                              border: 1px solid #cb6341;
                              position: fixed;
                              left: 50%;
                              top: 50%;
                              margin-top: -100px;
                              margin-left: -100px;

                        }

                        .box:after,
                        .box:before {
                              content: '';
                              width: 220px;
                              height: 220px;
                              box-sizing: border-box;
                              border: 1px solid;
                              position: absolute;
                              top: -5%;
                              left: -5%;
                              animation: boxBorder 6s linear infinite;
                        }

                        .box:before {
                              animation-delay: -3s;
                        }

                        .box .icon {
                              position: absolute;
                              top: 50%;
                              left: 50%;
                              width: 100px;
                              height: 100px;
                              margin-top: -50px;
                              margin-left: -50px;
                              animation: iconBox 3s linear infinite;
                        }

                        .box .icon:after,
                        .box .icon:before {
                              content: "";
                              width: 40%;
                              height: 100%;
                              box-sizing: border-box;
                              border-radius: 50%;
                              border: 2px solid #fff;
                              position: absolute;
                              top: 0;
                              left: 30px;
                              animation: iconBorder 3s linear infinite;
                        }

                        .box .icon:after {
                              transform: rotate(60deg);
                        }

                        .box .icon:before {
                              transform: rotate(-60deg);
                        }

                        .box .icon2:before {
                              transform: rotate(0deg);
                        }

                        .box .icon2:after {
                              height: 10px;
                              width: 10px;
                              background-color: #fff;
                              transform: translate(12px, -6px);
                              border: 3px solid #333;
                              box-sizing: content-box;
                              animation: iconYuan 3s linear infinite 0.6s;
                        }

                        @keyframes iconBox {
                              0% {
                                        transform: rotate(0deg);
                              }

                              100% {
                                        transform: rotate(360deg);
                              }
                        }

                        @keyframes iconBorder {
                              0% {
                                        border-color: #fff;
                              }

                              30% {
                                        border-color: yellow;
                              }

                              60% {
                                        border-color: blue;
                              }

                              100% {
                                        border-color: red;
                              }
                        }

                        @keyframes iconYuan {
                              0% {
                                        background-color: #fff;
                              }

                              30% {
                                        background-color: yellow;
                              }

                              60% {
                                        background-color: blue;
                              }

                              100% {
                                        background-color: red;
                              }
                        }

                        @keyframes boxBorder {
                              0% {
                                        border-color: #fff;
                                        clip: rect(0, 220px, 2px, 0);
                              }

                              25% {
                                        border-color: yellow;
                                        clip: rect(0px, 2px, 220px, 0)
                              }

                              50% {
                                        border-color: blue;
                                        clip: rect(218px, 220px, 220px, 0)
                              }

                              75% {
                                        border-color: green;
                                        clip: rect(0, 220px, 220px, 218px)
                              }

                              100% {
                                        border-color: #fff;
                                        clip: rect(0, 220px, 2px, 0)
                              }
                        }
                </style>

      </head>
      <body>
                <div class="box">
                        <div class="icon icon1"></div>
                        <div class='icon icon2'></div>
                </div>
      </body>
</html>

Nemoris丶 发表于 2019-4-2 23:06

;www只能说没啥用

含笑阁 发表于 2019-4-2 23:10

Nemoris丶 发表于 2019-4-2 23:06
只能说没啥用

哈哈,单独拉出来确实用处不大,但是稍微改改,加给表单元素,动画改成获取焦点触发,就可以变成新的功能{:301_1001:}
只是想让大家了解下这个功能了,然后扩展出更好的内容~

大家一起努力,一起学习,一起进步;www

wongjiawei 发表于 2019-4-2 23:54

想问下 像 135微信编辑器   96编辑器等微信第三方编辑器

是不是都是运用了CSS技术, 想学的话从何开始最好?

天阶 发表于 2019-4-3 00:43

看不懂 那里可学习这些技术?

含笑阁 发表于 2019-4-3 08:27

天阶 发表于 2019-4-3 00:43
看不懂 那里可学习这些技术?

想学的话,论坛里好多web前端教程;www

yqesl1 发表于 2019-4-3 09:28

前端大牛,膜拜一下!

含笑阁 发表于 2019-4-3 09:34

wongjiawei 发表于 2019-4-2 23:54
想问下 像 135微信编辑器   96编辑器等微信第三方编辑器

是不是都是运用了CSS技术, 想学的话从何 ...

那些第三方编辑器就相当于前端里的富文本编辑器,方便在发表文章时的排版,不用自己来写html标签,他们会直接生成带标签的内容。

我看了他们的编辑器,他们生成是内容之间链接到了他们的css样式表

如果想要学习css的话 可以看看论坛内的web前端教学,如果只是想学css这一块的话,可以单独只听HTML和CSS这一块

wongjiawei 发表于 2019-4-3 11:04

含笑阁 发表于 2019-4-3 09:34
那些第三方编辑器就相当于前端里的富文本编辑器,方便在发表文章时的排版,不用自己来写html标签,他们会 ...

谢谢指教

hlh2518 发表于 2019-4-3 17:01

谢谢分享!学习一下了!
页: [1] 2
查看完整版本: 【web】简单的CSS动画特效----RGB走马灯边框线