CSS实现雨滴动画效果的实例代码


Posted in HTML / CSS onOctober 08, 2019

玻璃窗

今天我们要实现的是雨滴效果,不过实现雨滴前,我们先把毛玻璃的效果弄出来,没有玻璃窗,雨都进屋了,还有啥好敲打的。

<div class='window'></div>
.window {
            position: absolute;
            width: 100vw;
            height: 100vh;
            background: url("https://cn.bing.com//th?id=OHR.ParrotsIndia_ZH-CN8386276023_UHD.jpg");
            background-size: cover;
            background-position: 100%;
            filter: blur(10px);
}

 

其实就是给一张图片,做了个模糊化的效果,看起来像毛玻璃的效果

CSS实现雨滴动画效果的实例代码

一滴雨

雨滴的效果就很巧妙了,让我们看下一滴雨完整的效果图

CSS实现雨滴动画效果的实例代码

这滴雨其实分为两个部分,第一部分是底部的阴影部分,其实是个边框来的,代码如下:

.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把阴影拉出来,作为水滴的阴影,边框的最终效果如下:

CSS实现雨滴动画效果的实例代码

然后是水滴的部分

.raindrop {
            filter: brightness(1.2);
            position: absolute;
            margin-left: 90px;
            margin-top: 50px;
            background-size: 5vw 5vh;
            border-radius: 100%;
            background-image: url("https://cn.bing.com//th?id=OHR.ParrotsIndia_ZH-CN8386276023_UHD.jpg");
            transform: rotate(180deg) 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实现雨滴动画效果的实例代码

随机雨滴

雨从来都不是一滴一滴来的,而且也不会很有规律的来,为了让雨滴随机出现在玻璃窗上,css-doodle框架。

<css-doodle use="var(--rule)"></css-doodle>

先创建一个css-doodle的自定义组件

 

--rule: ( :doodle {
     @grid: 10x10/ 100%;
     overflow: visible;
}

打出10*10个grid,这样最多可以出现100滴雨

transform: scale(@rand(.5, .9));

通过transform:scale让雨滴随机变大变小

 

: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: 5vw 5vh;
    border-radius: 100%;
    background-image: url("https://cn.bing.com//th?id=OHR.ParrotsIndia_ZH-CN8386276023_UHD.jpg");
    transform: rotate(180deg) 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()是一样的,我们看下这些变量的定义

 

--size:(4 + @r(1, 8));
--shadow-size: calc(((@var(--size)*0.3) - 1)*1px);
--mleft:@r(1, 100)px;
--mtop:@r(1, 100);
--mtop1:(@var(--mtop) - 1);
--mtopb:calc(@var(--mtop)*1px);
--mtopa:calc(@var(--mtop1)*1px);
--height:@r(15, 25)px;
--width:@r(8, 20);
--width1:(@var(--width) + 5);
--widthb:calc(@var(--width)*1px);
--widtha:calc(@var(--width1)*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外面定义好,传值到里面去。

最终的效果如下:

CSS实现雨滴动画效果的实例代码
 

没动画效果怎么敲打我窗

雨点如果只是这样洒在窗户,那就没有敲打的意思,为了体现敲打,我决定让雨点动起来。

 

: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 500ms 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: 5vw 5vh;
    border-radius: 100%;
    background-image: url("https://cn.bing.com//th?id=OHR.ParrotsIndia_ZH-CN8386276023_UHD.jpg");
    transform: rotate(180deg) rotateY(0);
    background-position: @r(1%, 100%) @r(1%, 100%);
    width: @var(--widtha);
    height: @var(--height);
    opacity: 0;
    animation: raindrop-fall 500ms 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设置

 

@keyframes raindrop-fall {
    0% {
        opacity: 0;
        transform: rotate(180deg) scale(2.5, 2.3) rotateY(0);
    }
    100% {
        opacity: 1;
        transform: rotate(180deg) scale(1, 1) rotateY(0);
    }
}

总结

以上所述是小编给大家介绍的CSS实现雨滴动画效果的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

HTML / CSS 相关文章推荐
CSS3中Transform动画属性用法详解
Jul 04 HTML / CSS
HTML5和CSS3让网页设计提升到下一个高度
Aug 14 HTML / CSS
一款基于css3的动画按钮代码教程
Nov 23 HTML / CSS
CSS3实现swap交换动画
Jan 19 HTML / CSS
HTML5 placeholder属性详解
Jun 22 HTML / CSS
html5+css3进度条倒计时动画特效代码【推荐】
Mar 08 HTML / CSS
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
Apr 26 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
Apr 09 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
Jul 18 HTML / CSS
canvas绘制太极图的实现示例
Apr 29 HTML / CSS
HTML速写之Emmet语法规则的实现
Apr 07 HTML / CSS
HTML中的表单元素介绍
Feb 28 HTML / CSS
CSS3 @media的基本用法总结
Sep 10 #HTML / CSS
css3 伪类选择器快速复习小结
Sep 10 #HTML / CSS
css3进阶之less实现星空动画的示例代码
Sep 10 #HTML / CSS
CSS3 animation ? steps 函数详解
Aug 30 #HTML / CSS
移动端适配 使px自动转换rem
Aug 26 #HTML / CSS
CSS3 毛玻璃效果
Aug 14 #HTML / CSS
详解css position 5种不同的值的用法
Jul 30 #HTML / CSS
You might like
php读取30天之内的根据算法排序的代码
2008/04/06 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
请离开include_once和require_once
2013/07/18 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
JQuery 文本框使用小结
2010/05/22 Javascript
Jquery实现控件的隐藏和显示实例
2014/02/08 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
vue2 前端搜索实现示例
2018/02/26 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
微信小程序实现带放大效果的轮播图
2020/05/26 Javascript
python自动化测试之连接几组测试包实例
2014/09/28 Python
Python之str操作方法(详解)
2017/06/19 Python
Python使用MD5加密算法对字符串进行加密操作示例
2018/03/30 Python
python 通过 socket 发送文件的实例代码
2018/08/14 Python
浅析python的优势和不足之处
2018/11/20 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
生物技术毕业生自荐信
2013/10/23 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
公司保密承诺书
2014/03/27 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS