CSS实现雨滴动画效果的实例代码
GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!
【 如果你想靠AI翻身,你先需要一个靠谱的工具! 】
玻璃窗
今天我们要实现的是雨滴效果,不过实现雨滴前,我们先把毛玻璃的效果弄出来,没有玻璃窗,雨都进屋了,还有啥好敲打的。
1 2 3 4 5 6 7 8 9 10 | <div class= 'window' ></div> .window { position : absolute ; width : 100 vw; height : 100 vh; background : url ( "https://cn.bing.com//th?id=OHR.ParrotsIndia_ZH-CN8386276023_UHD.jpg" ); background- size : cover; background-position : 100% ; filter: blur( 10px ); } |
其实就是给一张图片,做了个模糊化的效果,看起来像毛玻璃的效果
一滴雨
雨滴的效果就很巧妙了,让我们看下一滴雨完整的效果图
这滴雨其实分为两个部分,第一部分是底部的阴影部分,其实是个边框来的,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 | .border { position : absolute ; margin-left : 92px ; margin-top : 51px ; border-radius: 100% ; box-shadow: 0 0 0 2px rgba( 0 , 0 , 0 , 0.6 ); transform: rotateY( 0 ); width : 20px ; height : 28px ; } <div class= 'border' ></div> |
通过width和height属性和border-radius把border拉成一个椭圆形,然后用box-shadow把阴影拉出来,作为水滴的阴影,边框的最终效果如下:
然后是水滴的部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | .raindrop { filter: brightness( 1.2 ); position : absolute ; margin-left : 90px ; margin-top : 50px ; background- size : 5 vw 5 vh; border-radius: 100% ; background-image : url ( "https://cn.bing.com//th?id=OHR.ParrotsIndia_ZH-CN8386276023_UHD.jpg" ); transform: rotate( 180 deg) rotateY( 0 ); background-position : 48.1994160428% 54.3259834959% ; width : 24px ; height : 28px ; } <div class= 'raindrop' ></div> |
- 水滴用background-image设置了玻璃的图片作为倒影,倒影之所以是倒影,是因为影子是倒着的,所以用transform的rotate()旋转了图片180,正好倒过来
- 通过background-position设置图片在水滴的显示的位置,后面不同的水滴会显示出的倒影因为图片位置的变化都不同,显得真实
- raindrop的width比border的width多几个像素,是为了让水滴的两边盖住border,只留border的上下显示阴影
- raindrop的margin-left和margin-top和border的也是略有不同,是为了raindrop能居中覆盖在border上面,使得水滴和阴影融合的更真实
单独无阴影的水滴效果如下:
随机雨滴
雨从来都不是一滴一滴来的,而且也不会很有规律的来,为了让雨滴随机出现在玻璃窗上,css-doodle框架。
先创建一个css-doodle的自定义组件
打出10*10个grid,这样最多可以出现100滴雨
transform: scale(@rand(.5, .9));
通过transform:scale让雨滴随机变大变小
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | :before { content : '' ; position : absolute ; margin-left : @var(--mleft); margin-top : @var(--mtopb); border-radius: 100% ; box-shadow: 0 0 0 @var(--shadow-size) rgba( 0 , 0 , 0 , 0.6 ); transform: rotateY( 0 ); width : @var(--widthb); height : @var(--height); } :after { content : '' ; filter: brightness( 1.2 ); position : absolute ; margin-left : @var(--mleft); margin-top : @var(--mtopa); background- size : 5 vw 5 vh; border-radius: 100% ; background-image : url ( "https://cn.bing.com//th?id=OHR.ParrotsIndia_ZH-CN8386276023_UHD.jpg" ); transform: rotate( 180 deg) rotateY( 0 ); background-position : @r( 1% , 100% ) @r( 1% , 100% ); width : @var(--widtha); height : @var(--height); } |
这里的:before和:after大家看的是不是很眼熟,其实:before里面的内容就是前面border的样式,:after里面的就是前面raindrop的样式。content必须要有,因为在伪元素(before,after)里如果没有设置“content”属性,伪元素是无用的,整个:before和:after里面的配置就都无效了。为了让雨滴显得更清晰,加了filter: brightness(1.2)让雨滴显得更亮一些。
这里面比较奇怪的是@var(),它其实就是css的变量,在css-doodle做了一层包装,作用和css的var()是一样的,我们看下这些变量的定义
1 2 3 4 5 6 7 8 9 10 11 12 | -- size :( 4 + @r( 1 , 8 )); --shadow- size : calc(((@var(--size)* 0.3 ) - 1 )* 1px ); -- mleft :@r( 1 , 100 )px; -- mtop :@r( 1 , 100 ); --mtop 1: (@var(--mtop) - 1 ); --mtopb:calc(@var(--mtop)* 1px ); --mtopa:calc(@var(--mtop 1 )* 1px ); -- height :@r( 15 , 25 )px; -- width :@r( 8 , 20 ); --width 1: (@var(--width) + 5 ); --widthb:calc(@var(--width)* 1px ); --widtha:calc(@var(--width 1 )* 1px ); |
这里有几个坑要说明一下:
1号坑:css-doodle提供了@calc(),但是这里计算还是要用css的calc(),使用@calc()无效。
2号坑:在使用@var做加减法的时候,+-号的两遍要有空格,否则计算无效,切记切记。
3号不是坑:计算好数值后,怎么带上px单位呢,用calc(value*1px)这种方法就可以了,其他的单位也可以用这种方法。
4号说明:为什么要用变量?是因为before和after不在一起,为了让boder和raindrop的margin-left、margin-top、width、height等属性能够保持一致,就需要用变量在before和after外面定义好,传值到里面去。
最终的效果如下:
没动画效果怎么敲打我窗
雨点如果只是这样洒在窗户,那就没有敲打的意思,为了体现敲打,我决定让雨点动起来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | :before { content : '' ; position : absolute ; margin-left : @var(--mleft); margin-top : @var(--mtopb); border-radius: 100% ; box-shadow: 0 0 0 @var(--shadow-size) rgba( 0 , 0 , 0 , 0.6 ); transform: rotateY( 0 ); width : @var(--widthb); height : @var(--height); opacity: 0 ; animation: raindrop-fall 500 ms cubic-bezier( 0.175 , 0.885 , 0.32 , 1.275 ); animation-fill-mode: forwards; animation-delay: @var(--delay); } :after { content : '' ; filter: brightness( 1.2 ); position : absolute ; margin-left : @var(--mleft); margin-top : @var(--mtopa); background- size : 5 vw 5 vh; border-radius: 100% ; background-image : url ( "https://cn.bing.com//th?id=OHR.ParrotsIndia_ZH-CN8386276023_UHD.jpg" ); transform: rotate( 180 deg) rotateY( 0 ); background-position : @r( 1% , 100% ) @r( 1% , 100% ); width : @var(--widtha); height : @var(--height); opacity: 0 ; animation: raindrop-fall 500 ms cubic-bezier( 0.175 , 0.885 , 0.32 , 1.275 ); animation-fill-mode: forwards; animation-delay: @var(--delay); } |
重点是:before和:after里面的最后三行,是用来实现动画效果的。
cubic-bezier()控制动画的速度,使得雨滴落到玻璃窗的效果更逼真
animation-delay 雨点出现的时间随机,同样是为了效果更逼真,逼真的效果真麻烦
再来看看raindrop-fall的@keyframe设置
1 2 3 4 5 6 7 8 9 10 | @keyframes raindrop-fall { 0% { opacity: 0 ; transform: rotate( 180 deg) scale( 2.5 , 2.3 ) rotateY( 0 ); } 100% { opacity: 1 ; transform: rotate( 180 deg) scale( 1 , 1 ) rotateY( 0 ); } } |
总结
以上所述是小编给大家介绍的CSS实现雨滴动画效果的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
相关文章
- CSS3和SVG的结合使用为网页设计带来了创新的动态视觉效果,本文通过一个圆形进度条的动画特效示例,展示了如何利用CSS3的动画功能和SVG的矢量图形能力来创建丰富的用户交互体2024-10-24
- 本文解析了CSS属性box-shadow的用法和应用,属性可以设置一个或多个下拉阴影的框,通过box-shadow属性,可以定义水平阴影的位置、垂直阴影的位置、模糊距离、阴影的大小和颜色2024-10-21
- CSS3的@media查询功能允许我们根据不同的媒体类型和设备特性来应用不同的样式规则,,本文详细探讨了@media查询的定义、语法、使用场景及注意事项,旨在帮助开发者更好地理解2024-10-17
CSS3 新特性 box-shadow 阴影效果、圆角border-radius效果实现
CSS3的border-radius属性可以轻松制作圆角效果,支持一至四个值来分别定义四个角的圆角大小,一个值时所有角圆角相同,两个值时对角线上的角相同,本文给大家介绍CSS3 新特性 b2024-10-17- CSS3动画为网页设计带来了丰富的动态效果,使得页面更加生动和吸引人,然而,有时我们希望动画在结束时保持最终状态,而不是回到初始状态,本文将介绍几种方法来实现这一效果2024-10-15
- 伪元素和伪类都增强了CSS选择器的功能,但它们有明显的区别,伪元素通过::表示,如::before和::after,用于向元素添加或修改内容,伪类则通过:表示,如:hover和:first-child,用于2024-10-15
- 本文介绍了使用CSS3实现各种样式效果的方法,包括文字渐变、圆角、阴影、多重背景等,通过实例代码,展示了如何简洁有效地增强网页视觉效果,无需额外图像或复杂脚本,适合前端2024-09-13
- 在Web开发中,动态滚动播放列表能够提升用户体验,使内容展示更加生动有趣,本文介绍了如何仅使用CSS3实现一个基础的循环播放列表,其中关键技术包括@keyframes规则和animat2024-09-11
- 之前有做过一个需求,安卓端嵌H5页面,实现语音输入并包含输入时动画,跳动的小球,多个小球同时跳动,相对定位需要left不相同,其次每个小球动画开始有时间差,其次就是小2024-08-29
详解CSS3 边框样式(包含border-radius、border-image与box-shadow)
这篇文章主要介绍了CSS3 边框样式(包含border-radius、border-image与box-shadow)的相关知识,本文给大家介绍的非常详细,,需要的朋友可以参考下2024-08-29
最新评论