CSS: Hoạt hình so với chuyển đổi


154

Vì vậy, tôi hiểu làm thế nào để thực hiện cả chuyển tiếp và hoạt hình CSS3. Điều không rõ ràng và tôi đã hiểu, là khi nào nên sử dụng.

Ví dụ, nếu tôi muốn làm cho một quả bóng nảy, rõ ràng hoạt hình là con đường để đi. Tôi có thể cung cấp khung hình chính và trình duyệt sẽ thực hiện các khung trung gian và tôi sẽ có một hoạt hình đẹp.

Tuy nhiên, có những trường hợp khi một hiệu ứng nói trên có thể đạt được một trong hai cách. Một ví dụ đơn giản và phổ biến sẽ được thực hiện trình đơn ngăn kéo trượt kiểu facebook:

Hiệu ứng này có thể đạt được thông qua các chuyển đổi như vậy:

.sf-page {
    -webkit-transition: -webkit-transform .2s ease-out;
}

.sf-page.out {
    -webkit-transform: translateX(240px);
}

http://jsfiddle.net/NwEGz/

Hoặc, thông qua hình ảnh động như vậy:

.sf-page {
    -webkit-animation-duration: .4s;
    -webkit-transition-timing-function: ease-out;
}

.sf-page.in {
    -webkit-animation-name: sf-slidein;
    -webkit-transform: translate3d(0, 0, 0);
}

.sf-page.out {
    -webkit-animation-name: sf-slideout;
    -webkit-transform: translateX(240px);
}

@-webkit-keyframes sf-slideout {
    from { -webkit-transform: translate3d(0, 0, 0); }
    to { -webkit-transform: translate3d(240px, 0, 0); }
}

@-webkit-keyframes sf-slidein {
    from { -webkit-transform: translate3d(240px, 0, 0); }
    to { -webkit-transform: translate3d(0, 0, 0); }
}

http://jsfiddle.net/4Z5Mr/

Với HTML trông giống như vậy:

<div class="sf-container">
    <div class="sf-page in" id="content-container">
        <button type="button">Click Me</button>
    </div>
    <div class="sf-drawer">
    </div>
</div>

Và, tập lệnh jQuery đi kèm này:

$("#content-container").click(function(){
    $("#content-container").toggleClass("out");
    // below is only required for css animation route
    $("#content-container").toggleClass("in");
});

Điều tôi muốn hiểu là những ưu và nhược điểm của những cách tiếp cận này.

  1. Một sự khác biệt rõ ràng là hoạt hình là lấy nhiều mã hơn.
  2. Hoạt hình cho phép linh hoạt tốt hơn. Tôi có thể có hình ảnh động khác nhau để trượt ra và vào
  3. Có điều gì đó có thể nói về hiệu suất. Cả hai đều tận dụng khả năng tăng tốc h / w?
  4. Cái nào hiện đại hơn và con đường phía trước
  5. Bất cứ điều gì khác bạn có thể thêm?

Câu trả lời:


208

Có vẻ như bạn đã nắm được cách thực hiện chúng, nhưng không phải khi nào nên thực hiện chúng.

Chuyển đổi là một hình ảnh động , chỉ là một trạng thái được thực hiện giữa hai trạng thái riêng biệt - tức là trạng thái bắt đầu và trạng thái kết thúc. Giống như một menu ngăn kéo, trạng thái bắt đầu có thể được mở và trạng thái kết thúc có thể được đóng lại, hoặc ngược lại.

Nếu bạn muốn thực hiện một cái gì đó không liên quan cụ thể đến trạng thái bắt đầu và trạng thái kết thúc hoặc bạn cần kiểm soát hạt tốt hơn đối với các khung hình chính trong quá trình chuyển đổi, thì bạn phải sử dụng hình ảnh động.


7
kiểm tra bài viết này quá kirupa.com/html5/css3_animations_vs_transitions.htmlm , nó chỉ ra một cách chính xác rằng chuyển đổi là cách để đi khi thực hiện các tương tác javascript.
Scott Jungwirth

40

Tôi sẽ để các định nghĩa tự nói lên (theo Merriam-Webster):

Chuyển đổi : Một phong trào, phát triển hoặc tiến hóa từ một hình thức, giai đoạn hoặc phong cách khác

Hoạt hình : Trời phú cho cuộc sống hoặc những phẩm chất của cuộc sống; đầy phong trào

Các tên phù hợp với mục đích của họ trong CSS

Vì vậy, ví dụ bạn đã đưa ra nên sử dụng các hiệu ứng chuyển tiếp vì đó chỉ là thay đổi từ trạng thái này sang trạng thái khác


21

Một câu trả lời ngắn hơn, thẳng vào điểm:

Chuyển đổi:

  1. Cần một yếu tố kích hoạt (: hover ,: tập trung, v.v.)
  2. Chỉ có 2 trạng thái hoạt hình (bắt đầu và kết thúc)
  3. Được sử dụng cho hình ảnh động đơn giản hơn (nút, menu thả xuống và vv)
  4. Dễ dàng tạo hơn nhưng không có nhiều khả năng hiệu ứng / hiệu ứng

Hoạt hình @keyframes:

  1. Nó có thể được sử dụng cho hình ảnh động vô tận
  2. Có thể đặt nhiều hơn 2 trạng thái
  3. Không có ranh giới

Cả hai đều sử dụng tăng tốc CPU cho hiệu ứng mượt mà hơn nhiều.


Khi bạn nói "tăng tốc CPU", có lẽ bạn có nghĩa là "tăng tốc GPU"? Tôi tin rằng các hình ảnh động không tính toán bố cục như "dịch" có được lợi ích đó
jv-dev

12
  1. Hoạt hình cần nhiều mã hơn trừ khi bạn sử dụng cùng một quá trình chuyển đổi, trong trường hợp đó, một hình ảnh động sẽ tốt hơn.

  2. Bạn có thể có các hiệu ứng khác nhau để trượt vào và ra mà không có hình động. Chỉ cần có một chuyển đổi khác nhau trên cả quy tắc ban đầu và quy tắc được sửa đổi:

    .two-transitions {
        transition: all 50ms linear;
    }
    
    .two-transitions:hover {
        transition: all 800ms ease-out;
    }
  3. Ảnh động chỉ là sự trừu tượng của các hiệu ứng chuyển tiếp, vì vậy nếu quá trình chuyển đổi được tăng tốc phần cứng, hoạt ảnh sẽ có. Nó không có Gì Thay đổi.

  4. Cả hai đều rất hiện đại.

  5. Nguyên tắc nhỏ của tôi là nếu tôi sử dụng cùng một quá trình chuyển đổi ba lần, thì đó có lẽ là một hình ảnh động. Điều này dễ dàng hơn để duy trì và thay đổi trong tương lai. Nhưng nếu bạn chỉ sử dụng nó một lần, thì việc gõ hoạt hình sẽ nhiều hơn và có thể không đáng.


Tôi cũng nên thêm rằng hình ảnh động có khung hình chính, cho phép bạn thực hiện các tiến trình rất phức tạp và có kiểm soát, điều này thật tuyệt vời.
paulcpederson

3

Ảnh động chỉ là vậy - một hành vi trơn tru của tập các thuộc tính. Nói cách khác, nó chỉ định điều gì sẽ xảy ra với một tập các thuộc tính của phần tử. Bạn xác định một hình ảnh động và mô tả cách tập hợp các thuộc tính này sẽ hoạt động trong quá trình hoạt hình.

Chuyển đổi ở phía bên kia chỉ định cách một thuộc tính (hoặc thuộc tính) nên thực hiện thay đổi của chúng. Mỗi thay đổi. Đặt một giá trị mới cho một thuộc tính nhất định, có thể bằng JavaScript hoặc CSS, luôn luôn là một quá trình chuyển đổi, nhưng theo mặc định, nó không trơn tru. Bằng cách thiết lập transitiontheo kiểu css, bạn xác định cách khác nhau (trơn tru) để thực hiện các thay đổi này.

Có thể nói rằng các hiệu ứng chuyển tiếp xác định một hình ảnh động mặc định nên được thực hiện mỗi khi thuộc tính được chỉ định thay đổi.


1
Tôi không đồng ý với định nghĩa này vì cả hai đều chỉ rõ cách thứcđiều gì
Zach Saucier

3

Có điều gì đó có thể nói về hiệu suất. Cả hai đều tận dụng khả năng tăng tốc h / w?

Trong các trình duyệt hiện đại, h / w tốc xảy ra cho các thuộc tính filter, opacitytransform. Điều này là cho cả CSS Animations và CSS Transitions.


1

.yourClass {
    transition: all 0.5s;
color: #00f;
margin: 50px;
font-size: 20px;
cursor: pointer;
}

.yourClass:hover {
    color: #f00;
}
<p class="yourClass"> Hover me </p>


-1

Tôi tin rằng hoạt hình CSS3 so với chuyển đổi CSS3 sẽ cho bạn câu trả lời bạn muốn.

Về cơ bản dưới đây là một số takeaways:

  1. Nếu hiệu suất là một mối quan tâm, sau đó chọn chuyển tiếp CSS3.
  2. Nếu trạng thái được duy trì sau mỗi lần chuyển đổi, thì hãy chọn chuyển tiếp CSS3.
  3. Nếu hoạt hình cần được lặp lại, chọn hoạt hình CSS3. Bởi vì nó hỗ trợ hoạt hình-lặp-đếm.
  4. Nếu một hình ảnh động phức tạp là mong muốn. Sau đó, hoạt hình CSS3 được ưa thích.

3
# 2 và # 3 không đúng
Zach Saucier

1
Tôi không chắc làm thế nào # 3 là không đúng sự thật? Có vẻ như một điểm hợp lý để xem xét và số lần lặp hoạt hình dường như là một thuộc tính hợp lệ: developer.mozilla.org/en-US/docs/Web/CSS/

1
Hai điều với điều đó: 1) nếu quá trình chuyển đổi được bắt đầu lại sau đó thì nó vẫn là "lặp lại" ngay cả khi nó không ngay lập tức sau lần lặp đầu tiên. 2) bạn có thể có một quá trình thực hiện lặp lại ngay lập tức tùy thuộc vào hình ảnh động. Xem bài viết Thủ thuật CSS của tôi để biết thêm về ý tôi.
Zach Saucier

-1

Đừng làm phiền bản thân cái nào tốt hơn. Sự cho đi của tôi là, nếu bạn có thể giải quyết vấn đề của mình chỉ bằng một hoặc hai dòng mã thì chỉ cần làm điều đó thay vì viết một loạt mã sẽ dẫn đến hành vi tương tự. Dù sao, quá trình chuyển đổi giống như một tập hợp con của hình ảnh động. Nó đơn giản có nghĩa là quá trình chuyển đổi có thể giải quyết các vấn đề nhất định trong khi mặt khác hoạt hình có thể giải quyết tất cả các vấn đề. Hoạt hình cho phép bạn có quyền kiểm soát từng giai đoạn bắt đầu từ 0% cho đến 100%, đây là điều mà quá trình chuyển đổi thực sự không thể làm được. Hoạt hình yêu cầu bạn viết một loạt mã trong khi quá trình chuyển đổi sử dụng một hoặc hai dòng mã để thực hiện cùng một kết quả tùy thuộc vào những gì bạn đang làm việc. Xuất phát từ quan điểm của JavaScript, tốt nhất là sử dụng chuyển đổi. Bất cứ điều gì liên quan đến chỉ hai giai đoạn tức là bắt đầu và kết thúc sử dụng chuyển tiếp. Tóm tắt, nếu nó căng thẳng don '

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.