2017-03-10 3 views
3

CSS z-indexを使用してdivを正しく積み重ねる際に問題があります。私のコードでは、.nose::before.nose::afterz-index: -1に設定すると、2つのdivがスタックの最後に配置されます。しかし、私はこれらのdivsが.nose divの背後に座っているだけです。Zインデックスを含む擬似要素を積み重ねる

*, *::after, *::before { 
 
    box-sizing: border-box; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
html, body { height: 100%; } 
 

 
body { 
 
    background: #44BBA4; 
 
} 
 

 
.head { 
 
    position: absolute; 
 
    margin: auto; 
 
    top: 0; 
 
    right: 0; 
 
    bottom: 0; 
 
    left: 0; 
 
    height: 375px; 
 
    width: 400px; 
 
    background: #df9e27; 
 
    border-radius: 50%; 
 
    border: 10px solid #000; 
 
} 
 

 
.head::before, .head::after { 
 
    content: ""; 
 
    position: absolute; 
 
    height: 90px; 
 
    width: 90px; 
 
    background: #df9e27; 
 
    border-radius: 50%; 
 
    border: 10px solid #000; 
 
    z-index: -1; 
 
} 
 

 
.head::before { 
 
    top: -30px; 
 
    left: 40px; 
 
} 
 

 
.head::after { 
 
    top: -30px; 
 
    right: 40px; 
 
} 
 

 
.eye { 
 
    position: absolute; 
 
    top: 150px; 
 
    height: 25px; 
 
    width: 25px; 
 
    background: #000; 
 
    border-radius: 50%; 
 
} 
 

 
.eye.left { 
 
    left: 90px; 
 
} 
 

 
.eye.right { 
 
    right: 90px; 
 
} 
 

 
.eye::before { 
 
    content: ""; 
 
    position: absolute; 
 
    top: -50px; 
 
    left: -37px; 
 
    height: 100px; 
 
    width: 100px; 
 
    border-radius: 50%; 
 
    border: 12px solid transparent; 
 
    border-top: 12px solid #000; 
 
} 
 

 
.nose { 
 
    position: absolute; 
 
    margin: auto; 
 
    right: 0; 
 
    left: 0; 
 
    bottom: 130px; 
 
    height: 30px; 
 
    width: 30px; 
 
    background: #000; 
 
    border-radius: 50%; 
 
} 
 

 
.nose::before, .nose::after { 
 
    content: ""; 
 
    position: absolute; 
 
    height: 68px; 
 
    width: 73px; 
 
    background: #fff; 
 
    border-radius: 50%; 
 
    border: 10px solid #000; 
 
    z-index: -1; 
 
}
<div class="head"> 
 
    <div class="eye left"></div> 
 
    <div class="eye right"></div> 
 
    
 
    <div class="nose"></div> 
 
</div>

+1

ノーズ 'z-index'を3に、前後を2に設定するのはなぜですか? –

+0

ええ、私は前にそのようなものを試しましたが、何らかの奇妙な理由のためにうまくいきませんでした。 –

答えて

1

要するに:あなたの頭の要素に集合Z-指数ここに私のコードです。ヘッド要素から耳を離します。

これが理由です。

z-indexにはスタッキングコンテキストがあります。これらの各コンテキストには、ルート要素(すべてのhtml要素)があります。今、それは以下のルールのいずれかに従わなければならないルート要素になること:

  • する1
次いで auto
  • 不透明度未満の他の<html>素子
  • static以外の位置及びz屈折率であります

    したがって、デフォルトのスタッキングコンテキストは、<html>要素をルートとして使用します。

    要素がスコープ(ルート要素の子)内に配置されると、その要素はスコープ内の要素に対して相対的に配置することができます。

    ネストされたリストと考えてください。それは1に相対的とzインデックスに設定された位置を持っており、そのすべての子がルートとしてラップとスタッキング範囲内で今のよう

    z-index scoping list

    ラップは、ここでは、ルート要素です。

    したがって、ネストされたリストの場合と同様に、特定の要素の子はそのルートの前には表示されません。たとえば、Child2は、Wrapの前には表示されません。その範囲はスコープ内であるためです。しかし、それはChild1の前に現れることがあります。次のように

    は今、あなたのケースで構造がある:それは、1つ(位置の要素になるためのルールでなければなりません準拠していないので、ヘッドは、ルートではないことを

    enter image description here

    をお知らせauto以外のz-indexを持つ)。したがって、あなたは、この取得した後の前に::鼻に-1のzインデックスを割り当てると::とき:彼らは同じであるため、

    enter image description here

    を要素は、すべての方法頭の後ろに配置されていますスタッキングスコープ。しかし、要素は同じz-インデックスを持つので、htmlの出現順に従ってスタックされるため、Head::beforeの上に表示されます。

    これで、頭の子供が後ろに現れないようにするには、z-indexを追加する必要があります。これにより、新しいスタッキングスコープのルート要素になります。

    enter image description here

    しかし、これは別の問題を作成します。耳は頭の上に置かれます。これはcssだけでは解決できません。なぜなら、それらはヘッドの積み重ねスコープの内側にあるからです。根は常にそのすべての子供の背後にある。

    これを解決するには、耳を頭から動かす必要があります。つまり、あなたはもはや擬似要素(後に&の前)を使用することはできません。私は頭の外側に耳の要素を作成し、他の要素(クマと名づけられたもの)のすべてを包括することをお勧めします。あなたはまだ頭に相対して耳を配置したい場合はラッパーが必要です。

    答えはほとんどがthis articleからインスピレーションを受けています。

  • 関連する問題