今天的文章就来分析一下如何实现这个效果。文末附源码预览地址。根据样本图像分析需要实现的功能点如下:
该线沿着卡片边界并以恒定速度移动。线条内部有模糊的阴影,圆角部分有丝滑的动画。之所以单独说明圆角部分,是因为该部分需要特殊加工。请看下面的文章。
思考
当我看到这个效果的时候,我第一感觉就是丝滑。如果根据当前边界实时计算沿边界移动的动画元素,难度和算法会让很多人望而却步。
我们需要改变我们的想法。本质上移动的线条元素与边框无关,而是沿着边框移动的元素。卡片内部的线条和阴影是一个元素,这种效果是通过一定的视角产生的。
透视
为了通过透视实现边框效果,我们可以使用2个嵌套框并在父级上设置1像素的填充。下面的代码简单实现了边框效果。
.outer { width: 400px;高度: 200px;边距: 100px;背景: rgb(54, 224, 202);内边距: 1px;相对位置:}.inner { 背景: rgb(99, 99, 99);宽度: 1 00%;高度: 100%; }渲染:
然后添加一个子元素作为移动元素。该元素位于基于父元素的边框处。由于动画在卡片内部移动,因此请确保每一面的曝光长度保持一致。所有创建的子元素都是一个正方形。
.moving-element {position: 绝对;顶部: 0;左: 0;宽度: 80px;高度: 80px;背景:#fff; animation: moveAround 8s 线性无限;} 并给这个元素添加一个简单的animation动画,使其沿着内边框移动。
关于此动画需要注意的一点是,为了在元素移动时保持均匀的动画,您需要计算每个关键帧之间的距离,并根据这些距离调整每个关键帧的百分比。这样保证了元件在每个时间段移动的距离与时间成正比,从而实现真正的匀速运动。
这里我们以上面的卡为例。它的宽度是400px,高度是200px。元素沿着矩形的边界移动。
计算总路径长度:总长度=2(宽+高)=2(400px+200px)=1200px 计算各段占用的时间比例:水平边比例=400px/1200px=1/333.33%,垂直边的比例=200px/1200px=1/6 16.67%。动画代码如下:
@Keyframes 移动{0%, 100% {top: 0px; left: 0px;} 33.33% {TOP: 0px;} Left: CALC (100% -80px);} 50% {TOP: CALC (100% -80px);}左: CALC(100% 100% – 80px); 83.33% { top: 计算(100% – 80px);左: 0px; }}动画最终的简单版本如下:
这里为了方便大家,添加了透明度来显示内部的移动元素。如果去掉透明度,边框上就只剩下一条线了。
边框效果处理
如果仔细观察上图,可以发现边框末端的过渡效果并不好,瞬间从一个边缘切换到另一个边缘。首先还原网站的效果,添加边框圆角,然后通过圆角将内部的移动元素变成圆形。这时候还需要同步内部元素的定位和动画移动时设置的定位,保证内部圆的中心。与边界相同。

添加圆角:
.outer { border-radius: 20px;}.inner { border-radius: 20px;}.moving-element { border-radius: 40px; /* 圆心与边框一致*/transform: translate(-40px, -40px);}调整动画过程中的定位:
@keyframes moveAround { 0%, 100% { top: 0px;左: 0px; 33.33% { top: 0px;左: 100%; } 50% { top: 100%;左: 100%; } 83.33% { top: 10 0%;左: 0px; }}此时的动画效果:
此时边框位置动画已经非常接近网站的效果了。如果进一步观察图中的效果,可以发现边框一角有一点卡住的感觉。这是因为我们在边框位置设置了圆角,但元素移动的轨迹却是直角,造成了视觉上的停顿。这里我们需要进一步优化动画。设置圆角后,内部动画元素的移动点数量应由4个变为8个,且对应的位置需要与圆角的大小一一对应,以保证动画效果流畅。
如下图,黑点是到四个顶点的动画坐标,新的绿点是基于圆角的动画移动坐标。
从(360, 0) 到(400, 40)=((400-360) + (40-0))=(1600 + 1600)=3200 56.57px
此时的动画效果:
模糊阴影
现在唯一缺少的是最终的阴影部分尚未实现。如果仔细观察的话,移动的线条并不是全是纯色的,而是有渐变的效果。当前移动元素是一个正方形,您可以将背景颜色设置为径向渐变。修改背景颜色的代码如下:
背景图像:径向渐变(#fff 40%,透明80%);
现在您需要进一步模糊内部渐变。请注意,这只是模糊元素后面的背景,不会影响卡片上其他元素的显示。这里我们使用background-filter来设置模糊效果。
CSS 属性background-filter 用于将图形效果(例如模糊或颜色偏移)应用到元素后面的区域。此属性允许您操纵元素后面的背景,而不影响元素本身的前景内容。
最后进一步调整色彩还原网站的效果如下:
该效果不仅可以用于卡片显示,还可以作为按钮背景效果:
最后
至此,整体代码实现过程就结束了,网站的动画效果也完全恢复了。这是一种对于用户体验非常好的卡片效果。原网站上实施的一些细节有所不同。整体实现原理类似。基于两个元素之间1像素的间距,显示移动的线条,并使用背景滤镜设置纯粹的背景模糊效果。有兴趣的可以尝试一下。
用户评论
无望的后半生
哇,这个纯CSS的边框线动画效果太炫了!学到了新技能,感谢分享!
有14位网友表示赞同!
淡抹丶悲伤
用纯CSS做动画真的挺酷的,这个边框效果简单又实用。
有10位网友表示赞同!
封锁感觉
看了这个教程,感觉CSS的潜力无限大,想试试看自己动手做。
有16位网友表示赞同!
看我发功喷飞你
效果确实丝滑,不过感觉代码有点复杂,新手可能不太好上手。
有20位网友表示赞同!
有你,很幸福
这个动画效果太适合做网页小部件了,实用又美观。
有15位网友表示赞同!
龙吟凤
学习了,CSS动画可以做到这么酷,以后网页设计肯定能加分。
有10位网友表示赞同!
那伤。眞美
太棒了,竟然只用CSS就能实现这样的效果,太神奇了!
有8位网友表示赞同!
生命一旅程
之前一直觉得CSS动画很麻烦,现在发现其实很简单,谢谢分享。
有13位网友表示赞同!
站上冰箱当高冷
这个边框线动画很新颖,但我感觉在手机上可能显示效果一般。
有18位网友表示赞同!
熏染
CSS动画真的是艺术,这个边框线动画做得太精致了。
有8位网友表示赞同!
高冷低能儿
虽然代码有点长,但效果真的很惊艳,值得学习!
有11位网友表示赞同!
陌上花
每次看到这样的CSS技巧,都感觉自己离成为前端高手又近了一步。
有15位网友表示赞同!
志平
效果确实不错,但觉得代码优化空间很大,希望能看到改进版。
有12位网友表示赞同!
情深至命
这个动画效果在响应式网页设计中应该很有用,学到了!
有10位网友表示赞同!
﹎℡默默的爱
CSS动画的玩法真是层出不穷,这个边框线动画让人眼前一亮。
有13位网友表示赞同!
箜篌引
对于纯CSS动画,我一直很感兴趣,这个教程给了我很大启发。
有15位网友表示赞同!
致命伤
这个动画效果很吸引人,但感觉消耗性能较高,不知实际应用中如何。
有7位网友表示赞同!
墨染天下
CSS动画的细节处理真到位,这个边框线动画做得非常精致。
有20位网友表示赞同!
几妆痕
学习CSS动画的过程真的很快乐,这样的教程让人充满动力!
有20位网友表示赞同!