zoukankan      html  css  js  c++  java
  • CSS制作简单loading动画

      曾经以为,loading的制作需要一些比较高深的web动画技术,后来发现大多数loading都可以用“障眼法”做出来。比如一个旋转的圆圈,并不都是将gif图放进去,有些就是画个静止图像,然后让它旋转就完了。gif图也可以,但是加载时间比较长。

      CSS的animation可以做出大多数的loading,比如:

     

    loading1:

    1、HTML:

    1 <div id="ddr">
    2     <div class="ddr ddr1"></div>
    3     <div class="ddr ddr2"></div>
    4     <div class="ddr ddr3"></div>
    5     <div class="ddr ddr4"></div>
    6     <div class="ddr ddr5"></div>
    7 </div>

    2、CSS:

     1 #ddr{
     2     margin: 0 auto;
     3     width: 70px;
     4     height: 120px;
     5 }
     6 .ddr{
     7     width: 10px;
     8     height: 120px;
     9     float: left;
    10     margin: 2px;
    11     background-color: #00ff00;
    12     animation: loading 1s infinite ease-in-out;/*animation:动画名称 持续时间 动画速度曲线 延迟 执行多少次 是否正反方向轮流播放*/
    13 }
    14 .ddr2{
    15     animation-delay: -0.9s;/*定义开始执行的地方,负号表示直接从第900ms开始执行*/
    16 }
    17 .ddr3{
    18     animation-delay: -0.8s;
    19 }
    20 .ddr4{
    21     animation-delay: -0.7s;
    22 }
    23 .ddr5{
    24     animation-delay: -0.6s;
    25 }
    26 @keyframes loading {
    27     0%,40%,100%{ /*定义每帧的动作*/
    28         -webkit-transform: scaleY(0.5);
    29     }
    30     20%{
    31         -webkit-transform: scaleY(1);
    32     }
    33 }

    loading2:

    1、HTML:

    1 <div id="circle"></div>

    2、CSS:

     1 #circle{
     2     margin: 20px auto;
     3     width: 100px;
     4     height: 100px;
     5     border: 5px white solid;
     6     border-left-color: #ff5500;
     7     border-right-color:#0c80fe;
     8     border-radius: 100%;
     9     animation: loading1 1s infinite linear;
    10 }
    11 @keyframes loading1{
    12     from{transform: rotate(0deg)}to{transform: rotate(360deg)}
    13 }

    loading3:

    1、HTML:

    1 <div id="loader3">
    2     <div id="loader3-inner"></div>
    3 </div>

    2、CSS:

     1 #loader3{
     2     box-sizing: border-box;
     3     position: relative;
     4     margin-left: 48%;
     5     transform: rotate(180deg);
     6     width: 50px;
     7     height: 50px;
     8     border: 10px groove rgb(170, 18, 201);
     9     border-radius: 50%;
    10     animation: loader-3 1s ease-out alternate infinite;/* alternate表示则动画会在奇数次数(1、3、5 等等)正常播放,而在偶数次数(2、4、6 等等)反向播放 */
    11 }
    12 #loader3-inner{
    13     box-sizing: border-box;
    14     width: 100%;
    15     height: 100%;
    16     border: 0 inset rgb(170, 18, 201);
    17     border-radius: 50%;
    18     animation: border-zoom 1s ease-out alternate infinite;
    19 }
    20 @keyframes loader-3 {
    21     0%{
    22         transform: rotate(0deg);
    23     }
    24     100%{
    25         transform: rotate(-360deg);
    26     }
    27 }
    28 @keyframes border-zoom {
    29     0%{
    30         border-width: 0px;
    31     }
    32     100%{
    33         border-width: 10px;
    34     }
    35 }

    loading4:

    1、HTML:

    1 <div id="loading4">
    2     <div id="loader4" class="heart"></div>
    3 </div>

    2、CSS:

     1 #loading4{
     2     width: 100%;
     3     height: 100px;
     4 }
     5 #loader4{
     6     position: relative;
     7     margin-left: calc(50% - 25px);
     8     width: 50px;
     9     height: 50px;
    10     animation: loader-4 1s ease-in-out alternate infinite;
    11 }
    12 .heart:before{
    13     position: absolute;
    14     left: 11px;
    15     content: "";
    16     width: 50px;
    17     height: 80px;
    18     transform: rotate(45deg);
    19     background-color: rgb(230, 6, 6);
    20     border-radius: 50px 50px 0 0;
    21 }
    22 .heart:after{
    23     position: absolute;
    24     right: 11px;
    25     content: "";
    26     width: 50px;
    27     height: 80px;
    28     background-color: rgb(230, 6, 6);
    29     transform: rotate(-45deg);
    30     border-radius: 50px 50px 0 0;
    31 }
    32 @keyframes loader-4 {
    33     0%{
    34         transform: scale(0.2);
    35         opacity: 0.5;
    36     }
    37     100%{
    38         transform: scale(1);
    39         opacity: 1;
    40     }
    41 }

    环形进度条:

    0、原理:

     (1)、

    如图,先画一个正方形,这个正方形就是环形loading的轨道(现在还不是),再将一个圆放在上面,充当遮蔽物。

    (2)、

    CSS3有个clip属性,可以裁剪图像,将上面的圆裁为一半,假如这个圆的右半部分一直看不见,旋转左边这个半圆,会出现怎样的效果呢?

    (3)、

    如图,就是这种效果,这时候再加一个遮罩,就形成了下面这种效果:

    (4)、

    再将最下面的正方形变成圆形(变成真正的轨道),旋转橙色部分的圆环,底部青色的就会露出来,就形成了进度条的效果

    (5)、

    这是左边的一半,将右边的一半补齐:

    (6)、

    中间白色部分是mask,加上相应的文字,调整颜色就ok啦!

    (7)、

    1、HTML:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 
     4 <head>
     5   <meta charset="UTF-8">
     6   <meta name="viewport" content="width=device-width, initial-scale=1.0">
     7   <meta http-equiv="X-UA-Compatible" content="ie=edge">
     8   <title>Document</title>
     9   <link rel="stylesheet" href="progress.css">
    10 </head>
    11 
    12 <body>
    13   <div class="circle">
    14     <div class="preLeft">
    15       <div class="left"></div>
    16     </div>
    17     <div class="preRight">
    18       <div class="right"></div>
    19     </div>
    20   </div>
    21   <div class="mask">
    22     <span class="progress">0</span>%
    23   </div>
    24   <script src="progress.js"></script>
    25 </body>
    26 
    27 </html>

    2、CSS:

     1 *{
     2   margin: 0;
     3   padding: 0;
     4 }
     5 .circle {
     6   width: 200px;
     7   height: 200px;
     8   border-radius: 50%;
     9   box-shadow: 0 0 7px 0px inset;
    10   background:linear-gradient(#9ED110, #50B517, #179067, #476EAF, #9f49ac, #CC42A2, #FF3BA7, #FF5800, #FF8100, #FEAC00, #FFCC00, #EDE604);
    11   filter: blur(8px);
    12   transform: scale(1.1);
    13   -webkit-mask: radial-gradient(black 30px, #0000 90px);
    14 }
    15 .preLeft{
    16   position: absolute;
    17   top: 0;
    18   left: 0;
    19   width: 200px;
    20   height: 200px;
    21   clip: rect(0, 100px, auto, 0);
    22 }
    23 .left{
    24   position: absolute;
    25   top: 0;
    26   left: 0;
    27   width: 200px;
    28   height: 200px;
    29   border-radius: 50%;
    30   box-shadow: 0 0 3px 0px inset;
    31   background: #fff;
    32   transform: rotate(0deg);
    33   clip: rect(0, 100px, auto, 0);
    34 }
    35 .preRight{
    36   position: absolute;
    37   top: 0;
    38   left: 0;
    39   width: 200px;
    40   height: 200px;
    41   clip: rect(0, auto, auto, 100px);
    42 }
    43 .right {
    44   position: absolute;
    45   top: 0;
    46   left: 0;
    47   width: 200px;
    48   height: 200px;
    49   border-radius: 50%;
    50   box-shadow: 0 0 3px 0px inset;
    51   background:#fff;
    52   transform: rotate(0deg);
    53   clip: rect(0, auto, auto, 100px);
    54 }
    55 .mask {
    56   width: 150px;
    57   height: 150px;
    58   position: absolute;
    59   left: 25px;
    60   top: 25px;
    61   border-radius: 50%;
    62   /* box-shadow: 0 0 5px 0px; */
    63   background: #FFF; 
    64   text-align: center;
    65   line-height: 150px;
    66 }

    3、JS:

     1 function init() {
     2   let left = document.getElementsByClassName('left')[0];
     3   let right = document.getElementsByClassName('right')[0];
     4   let progress = document.getElementsByClassName('progress')[0];
     5   let value = 0;
     6   let timer = setInterval(() => {
     7     if (progress.innerHTML < 100) {
     8       progress.innerHTML = value++;
     9       if (value <= 50) {
    10         right.style.transform = 'rotate(' + (value * 3.6) + 'deg)';
    11       } else if (value <= 100) {
    12         left.style.transform = 'rotate(' + ((value - 50) * 3.6) + 'deg)';
    13       }
    14     } else {
    15       clearInterval(timer);
    16     }
    17   }, 100);
    18 }
    19 window.onload = function () {
    20   init();
    21 };

    -

    逢年过节,百度或者谷歌都会在首页播放一段动画,比如元宵节:

    这个动画不仅仅是gif图,有时候是一张长长的包含所有帧的图片:

    仿照animation一帧一桢的思路,可以将这张图片做成动画:

     1 #picHolder{
     2 /* 图片样式 */
     3     position: absolute;
     4     top: 17%;
     5     left: 50%;
     6     width: 270px;
     7     height: 129px;
     8     margin-left:-135px;
     9     background-image: url("../../../Library_image/tangyuan.png");
    10     background-repeat: no-repeat;
    11     background-position-x: 0;
    12     cursor: pointer; 
    13 }
     1 function animation () {
     2 /* 定时移动图片,使观众看到不同的帧 */
     3   var po = 0
     4   var i = 0
     5   var holder = document.getElementById('picHolder')
     6   setInterval(function () {
     7     po += -270
     8     i++
     9     holder.style.backgroundPositionX = po + 'px'
    10     if (i >= 31) {
    11       i = 0
    12       po = 270
    13     }
    14   }, 100)
    15 }
    16 window.onload = function () {
    17   animation()
    18 }

    不过有时候他们又会放上一张gif图,不懂他们的套路

  • 相关阅读:
    分页公共方法
    关于锁表查询的部分SQL
    将Excel中的数据绑定到DataGrid控件中
    CMMI相关信息
    图片在DataGrid中的用法
    关于standard Button和html Button之disabled属性的比较
    VS2003中链接数据库方法
    .NET多语言版本系统功能实现
    Read and Write 单一文件
    为继承masterpage的页面设置defaultbutton和defaultfocus
  • 原文地址:https://www.cnblogs.com/wz71014q/p/8862127.html
Copyright © 2011-2022 走看看