css 有很多神奇的效果都是使用 CSS 伪元素利用视觉差来制作的,以前没怎么深入的研究过 css,这次复习 css 的知识点才恍然大悟,原来 css 这么 cool。
先上效果:
动画实现原理
这个组动画的实现原理很简单,前边是一个 div,这个 div 后边再加一个 div 做动画就可以实现了,那么我们需要前后两个 div 叠加在一起?NoNoNo,这个时候就需要 CSS 伪元素::before 和::after 出场了。
CSS 伪元素::before 和::after
CSS 伪元素::after 用来创建一个伪元素,作为已选中元素的最后一个子元素。通常会配合 content 属性来为该元素添加装饰内容。这个虚拟元素默认是行内元素。
::before 和::after 的区别就是一前一后,举个简单的例子:
举个例子:
代码如下:
<div id="demo1">这是顶部的div</div>
<style>
#demo1{
position: relative;
width:100px;
height:100px;
color: white;
background-color: black;
}
#demo1::before{
content:'';
position: absolute;
width:110px;
height:110px;
z-index: -1;
top:-5px;
left:-5px;
background-image: linear-gradient(
var(--rotate), #5ddcff, #3c67e3 43%, #4e00c2);
}
#demo1::after{
content:'';
position: absolute;
width:120px;
height:120px;
z-index: -2;
top:-10px;
left:-10px;
background: linear-gradient(115deg, #4fcf70, #fad648, #a767e5, #12bcfe, #44ce7b);
}
</style>
这段 css 代码中有几个关键的属性
div 必须作为伪元素定位的父类 position: relative;
伪元素为相对于 div 定位 position: absolute;
通过其他css属性来定义伪元素的属性,产生层叠和视觉上的错位。
最后就是利用 animation 来制作动画了,动画的效果可以选择移动旋转或是透明度,可以产生各种超酷的效果。
看下最后的效果:
最后的代码如下:
<div id="demo2">这是顶部的div</div>
<style>
@property --rotate {
syntax: "<angle>";
initial-value: 132deg;
inherits: false;
}
#demo2{
position: relative;
width:103px;
height:103px;
color: white;
background-color: black;
border-radius: 8px;
padding: 3px;
}
#demo2::before {
content: "";
width: 112px;
height: 112px;
border-radius: 8px;
background-image: linear-gradient(
var(--rotate), #5ddcff, #3c67e3 43%, #4e00c2);
position: absolute;
z-index: -1;
top: -5px;
left: -5px;
animation: spin1 2.5s linear infinite;
}
#demo2::after{
position: absolute;
content: "";
top: calc(var(--card-height) / 6);
left: 0;
right: 0;
z-index: -1;
height: 100%;
width: 100%;
margin: 0 auto;
transform: scale(0.8);
filter: blur(calc(var(--card-height) / 5));
background-image: linear-gradient(
var(--rotate), #5ddcff, #3c67e3 43%, #4e00c2);
opacity: 1;
transition: opacity .5s;
animation: spin1 2.5s linear infinite;
}
@keyframes spin1 {
0% {
--rotate: 0deg;
}
100% {
--rotate: 720deg;
}
}
</style>
这个 css 的效果主要是靠伪类的动画来实现的,具体的细节还需要自己多多调试修改各个参数,使之达到自己的期望的动效。