2011-02-10 64 views
8

Tôi đang cố gắng sử dụng hỗ trợ của webkit cho CSS3 transform: matrix3d(<matrix>) để tạo hiệu ứng 'thẻ rơi'. (Mục tiêu duy nhất cho đầu ra của việc này là Chrome)CSS3 matrix3d ​​hình chữ nhật để chuyển đổi hình thang

Hiệu quả cuối cùng nên chuyển đổi qua 4 giai đoạn dưới đây và kết thúc như chỉ là một đường ngang:

enter image description here

Đây là CSS Tôi có bây giờ:

#test { 
      margin: auto auto; 
      height: 200px; 
      width: 200px; 
      border:1px solid black; 
      background-color: lightblue; 
      -webkit-perspective: 1000; 
      -webkit-transform-origin: 50% 100%; 
      -webkit-transform-style: preserve-3d; 
      -webkit-animation-name: flip-card;   
      -webkit-animation-duration: 1s;   
      -webkit-animation-iteration-count: infinite;   
      -webkit-animation-timing-function: linear; 
      -webkit-box-shadow: 0px 5px 20px rgba(0, 0, 0, 0.5); 
     } 
     @-webkit-keyframes flip-card { 
      0% {-webkit-transform: ;} 
      100% {-webkit-transform: 
         matrix3d(1, 0, 0, 0, 
           0, 1, 0, 0, 
           0, 0, 0, 0, 
           0, 0, 0.001, 1);} 
     }  

Và HTML rất đơn giản để thử nghiệm:

<body> 
    <div id="test">this div should fall forward...</div> 
</body> 

Ma trận3d ở trên được dựa trên đọc this SO question, nhưng nó tạo ra một hình vuông thu hẹp lật xung quanh trục x được xác định bởi phần dưới cùng của hộp ban đầu.

Tôi hiểu rằng ma trận CSS 2d chỉ có thể tạo hình chữ nhật và hình bình hành bằng cách chuyển đổi hộp và hình dạng bất thường cần hoạt động chuyển đổi matrix3d ​​(this hữu ích trong việc làm mới đại số tuyến tính mờ dần!) để tạo hình chữ nhật và hình bình hành.

Tôi đã xem xét một số câu hỏi SO được gắn thẻ với matrixtransformation. Hầu hết trong số họ không phải là CSS dựa và tôi đã không thể có được sự chuyển đổi tôi muốn.

+2

Tôi tạo ra một công cụ để fiddle với giá trị chuyển đổi css ở đây: http://www.duopixel.com/ stack/webkitmatrix /, nhưng tôi sợ rằng tôi không thể tạo ra một hình thang với Chrome. Hãy thử một lần. – Duopixel

+0

@Duopixel: đó là một công cụ tuyệt vời. Tôi có thể tạo một hình thang trong Safari ... nhưng bị lệch trên trục Y chứ không phải trục X bằng cách di chuyển Row-1, thanh trượt Column4 (thanh trượt trên cùng bên phải). Trong Chrome, cùng một thanh trượt tạo ra một hình bình hành. Sự hiểu biết của tôi là tôi nên di chuyển thanh trượt Row-4, Column-3 để tạo hình bình hành trục X, nhưng nó không có hiệu lực trong Safari hoặc Chrome. – beggs

+0

[CoffeeScript fiddle] (http://franklinta.com/2014/09/08/computing-css-matrix3d-transforms/#cp_embed_ifnqH) có thể hữu ích. Trang blog được nhúng trên đó cũng có một số giải thích hữu ích. – mbomb007

Trả lời

9

-quan điểm -webkit không hoạt động trong Chrome (chỉ Safari), vì vậy tính năng này sẽ không hoạt động (hãy thử mã của bạn trong Safari). Ngoài ra, các biến đổi 3D trong Chrome, nói chung, có một chút khó chịu và không kết hợp tốt với các gradient, cho một.

Ngoài ra rotate3d (1, 0, 0, 90deg) hoạt động cũng như ma trận để thực hiện những gì bạn đang làm. Ký hiệu ma trận chỉ là một cách ngắn để kết hợp xoay 3D, nghiêng, di chuyển và xuất xứ thành một mảng duy nhất. Vì bạn chỉ xoay quanh trục x nên bạn không cần phải đi đến độ dài này.

webkit-transform: perspective(800) rotate3d(1, 0, 0, -90deg) 

Chính xác là những gì bạn cần.

Cập nhật: Đây là link to a jsfiddle với chính xác những gì bạn đang tìm kiếm hoạt động ở cả chrome và safari. Xin lưu ý rằng điều quan trọng là phải xác định rằng nguồn gốc biến đổi cho lật cũng giống như nguồn gốc của phối cảnh. Nguồn gốc quan điểm của Webkit xác định vị trí của "camera" trong không gian 3D liên quan đến bất kỳ biến đổi 3d nào và thật dễ dàng để có được kết quả không trực quan nếu bạn không cẩn thận.

Cập nhật 2: Perspective hiện đang được hỗ trợ trong tất cả các trình duyệt cạnh (mặc dù anti-aliasing firefox của có ít để khuyên nó (và cần moz rõ ràng))

Cập nhật thứ 3: Cập nhật fiddle cho trình duyệt chéo cho Firefox, IE và chưa được cố định.

+0

Thú vị, tôi đã sử dụng rotateX() nhưng nó không cung cấp góc nhìn mà đối tượng đang rơi xuống phía trước. Tôi đã thêm các thiết lập phối cảnh khác nhau và khung hình chính nhưng không bao giờ có được hiệu ứng '3D'. Tôi sẽ thử Safari và xem có gì khác biệt. – beggs

+0

Tôi đã thử những thay đổi quan điểm trong safari 5.0.3 (cửa sổ) và không có hiệu lực. Trong công cụ mà @Duopixel đã đề cập trong bình luận của mình, tôi không thể có được hình thang trục X, chỉ có một trục Y trong Safari, trong khi Chrome sẽ chỉ tạo ra một hình chiếu song song trục Y. Có vẻ như câu trả lời là "không thể". – beggs

3

Tôi đã đọc thông số chuyển tiếp CSS khi tôi nhận thấy chiều rộng đường viền là có thể hoạt hình và bạn có thể giả hình thang bằng chiều rộng đường viền. Điều này có nghĩa là bạn có thể đánh rơi thẻ giả mạo trong Chrome, Opera và FF4!

#stage { 
    margin-top: 200px; 
    position: relative; 
} 

#trapezoid { 
    position: absolute; 
    bottom: 0; 
    border: solid 1px #fff; 
    border-bottom: solid 200px #c00; 
    width: 200px; 
    -webkit-transition: all ease 1s; 

} 

#stage:hover #trapezoid { 
    border: solid 50px #fff; 
    border-bottom: solid 20px #f11; 
    width: 100px; 

} 

Tất nhiên, điều này có thể lưu ý: nhưng dường như điều này là không thể với kỹ thuật này. Bất kỳ nội dung bên trong hình dạng sẽ không được chuyển đổi, nó chỉ là hình dạng thẻ. Oh, và hình dạng thẻ không thể có bất kỳ biên giới. Hạn chế lớn giới hạn ứng dụng thực tế của nó.

Tuy nhiên, nó khá tuyệt! Chơi với nó ở đây: http://jsfiddle.net/mxgAu/

+0

Nhưng bạn sẽ không thể đặt bất cứ điều gì bên trong nó. –

+0

Có, nhưng không phải không có một số thủ thuật. Sau khi viết câu trả lời này, tôi thấy đã có một plugin jQuery thực hiện điều này: http://lab.smashup.it/flip/. – Duopixel

+0

Oh crap! 3D Flipping không có CSS3 3D! http://archive.dojotoolkit.org/nightly/dojotoolkit/dojox/fx/tests/test_flip.html –

0

Nếu bạn đang sử dụng IE10, sau đó là giải pháp có thể là:

.up{ 
    -ms-transform-origin: 50% 100%; 
    -ms-transform: perspective(100px) rotateX(7deg); 
} 

.down{ 
    -ms-transform-origin: 50% 0%; 
    -ms-transform: perspective(100px) rotateX(-7deg) scale(1); 
} 
Các vấn đề liên quan