1. 程式人生 > >CSS中的層疊效果

CSS中的層疊效果

引言

在 HTML 中 DOM 節點正常來說是後面出現的會覆蓋在前面出現的上面,現在要求不適用z-index要實現這樣的一個效果:

image

準備工作

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>TEMP</title>
  <style>
    .container {
      width: 500px;
      height: 100px;
      border: 5px solid lightgrey
; font-size: 0; }
.container li { display: inline-block; width: 50px; height: 50px; margin-left: -10px; line-height: 50px; border-radius: 50%; border: 1px solid red; font-size: 14px; text-align: center; } .container li:nth-child(2n)
{ background: ivory; } .container li:nth-child(2n+1){ background: azure; }
</style> </head> <body> <ul class="container"> <li class="first">1</li> <li class="second">2</li> <li class="second">3</li> <li class
="second">
4</li> </ul> </body> </html>

這樣的目前效果是:

image

層疊規則

  • 誰大誰上:當具有明顯的層疊水平標示的時候,如識別的z-indx值,在同一個層疊上下文領域,層疊水平值大的那一個覆蓋小的那一個。通俗講就是官大的壓死官小的。
  • 後來居上:當元素的層疊水平一致、層疊順序相同的時候,在DOM流中處於後面的元素會覆蓋前面的元素。

方法1: 使用direction + transform:scale(1)

.container{
    direction: rtl;
}
.container li + li{
    transform: scale(1);
}

對於這個不用 z-index 而具有層疊效果的,並不是只有 transform,還有幾個屬性,可參考張鑫旭的文章:《深入理解CSS中的層疊上下文和層疊順序》

可以改變層疊順序的屬性包括:

  • z-index值不為auto的flex項(父元素display:flex|inline-flex).
  • 元素的opacity值不是1.
  • 元素的transform值不是none.
  • 元素mix-blend-mode值不是normal.
  • 元素的filter值不是none.
  • 元素的isolation值是isolate.
  • will-change指定的屬性值為上面任意一個。
  • 元素的-webkit-overflow-scrolling設為touch.

方法2:float:right

.container li{
    float:right
}

方法3:flex

.container {
    display: flex;
    flex-direction: row-reverse;
}

方法4:rotate

.container {
    transform: rotate(90deg)
}
.container li {
    display: block;
    transform: rotate(-90deg) translateY(200px);
    margin-bottom: -10px;
    margin-left: 0;
}

出處