2017-03-10 10 views
3

CSS z-index을 사용하여 내 div를 올바르게 스태킹하는 데 문제가 있습니다. 내 코드에서 .nose::before.nose::afterz-index: -1으로 설정하면 두 div가 스택 맨 뒤에 놓입니다. 그러나, 나는 divdiv 뒤에 앉아야 만합니다.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 요소)가 있습니다. 자, 다음과 같은 규칙의 준수해야 루트 요소가되는 :

  • staticauto
  • 불투명 이외의 Z- 인덱스 이외의 <html> 요소
  • 위치를 수 미만 1

기본 스태킹 컨텍스트는 <html> 요소를 루트로 사용합니다.

요소가 범위 (즉, 루트 요소의 하위 요소) 안에 있으면 요소는 범위 내부의 요소에 대해서만 상대적으로 배치 할 수 있습니다.

중첩 목록으로 생각하십시오. 그것이 1로 상대와 Z- 색인 설정 위치를 가지며, 모든 하위 루트로 바꿈과 함께 적층 범위 안에 지금으로

z-index scoping list

랩 여기서, 루트 요소이다.

따라서 중첩 된 목록 에서처럼 특정 요소의 하위는 루트 앞에 표시 될 수 없습니다. 예를 들어 Child2은 내부에 범위가 있기 때문에 Wrap 앞에 표시 할 수 없습니다. 그러나 그것은 Child1 앞에 나타날 수 있습니다. 다음과 같이

지금, 당신의 경우에 구조는 다음과 같습니다가해야 하나 (위치 요소가되기위한 규칙을 준수하지 않기 때문에 머리 루트가 아닌

enter image description here

공지 것을 auto가 아닌 z-index를 가짐). 당신이 얻을 후 따라서 당신은 :: 전 :: 노즈에 -1의 Z- 인덱스를 할당 할 때이 :

enter image description here

는 동일한에 있기 때문에 요소는 모든 방법을 머리 뒤에 배치 된 스태킹 범위. 그러나 요소가 동일한 Z- 색인을 가질 때 html의 출현 순서에 따라 쌓여 있기 때문에 그들은 Head::before의 맨 위에 나타납니다.

이제 머리 자식이 뒤에 나타나지 않도록하려면 z- 색인을 추가해야합니다.그러면 새로운 스태킹 범위의 루트 요소가됩니다.

enter image description here

그러나 이것은 또 다른 문제를 만듭니다. 이제 귀는 머리 꼭대기에 위치합니다. 이것은 css로만 해결할 수 없습니다. 왜냐하면 그것들은 머리의 스태킹 범위 안에 있기 때문입니다. 그리고 뿌리는 항상 모든 아이들 뒤에 있습니다.

해결하려면 머리에서 귀를 움직여야합니다. 따라서, 더 이상 의사 주소 (& 이전)를 사용할 수 없습니다. 머리 밖의 귀 요소를 만들고 다른 요소 (곰이라고 부름)의 모든 것을 위치 상대 값으로 배치하는 것이 좋습니다. 머리에 상대적으로 귀를 위치 시키려면 래퍼가 필요합니다.

답변의 대부분은 this article에서 영감을 받았습니다.