目录
实现思路
具体实现
基础html
背景颜色
容器颜色
水样式
两个水波样式
完整代码
总结
先实现一个装水的容器,可以通过box-shadow给容器增添点厚度
的感觉
水的实现,其实就是一个纯色的背景
接下来就是波纹的实现
思考下现有的css属性可以有这样的效果吗?
答案是否定的,那我们怎样通过dom+css来实现这样的效果呢?
我们可以看到波纹的行动轨迹是有规律的,再仔细观察后会发现其实每四个小周期是一个循环,每四个小周期之后的动画都是固定的
那还能通过怎样的方式来实现这样的运动轨迹呢?
先观察圆形容器中的浅粉色部分,会发现其实他就是一个带有border-radius
的正方形在旋转,或者是一个长于宽相差不大的矩形
border-raduis+animation
即可再观察浅粉色和深蓝色中间的浅蓝色部分的移动轨迹,已经有了一次推测的大家应该也可以很快发现,其实这也是一个带有border-radius
的正方形或长宽相差不大的矩形,只不过这个的border-radius
更大而已
因为更大,所以看上去转动时波动就没那么明显
然后水dom
在最下面,浅蓝色dom
在中间,浅粉色dom
在最上面,这样颜色互相覆盖之下,就能形成类似的视觉效果
上面提到转动的是正方形或长于宽相差不大的矩形,这是为什么呢?
还有一个没那么重要但是也需要注意的点
我们可以看到,认真观察的话,其实他们旋转都不是正对圆心的,也就是要更偏一点的,这个是为了让两个带圆角的正方形旋转时不要总是间隔一致,要有错落有致的感觉
translate
transform:rotate(0deg)
到transform:rotate(360deg)
的旋转transform: translate(-50%, -60%) rotate(0deg)
到transform: translate(-50%, -60%) rotate(360deg)
translate
属性可以适当偏差一点,但是不宜偏差过大,因为过大之后还是会出现上面说过的长宽相距太大时会出现的问题下面完整代码来反过来分析
我们只关注背景和容器,因为.water
可以设置两个伪元素,所以就用伪元素来代替两个水波
body {
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: rgb(240, 228, 228);
}
背景最好要是浅色的,这样看起来跟水与水波的对比才会更清晰
.TheCircle {
position: relative;
width: 180px;
height: 180px;
border-radius: 50%;
border: 3px solid rgb(246, 247, 248);
box-shadow: 0 0 0 3px rgb(41, 134, 196);
}
因为后续要基于该容器定位,所以是relative
.Water {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgb(23, 106, 201);
border-radius: 50%;
overflow: hidden;
}
水既是深蓝色背景,也要起到容器的作用,添加overflow:hidden
来保证实现水波的两个dom不会超出,当然,这个样式写在容器上也可以
.Water::after {
content: '';
position: absolute;
top: 0;
left: 50%;
width: 150%;
height: 150%;
border-radius: 40%;
background-color: rgb(240, 228, 228);
animation: real 5s linear infinite;
}
@keyframes real {
0% {
transform: translate(-50%, -65%) rotate(0deg);
}
100% {
transform: translate(-50%, -65%) rotate(360deg);
}
}
.Water::before {
content: '';
position: absolute;
top: 0;
left: 50%;
width: 150%;
height: 150%;
border-radius: 42%;
background-color: rgb(240, 228, 228, 0.2);
animation: virtual 7s linear infinite;
}
@keyframes virtual {
0% {
transform: translate(-50%, -60%) rotate(0deg);
}
100% {
transform: translate(-50%, -60%) rotate(360deg);
}
}
可以看到两个水波dom
的translate
与border-radius
都有少许的不同,这个可以根据实现视觉效果微调
雾里有果橙
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
body {
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: rgb(240, 228, 228);
}
.TheCircle {
position: relative;
width: 180px;
height: 180px;
border-radius: 50%;
border: 3px solid rgb(246, 247, 248);
box-shadow: 0 0 0 3px rgb(41, 134, 196);
}
.Water {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgb(23, 106, 201);
border-radius: 50%;
overflow: hidden;
}
.Water::after {
content: '';
position: absolute;
top: 0;
left: 50%;
width: 150%;
height: 150%;
border-radius: 40%;
background-color: rgb(240, 228, 228);
animation: real 5s linear infinite;
}
@keyframes real {
0% {
transform: translate(-50%, -65%) rotate(0deg);
}
100% {
transform: translate(-50%, -65%) rotate(360deg);
}
}
.Water::before {
content: '';
position: absolute;
top: 0;
left: 50%;
width: 150%;
height: 150%;
border-radius: 42%;
background-color: rgb(240, 228, 228, 0.2);
animation: virtual 7s linear infinite;
}
@keyframes virtual {
0% {
transform: translate(-50%, -60%) rotate(0deg);
}
100% {
transform: translate(-50%, -60%) rotate(360deg);
}
}