zoukankan      html  css  js  c++  java
  • 手把手教你写css3通用动画

    之前接了几个微信里的项目,类似电子邀请函,什么分析报告这样的项目, 对css3动画要求十分高,每个页面客户几乎都有天马行空的想法,或者说设计师有这样的想法。
    众所周知css3里的keyframe写好了就不能赋值复用的,  所以怎样能把keyframe通用起来就异常关键了。
    好,下面先上几个之前写的项目:(今天sae挂了 ,只好用别人的生产地址),手机打开或者chrome模拟看哦!
    http://www.51qianlima.cn/bim/

    http://wx.mgcc.com.cn/fotile/invite/index.html?leader=2&from=timeline&isappinstalled=0

    仔细看你就发现页面的动画有渐显,有飞入,而且可能2者或多者同时存在。

    那么问题来了:是不是每个页面的keyframe都得单独写?

    在说这个问题之前,你可能得掌握几种常用的水平居中,垂直居中,中心居中;水平偏移,垂直偏移的写法(以下demo效果请chrome模拟手机端打开,-webkit内核哦)。

    demo1:postion结合margin:auto 

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,minimal-ui">
        <title></title>
        <style>
            * {
                padding:0;
                margin:0;
            }
            html,body {
                height:100%;
            }
            .demo {
                width:100px;
                height: 100px;
                text-align: center;
                line-height: 100px;
                background:lightblue;
            }
            .demo-1 {
                position: absolute;
                margin:0 auto;
                left:0;
                right:0;
            }
            .demo-2 {
                position: absolute;
                margin:auto 0;
                top:0;
                bottom:0;
            }
            .demo-3 {
                position: absolute;
                margin:auto;
                top:0;
                bottom:0;
                left:0;
                right:0;
            }
        </style>
    </head>
    <body>
        <div class="demo demo-1">水平居中</div>
        <div class="demo demo-2">垂直居中</div>
        <div class="demo demo-3">中心居中</div>
    </body>
    </html>

    demo2:postion和translate 一起使用达到水平、垂直居中

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,minimal-ui">
        <title></title>
        <style>
            * {
                padding:0;
                margin:0;
            }
            html,body {
                height:100%;
            }
            .demo {
                width:100px;
                height: 100px;
                text-align: center;
                line-height: 100px;
                background:peachpuff;
            }
            .demo-1 {
                position: absolute;
                left:50%;
                -webkit-transform:translateX(-50%);
            }
            .demo-2 {
                position: absolute;
                top:50%;
                -webkit-transform:translateY(-50%);
            }
            .demo-3 {
                position: absolute;
                top:50%;
                left:50%;
                -webkit-transform:translateX(-50%) translateY(-50%);
            }
        </style>
    </head>
    <body>
    <div class="demo demo-1">水平居中</div>
    <div class="demo demo-2">垂直居中</div>
    <div class="demo demo-3">中心居中</div>
    </body>
    </html>

    好  掌握了以上2个demo的写法和区别后,正在的项目上 ,往往用到的是根据水平中心点,或者垂直中心点偏移的写法,因为手机屏幕大小不一,所以这个写法异常常用。

    demo3:中心点偏移

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,minimal-ui">
        <title></title>
        <style>
            * {
                padding:0;
                margin:0;
            }
            html,body {
                height:100%;
            }
            .demo {
                width:100px;
                height: 100px;
                text-align: center;
                background:lightblue;
            }
            .demo-1 {
                position: absolute;
                margin: 0 auto;
                left: -88px;
                right: 0;
            }
            .demo-2 {
                position: absolute;
                margin: auto 0;
                top: -30px;
                bottom: 0;
            }
    
            body:before {
                content: '';
                width: 100%;
                border-bottom: 2px dotted blue;
                position: absolute;
                top: 50%;
                -webkit-transform: translateY(-2px);
            }
    
            body:after {
                content: '';
                height: 100%;
                border-left: 2px dotted blue;
                position: absolute;
                left: 50%;
                -webkit-transform: translateX(2px);
            }
    
        </style>
    </head>
    <body>
    
    <div class="demo demo-1">水平 距离偏移</div>
    <div class="demo demo-2">垂直 距离偏移</div>
    
    </body>
    </html>

    行 掌握后接下来可以为写通用动画作铺垫了(主要是飞入效果)
    如果单纯渐显的话,咱们只需要控制opacity 就可以达到了:

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,minimal-ui">
        <title></title>
        <style>
            * {
                padding:0;
                margin:0;
            }
            html,body {
                height:100%;
            }
            .demo {
                width:100px;
                height: 100px;
                text-align: center;
                line-height: 100px;
                background:lightblue;
                opacity: 0;
            }
            .demo-1 {
                position: absolute;
                margin:0 auto;
                left:0;
                right:0;
                -webkit-animation:.8s ease opacity_kf 0s forwards;
            }
            .demo-2 {
                position: absolute;
                margin:auto 0;
                top:0;
                bottom:0;
                -webkit-animation:.8s ease opacity_kf .8s forwards;
            }
            .demo-3 {
                position: absolute;
                margin:auto;
                top:0;
                bottom:0;
                left:0;
                right:0;
                -webkit-animation:.8s ease opacity_kf 1.6s forwards;
            }
    
            @-webkit-keyframes opacity_kf {
                0% {
                    opacity: 0;
                }
                100% {
                    opacity: 1;
                }
             }
        </style>
    </head>
    <body>
    <div class="demo demo-1">水平居中</div>
    <div class="demo demo-2">垂直居中</div>
    <div class="demo demo-3">中心居中</div>
    </body>
    </html>

    扯了这么多 ,主角来了,就是飞入也分2种写法,一种就是每个飞入效果是一个100%;height:100%;的层,然后操作是整个层translate,XY;但是这样写有一个很不方便就是审查元素的时候,放大镜只能定位到一个层上(多个飞入动画,别的层就给盖住了)

    demo如下:

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,minimal-ui">
        <title></title>
        <style>
            * {
                padding:0;
                margin:0;
            }
            html,body {
                height:100%;
            }
            .demo {
                width:100px;
                height: 100px;
                text-align: center;
                line-height: 100px;
                background:lightblue;
            }
            .demo-1 {
                position: absolute;
                margin:0 auto;
                left:0;
                right:0;
            }
            .demo-2 {
                position: absolute;
                margin:auto 0;
                top:0;
                bottom:0;
    
            }
            .demo-3 {
                position: absolute;
                margin:auto;
                top:0;
                bottom:0;
                left:0;
                right:0;
            }
    
            @-webkit-keyframes translate_kf {
                0% {
                    -webkit-transform:translateX(100%);
                }
                100% {
                    -webkit-transform:translateX(0);
                }
            }
    
            .demo-1-ani {
                -webkit-animation:.8s ease translate_kf 0s forwards;
            }
            .demo-2-ani {
                -webkit-animation:.8s ease translate_kf .8s forwards;
            }
            .demo-3-ani {
                -webkit-animation:.8s ease translate_kf 1.6s forwards;
            }
    
            .translate-wrap {
                width:100%;
                height:100%;
                -webkit-transform:translateX(100%);
                position:absolute;
            }
        </style>
    </head>
    <body>
        <div class="translate-wrap demo-1-ani">
            <div class="demo demo-1">水平居中</div>
        </div>
        <div class="translate-wrap demo-2-ani">
            <div class="demo demo-2">垂直居中</div>
        </div>
        <div class="translate-wrap demo-3-ani">
            <div class="demo demo-3">中心居中</div>
        </div>
    
    </body>
    </html>


    但是如果换一个写法,就是translate的包裹器里面的节点top和left都写了定值,那么外面动画的包裹器其实是不占文档流的

    然后我们只需要操作这个不占文档流的容器就可以了

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,minimal-ui">
        <title></title>
        <style>
            * {
                padding:0;
                margin:0;
            }
            html,body {
                height:100%;
            }
            .demo {
                width:100px;
                height: 100px;
                text-align: center;
                line-height: 100px;
                background:lightblue;
            }
            .demo-1 {
                position: absolute;
                left:0;
                right:0;
            }
            .demo-2 {
                position: absolute;
                top:150px;
    
            }
            .demo-3 {
                position: absolute;
                top:300px;
                left:100px;
            }
    
            @-webkit-keyframes translate_kf {
                0% {
                    -webkit-transform:translateX(100%);
                }
                100% {
                    -webkit-transform:translateX(0);
                }
            }
    
            .demo-1-ani {
                -webkit-animation:.8s ease translate_kf 0s forwards;
            }
            .demo-2-ani {
                -webkit-animation:.8s ease translate_kf .8s forwards;
            }
            .demo-3-ani {
                -webkit-animation:.8s ease translate_kf 1.6s forwards;
            }
    
            .translate-wrap {
                width:100%;
                -webkit-transform:translateX(100%);
                position:absolute;
            }
        </style>
    </head>
    <body>
        <div class="translate-wrap demo-1-ani">
            <div class="demo demo-1">水平居中</div>
        </div>
        <div class="translate-wrap demo-2-ani">
            <div class="demo demo-2">垂直居中</div>
        </div>
        <div class="translate-wrap demo-3-ani">
            <div class="demo demo-3">中心居中</div>
        </div>
    
    </body>
    </html>

    最后提一点  如果同时用到渐显和飞入,只需要设置好几个间隔一致的class就能很简单的混合使用了,例如有10个控制渐显的动画,和5个控制飞入的动画

    .word_1 {
        opacity: 0;
        -webkit-animation:.8s ease word_1_kf .5s forwards;
    }
    .word_2 {
        opacity: 0;
        -webkit-animation:.8s ease word_1_kf 1.3s forwards;
    }
    .word_3 {
        opacity: 0;
        -webkit-animation:.8s ease word_1_kf 2.1s forwards;
    }
    .word_4 {
        opacity: 0;
        -webkit-animation:.8s ease word_1_kf 2.9s forwards;
    }
    .word_5 {
        opacity: 0;
        -webkit-animation:.8s ease word_1_kf 3.7s forwards;
    }
    .word_6 {
        opacity: 0;
        -webkit-animation:.8s ease word_1_kf 4.5s forwards;
    }
    .word_7 {
        opacity: 0;
        -webkit-animation:.8s ease word_1_kf 5.3s forwards;
    }
    .word_8 {
        opacity: 0;
        -webkit-animation:.8s ease word_1_kf 6.1s forwards;
    }
    .word_9 {
        opacity: 0;
        -webkit-animation:.8s ease word_1_kf 6.9s forwards;
    }
    .word_10 {
        opacity: 0;
        -webkit-animation:.8s ease word_1_kf 7.7s forwards;
    }
    
    /********************** 左边动画 start  ********************************/
    .translateX_animation_left_1 {
        -webkit-transform: translateX(-100%);
        -webkit-animation: .8s ease translateX_1_left_kf forwards .5s;
    }
    .translateX_animation_left_2 {
        -webkit-transform: translateX(-100%);
        -webkit-animation: .8s ease translateX_1_left_kf forwards 1.3s;
    }
    .translateX_animation_left_3 {
        -webkit-transform: translateX(-100%);
        -webkit-animation: .8s ease translateX_1_left_kf forwards 2.1s;
    }
    @-webkit-keyframes translateX_1_left_kf {
        0% {
            -webkit-transform: translateX(-100%);
        }
        100% {
            -webkit-transform: translateX(0);
        }
    }
    /********************** 左边动画 end  ********************************/
    /********************** 右边动画 start  ********************************/
    .translateX_animation_right_1 {
        -webkit-transform: translateX(-100%);
        -webkit-animation: .8s ease translateX_1_right_kf .5 forwards;
    }
    .translateX_animation_right_2 {
        -webkit-transform: translateX(100%);
        -webkit-animation: .8s ease translateX_1_right_kf forwards 1.3s;
    }
    
    .translateX_animation_right_3 {
        -webkit-transform: translateX(100%);
        -webkit-animation: .8s ease translateX_1_right_kf forwards 2.1s;
    }
    .translateX_animation_right_4 {
        -webkit-transform: translateX(100%);
        -webkit-animation: .8s ease translateX_1_right_kf forwards 2.9s;
    }
    .translateX_animation_right_5 {
        -webkit-transform: translateX(100%);
        -webkit-animation: .8s ease translateX_1_right_kf forwards 3.7s;
    }
    @-webkit-keyframes translateX_1_right_kf {
        0% {
            -webkit-transform: translateX(100%);
        }
        100% {
            -webkit-transform: translateX(0);
        }
    }
    /********************** 右边动画 end  ********************************/

    word_1后可以随意执行  translateX_animation_right_2 或者 translateX_animation_left_2 ,然后word_3神马的。

    好,暂时遇到的项目只用到了渐显和飞入,这2个常用的通用动画,小伙伴们有更多的实际场景欢迎交流,写得不好的地方也欢迎吐槽,谢谢看完  谢谢谢谢。

  • 相关阅读:
    SpringBoot框架(二)
    SpringBoot框架(一)
    JavaScript语言和jQuery技术(一)
    Mysql数据库技术(四)
    Mysql数据库技术(三)
    Mysql数据库技术(二)
    Mysql数据库技术(一)
    JDBC技术(三)
    JDBC技术(二)
    JDBC技术(一)
  • 原文地址:https://www.cnblogs.com/skyweaver/p/4409641.html
Copyright © 2011-2022 走看看