CSS3 Animation: Bắt đầu tạo hiệu ứng không cần tới javascript

Đăng bởi doidd trong mục Hướng dẫn vào 20 tháng 3, 2012 | Comments

Như các bạn đã biết, khi CSS3 chưa ra đời,thì việc tạo hiệu ứng cho trang web chủ yếu là dùng jQuery. Việc dùng jQuery phần nào làm ảnh hưởng tới tốc độ load của trang web. Nhưng từ khi có CSS3 với 2 thuộc tính quan trọng đó là Transition và Animation có thể giúp ta làm các hiệu ứng mà ko cần tới jquery (tất nhiên với các hiệu ứng phức tạp thì ko thể ko dùng). Vì vậy trong bài viết này mình sẽ giới thiệu với các bạn thuộc tính Animation và một ứng dụng đơn giản của nó. Các bạn xem qua demo. Nếu các bạn đã biết về CSS3 Animation thì thử nghĩ xem demo này animation sẽ được sử dụng thế nào nhé. Còn các bạn bắt đầu tìm hiểu thì chúng ta hãy qua phần lí thuyết trước.

Ứng dụng của animation

Với CSS3 Animation chúng ta có thể tạo ra hình ảnh động, thay thế các hình ảnh hoạt hình, hình ảnh động flash và JavaScript trong các trang web.

Cấu trúc của CSS3 Animation

animation: name duration timing-function delay iteration-count direction play-state;
  • animation-name: Tên của animation.
  • animation-duration: Thời gian của animation
  • animation-timing-function: Mô tả animation sẽ diễn ra như thế nào trên chu kì của nó. Giá trị mặc định ease.
  • animation-delay: Sau bao lâu animation sẽ bắt đầu(độ trễ). mặc định 0s
  • animation-iteration-count: Số lần thực hiện animation
  • animation-direction: Chỉ định xem animation sẽ diễn ra lần lượt từng chu kì hay ở chu kì tiếp theo sẽ đảo ngược lại với 2 giá trị: normal và alternate. Giá trị này chỉ có tác dụng khi animation-iteration-count có giá trị từ 2 trở lên.
  • animation-play-state: Chỉ định animation có diễn ra hay ko (running hoặc paused)
  • Các bạn chú ý rằng Animation chỉ hỗ trợ bộ -moz và -webkit vì thế chỉ chạy được trên Firefox, Chrome và Safari. Và các bạn cần thêm tiền tố vào trước animation ứng với mỗi trình duyệt.

    Ở trên chúng ta đã nói tới animation-name. Tên của animation này được định nghĩa bởi @keyframe. @keyframe này sẽ định nghĩa animation sẽ diễn ra như thế nào.

    Cấu trúc @keyframe

    @keyframes animationname {keyframes-selector {css-styles;}}
    
  • @keyframes:từ khóa.
  • Animationname: bắt buộc phải có. tên của animation và có tác dụng khi gọi animation.
  • keyframes-selector: bắt buộc. Và được xác định bởi phần trăm thời gian diễn ra animation
  • css-style: Cần có 1 hay nhiều thuộc tính css.
  • Đó là những thuộc tính của animation. Tiếp theo chúng ta sẽ xem sử dụng chúng như thế nào vào demo. Trong demo này chúng ta thấy khi hover qua sẽ có sự chuyển động của colum từ trái qua phải và trở về vị trí cũ. Vậy chúng ta sẽ áp dụng css animation ra sao đây? Chúng ta cùng làm nào:

    Mã html

    <div id="content">
        <div id="colum1" class="colum">
          <h2>Step 1</h2>
          <p>Lorem ipsum dolor sit amet, consectetue adi piscing elitsed dia myni bh euismocidunt dolor non lorem.</p>
          <a href="#">More</a>
        </div>
        
        <div id="colum2" class="colum">
          <h2>Step 2</h2>
          <p>Lorem ipsum dolor sit amet, consectetue adi piscing elitsed dia myni bh euismocidunt dolor non lorem.</p>
          <a href="#">More</a>
        </div>
        
        <div id="colum3" class="colum">
          <h2>Step 3</h2>
          <p>Lorem ipsum dolor sit amet, consectetue adi piscing elitsed dia myni bh euismocidunt dolor non lorem.</p>
          <a href="#">More</a>
        </div>
        
        <div id="colum4" class="colum">
          <h2>Step 4</h2>
          <p>Lorem ipsum dolor sit amet, consectetue adi piscing elitsed dia myni bh euismocidunt dolor non lorem.</p>
          <a href="#">More</a>
        </div>
    </div>
    

    Mã CSS cho phần hiển thị:

    .colum{
      float: left;
      width: 281px;
      height: 279px;
      background: url(../images/bg-block.png) no-repeat 0 bottom;
      margin-left: -52px;
      position: relative;
      left: 0;
    }
    #colum2:hover, #colum3:hover, #colum4:hover {
      z-index: 5 !important;
    }
    
    #colum1{
      z-index: 4;
      background: url(../images/bg-step.png) no-repeat 0 0;
    }
    #colum1:hover{
      background: url(../images/bg-step.png) no-repeat 0 bottom;
    }
    #colum2{
      z-index: 3;
      background: url(../images/bg-step2.png) no-repeat 0 0;
    }
    #colum2:hover{
      background: url(../images/bg-step2.png) no-repeat 0 bottom;
    }
    #colum3{
      z-index: 2;
      background: url(../images/bg-step3.png) no-repeat 0 0;
    }
    #colum3:hover{
      background: url(../images/bg-step3.png) no-repeat 0 bottom;
    }
    #colum4{
      z-index: 1;
      background: url(../images/bg-step4.png) no-repeat 0 0;
    }
    #colum4:hover{
      background: url(../images/bg-step4.png) no-repeat 0 bottom;
    }
    .colum h2{
      color: #47453E;
      font-size: 24px;
      font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
      font-weight: bold;
      font-style: normal;
      text-shadow: 1px 1px 0 rgba(255, 255, 255, .5), 1px 1px 0 rgba(0, 0, 0, .5) inset;
      background: url(../images/bg-h.png) bottom repeat-x;
      margin: 10px 47px 0px 21px;
      padding: 17px 0px 19px;
      letter-spacing: -1px;
      text-shadow: 1px 1px 0 rgba(255, 255, 255, .3);
    }
    .colum:hover h2{
      color: #FFFCE9;
    }
    .colum p{
      font-size: 14px;
      color: #3C3A35;
      font-weight: bold;
      font-style: italic;
      line-height: 24px;
      letter-spacing: -1px;
      padding: 8px 82px 0px 19px;
      margin-bottom: 14px;
      text-shadow: 1px 1px 0 rgba(255, 255, 255, .2);
    }
    .colum:hover p{
      color: #D9D6C6;
    }
    .colum a{
      background: #47433E;
      display: inline-block;
      box-shadow: 1px 1px 0 rgba(255,255,255, .3), 1px 1px 3px rgba(0,0,0, .5) inset;
      border-radius: 20px;
      width: 70px;
      padding: 6px 0 10px;
      text-align: center;
      color: #F5F2DF;
      font-size: 17px;
      text-shadow: 1px 1px 0 rgba(0, 0, 0, .7);
      text-decoration: none;
      margin: 0px 0px 0px 20px;
    }
    .colum a:hover{
      background: #1A1A17;
    }
    

    Bắt đầu hiệu ứng Animation

    Trước hết chúng ta cần định nghĩa animation này đã. Như đã thấy ở demo. Colum sẽ chuyển dịch từ vị trí ban đầu sang phải 60px rồi lại trở về vị trí cũ. Vậy đã sẽ định nghĩa animation này như sau.

  • Ban đầu(0%): colum tại vị trí 1.
  • Một phần tư thời gian(25%): Colum di chuyển từ vị trí 1 sang phải tới vị trí 2 cách vị trí 1 30px
  • Nửa thời gian(50%): Colum di chuyển từ vị trí 2 sang phải tới vị trí 3 cách vị trí 1 60px
  • Ba phần tư thời gian(75%):Colum di chuyển từ vị trí 3 sang trái về vị trí 2 cách vị trí 1 30px.
  • Cuối cùng(100%): Colum di chuyển từ vị trí 2 về vị trí 1
  • Và đây là @keyframes

    @-webkit-keyframes myfirst /* Safari and Chrome */
    {
    0%   {-webkit-transform: translate(0px, 0px); }
    25%  {-webkit-transform: translate(30px, 0px);}
    50%  {-webkit-transform: translate(60px, 0px); }
    75%  {-webkit-transform: translate(30px, 0px); }
    100% {-webkit-transform: translate(0px, 0px); }
    }
    @-moz-keyframes myfirst /* Firefox */
    {
    0%   {-moz-transform: translate(0px, 0px); }
    25%  {-moz-transform: translate(30px, 0px);}
    50%  {-moz-transform: translate(60px, 0px); }
    75%  {-moz-transform: translate(30px, 0px); }
    100% {-moz-transform: translate(0px, 0px); }
    }
    

    Cuối cùng ta chỉ cần gọi hàm Animation

      #colum2:hover, #colum3:hover, #colum4:hover {
      -webkit-animation: myfirst 0.8s linear 0s 1 alternate;
      -moz-animation: myfirst 0.8s linear 0s 1 alternate;
    }
    

    Như vậy chúng ta đã có một hiệu ứng cho trang web sử dụng CSS3 Animation. Nếu như các bạn tìm được hiệu ứng trên trang web nào đẹp hãy chia sẽ cùng mọi người. Hoặc tốt hơn hết hãy viết một tut gửi về ntuts.com mọi người chắc hẳn sẽ rất biết ơn về sự chia sẻ của các bạn! Cám ơn mọi người!

    Bạn có thích bài viết này?

    doidd's picture

    doidd

    Đã từng lang thang trên mạng để tìm hiều về Web. Cảm thấy tới lúc nên chia sẻ những mình đã tìm kiếm được với mục đích đơn giản: "Giảm người lang thang trên mạng :)"