Làm thế nào để áp dụng nhiều biến đổi trong CSS?


604

Sử dụng CSS, làm thế nào tôi có thể áp dụng nhiều hơn một transform?

Ví dụ: Trong các phần sau, chỉ áp dụng bản dịch, không phải xoay.

li:nth-child(2) {
    transform: rotate(15deg);
    transform: translate(-20px,0px);        
}

Câu trả lời:


994

Bạn phải đặt chúng trên một dòng như thế này:

li:nth-child(2) {
    transform: rotate(15deg) translate(-20px,0px);
}

Khi bạn có nhiều chỉ thị biến đổi, chỉ có lệnh cuối cùng sẽ được áp dụng. Nó giống như bất kỳ quy tắc CSS nào khác.


Hãy ghi nhớ nhiều chỉ thị một dòng được áp dụng từ phải sang trái .

Đây: transform: scale(1,1.5) rotate(90deg);
và:transform: rotate(90deg) scale(1,1.5);

sẽ không tạo ra kết quả tương tự:

.orderOne, .orderTwo {
  font-family: sans-serif;
  font-size: 22px;
  color: #000;
  display: inline-block;
}

.orderOne {
  transform: scale(1, 1.5) rotate(90deg);
}

.orderTwo {
  transform: rotate(90deg) scale(1, 1.5);
}
<div class="orderOne">
  A
</div>

<div class="orderTwo">
  A
</div>


55
Tôi đã cố tách chúng bằng một "," giống như được thực hiện với nhiều bóng, nhưng điều đó không hiệu quả. Cảm ơn bạn.
Bến

2
có thể áp dụng một thông báo trước khi khác ... như nghiêng trước khi xoay. Đối với tôi bất kể tôi làm gì, yếu tố được xoay trước và sau đó bị lệch dẫn đến kết quả là thứ gì đó không phải là thứ tôi muốn.
Muhammad Umer

2
vì vậy ngay bây giờ để chia chúng thành nhiều dòng
aWebDeveloper

2
biến đổi: dịch (100px, 100px) xoay (45deg) dịch (100px, 100px) xoay (45deg); Biến đổi bằng: dịch (200px, 200px) xoay (90deg), cái cuối cùng sẽ thêm
bigCat 17/03/2015

3
@ jave.web, Ý bạn là phải sang trái , đúng không? Đối với transform: scale(1,1.5) rotate(90deg);, xoay sẽ xảy ra trước khi quy mô.
Trò đùa

43

Tôi thêm câu trả lời này không phải vì nó có thể hữu ích mà chỉ vì nó đúng.

Ngoài việc sử dụng các câu trả lời hiện có giải thích cách thực hiện nhiều bản dịch bằng cách xâu chuỗi chúng, bạn cũng có thể tự xây dựng ma trận 4x4

Tôi đã chộp được hình ảnh sau từ một số trang web ngẫu nhiên mà tôi tìm thấy trong khi googling hiển thị ma trận quay:

Xoay quanh trục x: Xoay quanh trục x
Xoay quanh trục y: Xoay quanh trục y
Xoay quanh trục z:Xoay quanh trục z

Tôi không thể tìm thấy một ví dụ hay về dịch thuật, vì vậy, giả sử tôi nhớ / hiểu đúng, dịch:

[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[x y z 1]

Xem thêm tại bài viết Wikipedia về chuyển đổi cũng như hướng dẫn CSS3 thực dụng giải thích nó khá tốt. Một hướng dẫn khác mà tôi đã tìm thấy giải thích các ma trận xoay tùy ý là các ghi chú của Egon Rath về ma trận

Tất nhiên, phép nhân ma trận hoạt động giữa các ma trận 4 x 4 này, vì vậy để thực hiện phép quay theo sau là bản dịch, bạn tạo ma trận xoay phù hợp và nhân nó với ma trận dịch.

Điều này có thể giúp bạn tự do hơn một chút để làm cho nó vừa phải, và cũng sẽ khiến mọi người hoàn toàn không thể hiểu những gì nó đang làm, kể cả bạn trong năm phút.

Nhưng, bạn biết đấy, nó hoạt động.

Chỉnh sửa: Tôi mới nhận ra rằng tôi đã quên đề cập đến việc sử dụng có lẽ quan trọng và thiết thực nhất cho việc này, đó là tăng dần các biến đổi 3D phức tạp thông qua JavaScript, nơi mọi thứ sẽ có ý nghĩa hơn một chút.


3
"Trang web ngẫu nhiên" tại mine.edu không may là một liên kết chết.
Matt Sach

1
Như liên kết 9elements :(
Matt Sach

1
@MattSach Ok, rõ ràng "sau hôm nay" đối với tôi có nghĩa là "sáu tháng sau", nhưng ít nhất thì liên kết 9elements đã được sửa (một người khác đã sửa liên kết các trang web ngẫu nhiên với Wayback và tôi đã đi theo sự dẫn dắt của họ.)
Jeff

1
Tôi cũng làm điều này để giúp bạn hiểu họ.
alex

6
điều này thực sự không phù hợp với chủ đề này
user151496

24

Bạn cũng có thể áp dụng nhiều biến đổi bằng cách sử dụng một lớp đánh dấu bổ sung, ví dụ:

<h3 class="rotated-heading">
    <span class="scaled-up">Hey!</span>
</h3>
<style type="text/css">
.rotated-heading
{
    transform: rotate(10deg);
}

.scaled-up
{
    transform: scale(1.5);
}
</style>

Điều này có thể thực sự hữu ích khi hoạt ảnh các yếu tố với các biến đổi bằng Javascript.


Bạn quên mấttransform-style: preserve-3d
Jack Giffin

Nó không cần thiết cho các biến đổi 2d lồng nhau - phụ thuộc vào kết quả mong muốn. Transform-origin rất có thể sẽ có ích.
richtelford

21

Bạn có thể áp dụng nhiều hơn một biến đổi như thế này:

li:nth-of-type(2){
    transform : translate(-20px, 0px) rotate(15deg);
}

2

Đôi khi trong tương lai, chúng ta có thể viết nó như thế này:

li:nth-child(2) {
    rotate: 15deg;
    translate:-20px 0px;        
}

Điều này sẽ trở nên đặc biệt hữu ích khi áp dụng các lớp riêng lẻ trên một phần tử:

<div class="teaser important"></div>

.teaser{rotate:10deg;}
.important{scale:1.5 1.5;}

Cú pháp này được xác định trong đặc tả CSS Transforms Cấp 2 đang thực hiện , nhưng không thể tìm thấy bất cứ điều gì về trình duyệt hiện tại hỗ trợ ngoài chrome canary. Hy vọng một ngày nào đó tôi sẽ quay lại và cập nhật hỗ trợ trình duyệt tại đây;)

Tìm thấy thông tin trong bài viết này mà bạn có thể muốn kiểm tra về cách giải quyết cho các trình duyệt hiện tại.


1

Chỉ cần bắt đầu từ đó trong CSS , nếu bạn lặp lại 2 giá trị trở lên, luôn luôn áp dụng một giá trị cuối cùng, trừ khi sử dụng !importantthẻ, nhưng đồng thời tránh sử dụng !importantcàng nhiều càng tốt, vì vậy trong trường hợp của bạn đó là vấn đề, vì vậy, thứ hai biến đổi ghi đè lên cái đầu tiên trong trường hợp này ...

Vậy làm thế nào bạn có thể làm những gì bạn muốn sau đó? ...

Đừng lo lắng , chuyển đổi chấp nhận nhiều giá trị cùng một lúc ... Vì vậy, mã dưới đây sẽ hoạt động:

li:nth-child(2) {
  transform: rotate(15deg) translate(-20px, 0px); //multiple
}

Nếu bạn muốn chơi xung quanh với biến đổi, hãy chạy iframe từ MDN bên dưới:

<iframe src="https://interactive-examples.mdn.mozilla.net/pages/css/transform.html" class="interactive  " width="100%" frameborder="0" height="250"></iframe>

Nhìn vào liên kết dưới đây để biết thêm:

<< Biến đổi CSS >>


0

Biến đổi Xoay và Dịch trong một dòng css: -Làm thế nào?

div.className{
    transform : rotate(270deg) translate(-50%, 0);    
    -webkit-transform: rotate(270deg) translate(-50%, -50%);    
    -moz-transform: rotate(270deg) translate(-50%, -50%);    
    -ms-transform: rotate(270deg) translate(-50%, -50%);    
    -o-transform: rotate(270deg) translate(-50%, -50%); 
    float:left;
    position:absolute;
    top:50%;
    left:50%;
    }
<html>
<head>
</head>
<body>
<div class="className">
  <span style="font-size:50px">A</span>
</div>
</body>
</html>

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.