• CSS 动画技巧及案例


    正负旋转相消

    这里要介绍的技巧是利用父级元素正反两个方向的旋转,来制作一些酷炫的 3d 效果。

    HTML结构如下:

    <div class="reverseRotate">
        <div class="rotate">
            <div class="content">正负旋转相消3D动画</div>
        </div>
    </div>

    .content 内是我们的主要内容,好了,现在想象一下,如果祖先元素 .rotate 进行正向 linear 360° 旋转,父级元素 .reverseRotate 进行反向 linear 360° 旋转。

    CSS 代码如下:

    .rotate {
        animation: rotate 5s linear infinite; 
    }
    
    .reverseRotate {
        animation: reverseRotate 5s linear infinite; 
    }
    
    @keyframes rotate {
        100% {
            transform: rotate(360deg);
        }
    }
    
    @keyframes reverseRotate {
        100% {
            transform: rotate(-360deg);
        }
    }

    Amazing!因为一正一反的旋转,且缓动函数一样,所以整个 content 看上去依然是静止的!注意,这里整个 content 静止的非常重要。

    But,看上去风平浪静的效果底下其实是暗流涌动,祖先两个元素都是在旋转的。

    So,在其中旋转的一个祖先元素上,添加一些别的动画会......上代码。

    div {
        transform-style: preserve-3d;
        perspective: 500px;
    }
    
    @keyframes rotate {
        0% {
            transform: rotateX(0deg) rotateZ(0deg);
        }
        50% {
            transform: rotateX(40deg) rotateZ(180deg);
        }
        100% {
            transform: rotateX(0deg) rotateZ(360deg);
        }
    }

    效果,wow~~

    动画相同,缓动不同

    有的时候我们页面存在一些具有相同动画的元素,为了让动画不那么死板,我们可以给相同的动画,赋予不同的缓动函数(animation-timing-function),来达到动画效果。

    <div class="container">
        <div class="ball ball1"></div>
        <div class="ball ball2"></div>
        <div class="ball ball3"></div>
    </div>
    
    
    .ball1 {
        animation: move 1s ease-in infinite alternate;
    }
    
    .ball2 {
        animation: move 1s linear infinite alternate;
    }
    
    .ball3 {
        animation: move 1s ease-out infinite alternate;
    }
    
    @keyframes move {
        100% {
            transform: translateY(5vw);
        }
    }

    这样,一个简单的 loading 效果就制作好了。(当然这个技巧比较简单,学会合理运用是关键)

    缓动函数 timing-function 在动画中占据了非常重要的地位。

    当你不想使用 CSS 默认提供的 linearease-inease-out 之类缓动函数的,可以自定义 cubic-bezier(1, 1, 0, 0),这里有个非常好用的工具推荐,下面这个网站,可以方便的调出你需要的缓动函数并且拿到对应的 cubic-bezier 。

    cubic-bezier.com

    过渡取消

    我们在制作页面的时候,为了让页面更加有交互感,会给按钮,阴影,颜色等样式添加过渡效果,配合 hover 一起使用。

    这个是常规思维,如果我们的元素一开始是没有过渡效果,只有 hover 上去才给它添加一个过渡,又或者一开始元素是有过渡效果的,当我们 hover 上去时,取消它的过渡,会碰撞出什么样的火花呢?

    使用这个技巧(也许算不上技巧,纯粹好玩),我们可以制作出一些有趣的效果。

    可以戳这里感受一下:

    CodePen Demo -- Cancle transition

    动画层级的控制,保持动画层级在最上方

    动画层级的控制的意思是尽量让需要进行 CSS 动画的元素的 z-index 保持在页面最上方,避免浏览器创建不必要的图形层(GraphicsLayer),能够很好的提升渲染性能。

    总结

    这个坑最早见于张云龙发布的这篇文章CSS3硬件加速也有坑,这里还要总结补充的是:

    • GPU 硬件加速也会有坑,当我们希望使用利用类似 transform: translate3d() 这样的方式开启 GPU 硬件加速,一定要注意元素层级的关系,尽量保持让需要进行 CSS 动画的元素的 z-index 保持在页面最上方。

    • Graphics Layer 不是越多越好,每一帧的渲染内核都会去遍历计算当前所有的 Graphics Layer ,并计算他们下一帧的重绘区域,所以过量的 Graphics Layer 计算也会给渲染造成性能影响。

    • 可以使用 Chrome ,用上面介绍的两个工具对自己的页面生成的 Graphics Layer 和元素层级进行观察然后进行相应修改。

    • 上面观察页面层级的 chrome 工具非常吃内存?好像还是一个处于实验室的功能,分析稍微大一点的页面容易直接卡死,所以要多学会使用第一种观察黄色边框的方式查看页面生成的 Graphics Layer 这种方式。

    数字动画

    运用了上面提到的一些小技巧,参考了一些 CodePen 上的效果,整了个下述的 3D 数字计数效果。

    CodePen Demo -- 3d Number Count

    原文链接:github.com

  • 相关阅读:
    使用lambda的精简写法
    lambda实现集合遍历 排序
    stream流 list转map
    stream.min
    lambda实现线程调用
    stream.allMatch
    stream.reduce
    stream流 of
    Stream流 list转set
    SQL Server 游标的简单介绍 转载
  • 原文地址:https://www.cnblogs.com/indigojh/p/7527437.html
Copyright © 2020-2023  润新知