CSS:模拟下雪效果动画制作教程

下雪效果只是一类效果的名称,可以是红包雨等一些自由落体的运动效果,本文就是用纯css模拟下雪的效果,更多效果大家可以自行发挥。

1.前言

由于公司产品的活动,需要模拟类似下雪的效果。浏览器实现动画无非css3canvas(还有gif),对比下css3canvas的优缺点:

  1. 动画自由度:canvas胜;
  2. 复杂度:canvas胜;
  3. 兼容性:canvas胜;
  4. 性能:css3胜(requestAnimationFrame和硬件加速)。

由于对于性能有一定的要求,canvas对比css3会有更多的计算量导致性能可能不太好,所以选用css3模拟下雪效果(ps:能用css解决的问题就不用javascript解决哈哈)。

对web前端这门技术感兴趣的小伙伴可以加入到我们的学习圈来,正因为我不是211,985,只是个普通的本科生,英语不是特别好,数学不是特别好。所以我选择了前端。工作第六个年头了,我庆幸自己选择了这条路。767-273-102 秋裙。在鹅厂做过,跟着创业头子混过。想把自己的技术分享给大家,如果你还在迷茫,也希望能进我一些绵薄之力,帮助到你。都是一群有梦想的人,我们可能在不同的城市,但我们会一起结伴同行前端前端前端

2.原理

本文所采用的是css3animation。为dom元素添加animation属性就可以模拟动画,例如w3school的例子:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>animation</title>
  <style>
    .animation{
      width:100px;
      height:100px;
      background:red;
      position:relative;
      animation:mymove 5s infinite;
      -webkit-animation:mymove 5s infinite;
    }
    @keyframes mymove{
      from {
        left:0px;
      }
      to {
        left:200px;
      }
    }
  </style>
</head>
<body>
  <div class="animation"></div>
</body>
</html>

当然这谁都会,但有个问题是,下雪并不是机械的下落,而是有快有慢、摆动幅度、时间不定,这里的重点是需要构造随机性,理性分析下。

  1. 在浏览器中下雪的起始点随机;
  2. 下雪的速度随机;
  3. 下雪从开始到落到地面的时间随机(延时随机和整个下雪过程的时间随机);
  4. 下雪过程中摇摆随机。

我们可以在css中找到这几点随机性的对应属性:

  1. 起始点:position的左右方位(动画我们一般采用定位,因为可以减少不必要的重排和重绘);
  2. 速度:animation-timing-function(提供了丰富的速度属性);
  3. 时间:animation-durationanimation-delay
  4. 摇摆:transform: translateX()(在水平方向上的位移)。

可能有人会问,这几个属性并不是随机的呀,并不像Math.random随机函数那样。我们换个思考方向,本文所说的随机是随机雪,并不是随机雪的属性。每个雪的下落时间、下落速度、摆动幅度是固定的,雪与雪之间的下落时间、下落速度、摆动幅度是不同,那么就达到效果了。

意识到这点,就剩下最后一个问题,怎样给每个雪不同的下落时间、下落速度、摆动幅度呢?这里我们使用真正的随机函数Math.random,利用data自定义属性配合Math.random和css的属性匹配规则,就可以确定动画效果了。

3.构造雪形状

3.1 一条线性渐变

.linear{
  width: 100px;
  height: 100px;
  background: linear-gradient(0, green 40%, red 40%, red 60%, green 60%);
}

3.2 多条线性渐变画雪花

.linear{
  width: 100px;
  height: 100px;
  border-radius: 50%;
  background-image: linear-gradient(0, rgba(255,255,255,0) 40%, #fff 40%, #fff 60%, rgba(255,255,255,0) 60%),
    linear-gradient(45deg, rgba(255,255,255,0) 43%, #fff 43%, #fff 57%, rgba(255,255,255,0) 57%),
    linear-gradient(90deg, rgba(255,255,255,0) 40%, #fff 40%, #fff 60%, rgba(255,255,255,0) 60%),
    linear-gradient(135deg, rgba(255,255,255,0) 43%, #fff 43%, #fff 57%, rgba(255,255,255,0) 57%);
}

4.构造下雪动画

我用sass写的css来构造动画,其实语言无所谓,重在原理。

4.1 起始点

@for $i from 1 through 100 {
  .animation[data-animation-position=‘#{$i}‘] {
    left: #{$i}vw;
  }
}

这里运用sass的循环函数来创造1到100的匹配class名为animation和属性选择器为[data-animation-position=1~100vw]的值,例如我们想要元素的left50vw,就直接添加classdata-animation-position=50vw。这里有两点需要说明:

  1. 范围1~100vw:注意单位是vw,我们想要雪花的起始点出现在水平方向的任意位置,而vw是把屏幕等分为100份,100vw就是满屏;
  2. 为什么要把1~100都循环出来:只有这样才能匹配到范围内我们需要的值。

4.2 速度

$timing: (
  linear: linear,
  ease: ease,
  ease-in: ease-in,
  ease-out: ease-out,
  ease-in-out: ease-in-out
);

@each $key, $value in $timing {
  .animation[data-animation-timing=‘#{$key}‘] {
    transition-timing-function: $value;
  }
}

4.3 时间

时间包含动画运动时间和延时时间。

@for $i from 1 through 4 {
  .animation[data-animation-delay=‘#{$i}‘] {
    animation-delay: #{$i}s;
  }
}
@for $i from 4 through 8 {
  .animation[data-animation-duration=‘#{$i}‘] {
    animation-duration: #{$i}s;
  }
}

4.4 摇摆

下雪由两个动画组成,分别是下落fall和摇摆swing,下落的动画是固定的,只有摇摆需要随机,所以我自定义了属性匹配规则,就可以随机摇摆了。

@for $i from 1 through 4 {
  .animation[data-animation-name=‘#{$i}‘] {
    animation-name: fall, swing#{$i};
  }
}
@for $i from 1 through 4 {
  @keyframes swing#{$i}{
    25% {
      transform: translateX(-#{$i * 10}px);
    }
    50% {
      transform: translateX(#{$i * 10}px);
    }
    75%{
      transform: translateX(-#{$i * 10}px);
    }
    100%{
      transform: translateX(#{$i * 10}px);
    }
  }
}

5.随机性

这里用react来演示代码,还是那句话只要理解了原理,语言其实并不太重要。

5.1 雪花元素

<div className=‘page‘>
  {
    Array(10).fill().map((v, i) => (
      <span
        key={i}
        className=‘animation span‘
        data-animation-position={this.position()}
        data-animation-timing={this.timing()}
        data-animation-delay={this.delay()}
        data-animation-duration={this.duration()}
        data-animation-name={this.name()}
      />
    ))
  }
</div>

我们的雪花元素包含几下几个属性值:

  1. data-animation-position:起始位;
  2. data-animation-timing:下雪速度;
  3. data-animation-delay:延时;
  4. data-animation-duration:下雪总时间;
  5. data-animation-name:下落动画和摇摆动画。

5.1 随机范围函数

random(min, max){
  return Math.floor(Math.random() * (max - min + 1) + min)
}

5.2 属性随机赋值

position(){
  return this.random(1, 100)
}
delay(){
  return this.random(1, 4)
}
duration(){
  return this.random(4, 8)
}
name(){
  return this.random(1, 4)
}
timing(){
  return [‘linear‘, ‘ease‘, ‘ease-in‘, ‘ease-out‘, ‘ease-in-out‘][this.random(0, 4)]
}

原文地址:https://blog.51cto.com/14458119/2429514

时间: 2024-10-06 06:08:55

CSS:模拟下雪效果动画制作教程的相关文章

强大的CSS:模拟下雪效果动画制作教程

下雪效果只是一类效果的名称,可以是红包雨等一些自由落体的运动效果,本文就是用纯css模拟下雪的效果,更多效果大家可以自行发挥. 1.前言 由于公司产品的活动,需要模拟类似下雪的效果.浏览器实现动画无非css3和canvas(还有gif),对比下css3和canvas的优缺点: 动画自由度:canvas胜: 复杂度:canvas胜: 兼容性:canvas胜: 性能:css3胜(requestAnimationFrame和硬件加速). 由于对于性能有一定的要求,canvas对比css3会有更多的计算

web前端入门到实战:css3循环,模拟拼多多动画效果

模拟拼多多动画效果,最终效果图如下: 我们看一下实现过程. 主框架是vue开发,做成了一个动画组件,因为涉及到多个页面引用,最主要的实现是css3语法实现过程,并且要做到循环播放. 左边出来动画时间是0.5秒,停留3秒往上走,然后动画时间0.5秒,停留3秒后然后消失,消失动画时间0.5秒,总共的时间消耗是7.5秒.可以得到以下计算比例 如果大家对编程,web前端感兴趣,想要学习,打算深入了解这个行业的朋友,可以加下我们的前端学习扣qun : 784783012 ,不论你是学生还是想转行的朋友,我

常用CSS动画制作技巧及踩坑总结

1. CSS 3d透视 perspective 属性都是加给父元素的 transform-style:preserve-3d; 这个属性必须与transform一同使用,它使被转换的子元素保留其 3D 转换(即设置给父元素) <!--这里是一个简单的透视的例子--> <div class="door-border"> <div class="door">我是门</div> </div> .door-bord

React 系列教程 1:实现 Animate.css 官网效果

前言 这是 React 系列教程的第一篇,我们将用 React 实现 Animate.css 官网的效果.对于 Animate.css 官网效果是一个非常简单的例子,原代码使用 jQuery 编写,就是添加类与删除类的操作.这对于学习 React 来说是一个非常简易的例子,但是我并不会在教程中介绍相关的前置知识,比如 JSX.ES6 等,对于小白来说可能还会有一些困惑的地方,所以还要了解一下 React 相关的基础知识.虽然 React 有很多值得深究的知识,但这个系列教程并不会涉及高大深的内容

一款非常棒的纯CSS3 3D菜单演示及制作教程

原文:一款非常棒的纯CSS3 3D菜单演示及制作教程 这段时间比较忙,很久没在这里分享一些漂亮的HTML5和CSS3资源了,今天起的早,看到一款很不错的CSS3 3D菜单,觉得非常上眼,就将它分享给大家,顺便来分析一下实现的源码.下面是效果图: 看了效果图是不是觉得它是一副麻将,对,第一眼我也认为是用CSS3写的麻将特效,结果我错了,它只是长得比较像而已. 另外,你也可以在这里直接查看菜单的DEMO演示. 接下来再分析一下实现这款3D菜单的源代码. 代码主要由HTML和CSS3组成,应该说还是比

11个优秀的HTML5 &amp; CSS3下拉菜单制作教程

下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用HTML5和CSS3可以更容易创造视觉上充满吸引力的下拉菜单. 1.Stunning Menu in CSS3 效果很精美CSS3菜单,可以让给你的网站提升一个层次.制作教程非常详细. 在线演示 源码下载 2.Click action Multi-level CSS3 Dropdown Menu 这是一个点击弹出的下拉菜单,传统的下拉菜

利用target的特性,可以实现纯css的tab效果切换

基础知识: :target起作用的是href连接到的位置 如 <a href="#tab1">tab1</a> <div id="tab1" class="tab">This is a tab1</div> :target{ color:red; } 但点击a标签的时候,连接到id是tab1的div,对这个div起作用color:red; 如: <a href="#tab"

纯CSS3彩色边线3D立体按钮制作教程

今天我们来分享一款利用纯CSS3实现的3D按钮,这款按钮的一个特点是有彩色的边线,这让整个按钮显得比较多姿多彩,没那么枯燥无趣.本文不仅可以让大家看到演示效果,而且我们把制作教程也分享出来,首先来看看效果图: 我们也可以在这里看到这些按钮的DEMO演示. 接下来就来分享一下制作教程以及源代码,按钮的源代码主要由HTML和CSS两部分代码组成,先来看看HTML代码: <button class="blue"> <div class="wrapper"

HTML5重力感应小球冲撞动画实现教程

今天我们来分享一款很酷的HTML5重力感应动画教程,这款动画可以让你甩动页面中的小球,小球的大小都不同,并且鼠标点击空白区域时又可以生成一定数量的小球.当我们甩动小球时,各个小球之间就会发生互相碰撞的效果,并且在运动过程中模拟了重力感应的物理效果.你可以在DEMO演示中来尝试一下. 你也可以在这里查看在线演示 接下来我们来分析一下这款超酷的HTML5重力动画实现的思路及源码,主要由HTML代码和Javascript代码组成. HTML代码: <div id="canvas">