2011-11-08 44 views
22

ngắn và ngọt ngào phiên bản:chuyển CSS trộn tuyệt đối và tương đối vị

Có thể kết hợp position: relativeposition: absolute với mịn CSS-chuyển tiếp?

phiên bản Verbose:

tôi là tạo ra một widget nhỏ (tôi gọi nó là một deck), mà tôi wan't để có thể có một nhà nước sụp đổ và mở rộng. Tất cả tốt cho đến nay, điều này là làm việc tốt.

Chuyển đổi giữa hai trạng thái, tự nhiên đảm bảo hoạt ảnh chuyển tiếp. Điều này cũng đang hoạt động, nhưng không phải cách tôi muốn nó được thực hiện. Những gì tôi muốn làm, là sử dụng CSS-chuyển đổi, thay vì sử dụng định vị tuyệt đối bằng cách sử dụng JavaScript, như tôi bây giờ.

Than ôi, tình huống hiện tại, ở trạng thái mở rộng, các thẻ trong boong luôn được đặt hoàn toàn, vị trí của chúng được tính toán khi chúng được thêm vào boong. Khi sụp đổ, bốn số đầu tiên được xếp chồng lên nhau theo cách xếp tầng và phần còn lại nằm trên thẻ thứ tư. Trực quan bắt chước một chồng.

Vấn đề với cách tiếp cận này là tôi không thể dựa vào lưu lượng bố cục bình thường để định vị các thẻ, mà hút vì nhiều lý do. Nếu tôi sử dụng position: relative cho các thẻ ở trạng thái mở rộng, chúng sẽ chuyển đổi độc đáo từng cái một. Nhưng quá trình chuyển đổi sang trạng thái thu gọn không hoạt động - chỉ cần chụp từ vị trí này sang vị trí khác trong giây lát. Đây là ofcourse hợp lý kể từ khi không có vị trí tuyệt đối ở nơi đầu tiên, trình duyệt rõ ràng không biết từ nơi để chuyển đổi từ.

Những gì tôi có cho đến nay là này (Fiddle):

CSS (chỉ quy định có liên quan):

div.deck-container { 
    position: relative; 
} 
div.deck-container li { 
    display: inline-block; 
    position: relative; 

    -webkit-transition: all 0.5s ease-in-out; 
    -moz-transition: all 0.5s ease-in-out; 
    -o-transition: all 0.5s ease-in-out; 
    -ms-transition: all 0.5s ease-in-out; 
    transition: all 0.5s ease-in-out; 
} 
div.deck-container.collapsed li { 
    position: absolute; 
    left: 9px; 
    top: 6px; 
} 
div.deck-container.collapsed li:first-child { 
    left: 0; 
    top: 0px; 
} 
div.deck-container.collapsed li:nth-child(2) { 
    left: 3px; 
    top: 2px; 
} 
div.deck-container.collapsed li:nth-child(3) { 
    left: 6px; 
    top: 4px; 
} 

HTML (đánh dấu liên quan chỉ):

<div class="deck-container"> 
    <ul> 
     <li>Card 1</li> 
     <li>Card 2</li> 
     <li>Card 3</li> 
     <li>Card 4</li> 
     <li>Card 5</li> 
    </ul> 
</div> 

Trong hoàn hảo của tôi trên thế giới, thêm lớp collapsed vào div.deck-container sẽ tạo hiệu ứng cho các thẻ thành các vị trí bị thu hẹp và ngược lại, nhưng có vẻ như điều này là không thể. Xin vui lòng ai đó nói với tôi tôi là sai.

Trả lời

36

Không, bạn không thể tạo hoạt ảnh cho thuộc tính position. Chỉ có một số thuộc tính css bạn có thể tạo hiệu ứng động và hầu hết trong số chúng có số hoặc màu làm giá trị (Với một số ngoại lệ). Bạn có thể xem danh sách này trong số w3c css transitions especification.

Dù sao, vì bạn có thể tạo hoạt ảnh topleft thuộc tính, bạn có thể thay đổi đánh dấu một chút để đạt được hiệu quả, như trong this fiddle.

div.deck-container { 
    position: relative; 
} 
div.deck-container li { 
    background-color: #fff; 
    position: absolute; 
    border: 1px solid black; 
    padding: 3px; 
    display: inline-block; 
    -webkit-transition: all 0.5s ease-in-out; 
    -moz-transition: all 0.5s ease-in-out; 
    -o-transition: all 0.5s ease-in-out; 
    -ms-transition: all 0.5s ease-in-out; 
    transition: all 0.5s ease-in-out; 
} 
div.deck-container li { 
    left: 160px; 
    top: 0px; 
} 
div.deck-container li:first-child { 
    left: 0px; 
    top: 0px; 
} 
div.deck-container li:nth-child(2) { 
    left: 40px; 
    top: 0px; 
} 
div.deck-container li:nth-child(3) { 
    left: 80px; 
    top: 0px; 
} 
div.deck-container li:nth-child(4) { 
    left: 120px; 
    top: 0px; 
} 
div.deck-container.collapsed li { 
    left: 12px; 
    top: 8px; 
} 
div.deck-container.collapsed li:first-child { 
    left: 0; 
    top: 0px; 
} 
div.deck-container.collapsed li:nth-child(2) { 
    left: 3px; 
    top: 2px; 
} 
div.deck-container.collapsed li:nth-child(3) { 
    left: 6px; 
    top: 4px; 
} 
div.deck-container.collapsed li:nth-child(4) { 
    left: 9px; 
    top: 6px; 
} 

Tôi chỉ đặt vị trí ban đầu cho tuyệt đối và định vị các yếu tố đó. Sau đó, khi chuyển sang lớp, chỉ thay đổi thuộc tính topleft, do đó quá trình chuyển đổi hoạt động.

+1

tôi sợ điều này.Tôi biết rằng có thể bằng cách sử dụng định vị tuyệt đối trong trạng thái mở rộng để tạo hiệu ứng động giữa các trạng thái. Nhưng đó là trường hợp tôi cũng chỉ là tốt hơn-thậm chí tốt hơn-với giải pháp JavaScript hiện tại của tôi hỗ trợ vì số lượng thẻ trong một boong không phải là hữu hạn. –

+1

Ah, trong trường hợp đó bạn chắc chắn cần JS ... Dù sao, như một giải pháp hỗn hợp, bạn có thể đặt các vị trí trên cùng và trái bằng cách sử dụng JS, có thể dễ dàng và sau đó tạo hiệu ứng cho chúng bằng cách sử dụng các hiệu ứng chuyển tiếp. – scumah

+0

Chỉ chuyển tiếp các chức năng di chuột? Tôi có thể di chuyển thử nghiệm div # khi tôi di chuột trên div # hoverdiv không? – ShibinRagh

15

@ nikc.org Có lẽ bạn có thể sử dụng thay vì translate:

div.deck-container { 
     position: relative; 
    } 
    div.deck-container li { 
     background-color: #fff; 
     position: relative; 
     border: 1px solid black; 
     padding: 3px; 
     display: inline-block; 
     -webkit-transition: all 0.5s ease-in-out; 
     -moz-transition: all 0.5s ease-in-out; 
     -o-transition: all 0.5s ease-in-out; 
     -ms-transition: all 0.5s ease-in-out; 
     transition: all 0.5s ease-in-out; 
    } 

    div.deck-container.collapsed li:first-child { 
     -webkit-transform: translate(0, 0); 
     -moz-transform: translate(0, 0); 
      -ms-transform: translate(0, 0); 
      -o-transform: translate(0, 0); 
       transform: translate(0, 0); 
    } 
    div.deck-container.collapsed li:nth-child(2) { 
     -webkit-transform: translate(-100%, 2px); 
     -moz-transform: translate(-100%, 2px); 
      -ms-transform: translate(-100%, 2px); 
      -o-transform: translate(-100%, 2px); 
       transform: translate(-100%, 2px); 
    } 
    div.deck-container.collapsed li:nth-child(3) { 
     -webkit-transform: translate(-200%, 4px); 
     -moz-transform: translate(-200%, 4px); 
      -ms-transform: translate(-200%, 4px); 
      -o-transform: translate(-200%, 4px); 
       transform: translate(-200%, 4px); 
    } 

working example

+0

Điều đó rất hay. Cảm ơn. –

+0

Vâng, điều đó đã thực hiện thủ thuật trong một tình huống trong đó quá trình chuyển đổi không hoạt động. –

Các vấn đề liên quan