一个栗子上手 CSS3 动画

vllyklvnuw 2年前
   <p>最近杂七杂八的事情很多,很多知识都没来得及总结,是时候总结总结,开启新的篇章~</p>    <p>本篇文章不一一列举CSS3动画的属性,若需要了解API,可前往 MDN  。</p>    <p>在开始栗子前,我们先补补基础知识。</p>    <p>css3动画分类:</p>    <ul>     <li>补间动画 – 具有连贯性的动画</li>     <li>逐帧动画 – 使用steps过渡方式实现跳跃</li>    </ul>    <p>animation常用属性及场景:</p>    <pre>  <code class="language-css">animation: name duration timing-function delay iteration-count direction;  </code></pre>    <p>1. timing-function属性:  </p>    <ul>     <li>ease 规定慢速开始,然后变快,然后慢速结束的过渡效果。</li>     <li>ease-in 规定以慢速开始的过渡效果。</li>     <li>ease-out 规定以慢速结束的过渡效果。</li>     <li>ease-in-out 规定以慢速开始和结束的过渡效果。</li>     <li>linear 动画从头到尾的速度是相同的。</li>     <li>cubic-bezier(n,n,n,n) 在cubic-bezier函数中自己的值,n取值为0~1</li>     <li>steps()</li>    </ul>    <p>2. delay属性:用于将动画与其他动画的执行时机错开,将动画落到不同的时间点。这个属性很好用~</p>    <p>动画原则:</p>    <ol>     <li>运动一般有个惯性,所以要先快后有一个慢一点的反弹。</li>     <li>背景若使用多个星星闪烁,错位闪烁</li>    </ol>    <p>配合JS使用</p>    <pre>  <code class="language-css">slide.addEventListener("webkitAnimationEnd", function() {     console.log('eeee') //动画结束再调用  });  </code></pre>    <p>有些情况我们需要确保动画结束后再进行另外一些交互,可使用该事件监听。</p>    <p>实战演习:</p>    <p>假如我们需要实现一个这样简单的动画:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/12605af996a572d35330801372ba50fd.gif"></p>    <p>仔细观察上面的动画,我们发现,它可以由以下3部分组成:</p>    <p>1. 入场动画——从右往左移动</p>    <p>2. 左右循环移动</p>    <p>3. 逐帧动画</p>    <p>实现方法:</p>    <p>使用3个dom元素, 最外层dom实现入场动画,第二层dom实现左右移动,第三层dom实现逐帧动画。</p>    <p>优点:调试方便,节省时间。</p>    <p>缺点:dom多。</p>    <p>1. dom结构</p>    <pre>  <code class="language-css"><div class="anima_entrance">      <div class="anima_move">          <div class="anima_sprite"></div>      </div>  </div>  </code></pre>    <p>2. 分析动画形成的时间轴:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/40480eb682987c166e09eed79bd436c5.png"></p>    <p>入场动画持续0.6s,只播放一次,左右移动以及逐帧动画持续2s,循环播放,代码如下:</p>    <pre>  <code class="language-css">.anima_entrance {      animation: anima_entrance .6s ease-in-out both;  }     .anima_move {      animation: anima_move 2s linear .6s infinite both;  }     .anima_sprite {      animation: anima_sprite 2s step-end .6s infinite both;  }  </code></pre>    <p>3. 使用steps()实现逐帧动画:</p>    <p>使用下面这张雪碧图,通过改变background-position实现动画切换。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/277025ede97f3682b4798cca86a88fb2.png"></p>    <p>蹬蹬蹬,效果如下面所示,是不是很失望</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d9140b4dc97eaa5485fac7b7d228c099.gif"></p>    <p>原因:由于animation默认以ease方式过渡,它会在每个关键帧之间插入补间动画,所以动画效果是连贯性的。此时可以使用steps()取消补间动画。</p>    <p>贴一个图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/9da8ed23c88230445475e94a309dbff8.png"></p>    <ul>     <li>steps(1,start): 动画一开始就跳到 100% 直到 <strong>这一帧(不是整个周期)</strong> 结束   == step-start</li>     <li>steps(1,end): 保持 0% 的样式直到 <strong>这一帧(不是整个周期)</strong> 结束   == step-end</li>    </ul>    <p>接着,我们将timing-function改成 step-end,效果如下:</p>    <pre>  <code class="language-css">animation: sprite 2s step-end .6s infinite both;  </code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/4a416d6c04a81b87cb45d52bcda88155.gif"></p>    <p>出现想要的效果了哈~不错。</p>    <p>完整的css代码如下:</p>    <pre>  <code class="language-css">.anima_entrance {      position: absolute;      z-index: 3;      top: 5.1rem;      left: 4.05rem;      width: 12.9rem;      height: 19.1rem;      -webkit-animation: anima_entrance .6s ease-in-out both;      animation: anima_entrance .6s ease-in-out both;  }     .anima_move {      width: 218px;      height: 382px;      position: absolute;      z-index: 1;      top: 0;      left: 42px;      -webkit-animation: anima_move 2s linear .6s infinite both;      animation: anima_move 2s linear .6s infinite both;  }     .anima_sprite {      width: 218px;      height: 382px;      background: url(demo.png) no-repeat 0 0;      background-size: 25.8rem 19.1rem;      -webkit-animation: anima_sprite 2s step-end .6s infinite both;      animation: anima_sprite 2s step-end .6s infinite both;  }     @keyframes anima_entrance {      0% {          -webkit-transform: translate3d(18.75rem, 0, 0);          transform: translate3d(18.75rem, 0, 0);      }      100% {          -webkit-transform: translate3d(0, 0, 0);          transform: translate3d(0, 0, 0);      }  }     @keyframes anima_move {      0%, 16%, 42%, 74%, 100% {          -webkit-transform: translate3d(0, 0, 0);          transform: translate3d(0, 0, 0);      }      29% {          -webkit-transform: translate3d(-1rem, 0, 0);          transform: translate3d(-1rem, 0, 0);      }      87% {          -webkit-transform: translate3d(1rem, 0, 0);          transform: translate3d(1rem, 0, 0);      }  }     @keyframes anima_sprite {      0%, 16%, 42%, 58%, 74%, 100% {          background-position: -12.9rem 0;      }      8%, 50%, 66% {          background-position: 0 0;      }  }  </code></pre>    <p> </p>    <p>来自:http://web.jobbole.com/91237/</p>    <p> </p>