하나를 제외한 모든면에 CSS3 상자 그림자 만들기


115

열려있는 탭에 다른 탭과 구분할 수있는 그림자가있는 탭 탐색 모음이 있습니다. 또한 전체 탭 섹션에 단일 그림자 (하단 수평선 참조)가 올라가고 열려있는 탭을 제외한 모든 탭의 하단이 음영 처리되기를 바랍니다.

CSS3의 box-shadow속성 을 사용 하여 원하는 부분 만 음영 처리하는 방법을 찾을 수 없습니다.

일반적으로 열린 탭의 하단 그림자를 콘텐츠 영역 (높은 z-index)으로 덮지 만이 경우 콘텐츠 영역 자체에 그림자가있어서 탭을 덮을뿐입니다.

탭 레이아웃

     _______ _______ _______
    | | | | | |
____ | _______ | __ | | __ | _______ | ______

그림자 선.

그림자는 수평선에서 위로 올라가고 수직선의 바깥쪽으로 올라갑니다.

                _______
               | |
_______________ | | _________________

다음 은 실제 예입니다.

천재들, 도움이 필요하십니까?


23
@the_drow Re : CSS3, 그림자, 둥근 모서리 등과 같은 디자인 기능을 최신 브라우저를 사용하는 사용자에게 보상으로 고려하고 싶습니다.
bloudermilk

3
와우 이것은 정확히 내가 필요한 것입니다. 질문이 이미 존재하여 기쁩니다. 나도 당신이 보여준 것과 똑같은 탭에 이것을 적용하고 싶습니다. 와우 와우 와우 : D
Jorge Israel Peña

이 문제를 해결하는 또 다른 좋은 방법은 의사 요소를 사용하는 것입니다. 자세한 내용은 내 대답을 참조하십시오.
Silver Ringvee 2016

여기 의사 요소-솔루션에 대한 자세한 내용을 참조하십시오 stackoverflow.com/a/38372215/4769218
실버 Ringvee

나는 이것이 오래된 질문이라는 것을 알고 있지만 탭의 크기를 알고 있습니까? 아니면 유연합니까? 높이는 설정되어 있지만 너비는 설정되어 있지 않을 수 있습니다.
Luke

답변:


72

샘플에서이 스타일로 #content 안에 div를 만듭니다.

#content_over_shadow {
    padding: 1em;
    position: relative; /* look at this */
    background:#fff;    /* a solid background (non transparent) */
}

#content 스타일 변경 (패딩 제거) 및 그림자 추가

#content {
    font-size: 1.8em;
    box-shadow: 0 0 8px 2px #888; /* line shadow */
}

탭에 그림자 추가 :

#nav li a {
    margin-left: 20px;
    padding: .7em .5em .5em .5em;
    font-size: 1.3em;
    color: #FFF;
    display: inline-block;
    text-transform: uppercase;
    position: relative;
    box-shadow: 0 0 8px 2px #888; /* the shadow */
}

이 솔루션에서 누락 된 것이 있습니다. 그의 코드를 편집하고 권장되는 스타일을 적용해도 여전히 '선택됨'탭 위에 그림자가 생깁니다. 오버플로가있는 것 같습니다 : 숨겨진 누락?
Bob Spryn

1
네. 오버플로가 필요합니다. 작동하려면 탐색에 숨겨져 있습니다.
Bob Spryn

1
에 표시된 '선 그림자' #content_over_shadow는 실제로 #content'의 스타일 이어야합니다 .
AppleGrew 2011 년

이 솔루션 mabe는 2009 년에 정확했지만 지금은 그렇지 않습니다. 정답은 stackoverflow.com/a/9800481/835753
Guilherme 페레이라


25

오버플로로 잘라냅니다.

div div {box-shadow:0 0 5px #000; height:20px}
div {overflow:hidden;height:25px; padding:5px 5px 0 5px}
<div><div>tab</div></div>


3
다음은 overflow starikovs.com/2011/11/09/css3-one-side-shadow 로 잘라내는 예입니다 .
starikovs

이 바닥면 당신이 그림자 원하지 않는 경우이 방법은 작동합니다
andrhamm

잘 작동합니다! 상위 div는 올바른 위치에 배치 될 수 있습니다.z-index
Rvanlaak 2013 년

나는 현재이 솔루션을 사용하고 있습니다 (페이스 북과 같은 버튼) 오버플로 해야하는 자식 요소에 문제가 있습니다.
Loenix

1
요소의 높이를 설정해야하므로 대부분의 반응 형 디자인에는 그다지 유용하지 않습니다
Jonathan Tonge 2013

13

모서리 주위에 그림자가 없다는 경고와 함께 원하는 효과를 얻기 위해 다른 div없이 여러 CSS 그림자를 사용할 수 있습니다.

div.shadow {
    -webkit-box-shadow: 0 -3px 3px -3px black, 3px 0px 3px -3px black, -3px 0px 3px -3px black;
    -moz-box-shadow:    0 -3px 3px -3px black, 3px 0px 3px -3px black, -3px 0px 3px -3px black;
    box-shadow:         0 -3px 3px -3px black, 3px 0px 3px -3px black, -3px 0px 3px -3px black;
    height: 25px
}
 <div style="height: 25px"><div class="shadow">tab</div></div>

전반적으로 매우 방해가되지 않습니다.


1
이것은 훌륭한 해결책이 될 것이지만, 당신이 말했듯이 모서리가 불안정합니다. jsfiddle.net/mahemoff/ZStTr
mahemoff

1
둥근 모서리로 내 삽입 된 그림자 요구 사항에 대한 매력처럼 작동했습니다. 감사!
Bruno Ely

9

이 문제를 해결하는 다소 창의적인 또 다른 방법은 요소 중 하나에 : after 또는 : before 의사 요소를 추가하는 것입니다. 제 경우에는 다음과 같습니다.

#magik_megamenu>li:hover>a:after {
    height: 5px;
    width: 100%;
    background: white;
    content: '';
    position: absolute;
    bottom: -3px;
    left: 0;
}

더 잘 보이게하기 위해 유사 요소를 빨간색으로 만든 스크린 샷을 참조하십시오.

더 잘 보이게하기 위해 유사 요소를 빨간색으로 만든 스크린 샷을 참조하십시오.


7

개인적으로 나는 여기에서 찾은 솔루션이 가장 마음에 듭니다 . http://css3pie.com/demos/tabs/

그것은 당신이 그것을 오버레이하는 아래 콘텐츠의 그림자가 여전히 남아있는 배경색으로 0 상태 또는 호버 상태를 가질 수 있습니다. 위의 방법으로 가능한지 확실하지 않습니다.

호버 상태가있는 음영 탭

최신 정보:

사실 나는 틀렸다. 수락 된 솔루션이 위에 표시된 호버 상태를 지원하도록 할 수 있습니다. 이 작업을 수행:

a에 양의 친척을 갖는 대신 아래의 #content div보다 높지만 (그림자가있는) Z- 색인보다 낮은 z- 색인을 사용하여 a.active 클래스에 넣으십시오. content_wrapper.

예를 들면 :

<nav class="ppMod_Header clearfix">
    <h1 class="ppMod_PrimaryNavigation-Logo"><a class="ppStyle_Image_Logo" href="/">My company name</a></h1>
    <ul class="ppList_PrimaryNavigation ppStyle_NoListStyle clearfix">
        <li><a href="/benefits">Benefits</a></li>
        <li><a class="ppStyle_Active" href="/features">Features</a></li>
        <li><a href="/contact">Contact</a></li>
        <li><a href="/company">Company</a></li>
    </ul>
</nav>
<div id="ppPage-Body">
    <div id="ppPage-BodyWrap">
        content goes here
    </div>
</div>

그런 다음 CSS로 :

#ppPage-Body
    box-shadow: 0 0 12px rgba(0,0,0,.75)
    position: relative /* IMPORTANT PART */

#ppPage-BodyWrap
    background: #F4F4F4
    position: relative /* IMPORTANT PART */
    z-index: 4 /* IMPORTANT PART */


.ppList_PrimaryNavigation li a:hover
    background: #656565
    -webkit-border-radius: 6px 6px 0 0
    -moz-border-radius: 6px 6px 0 0
    border-radius: 6px 6px 0 0

.ppList_PrimaryNavigation li a.ppStyle_Active
    background: #f4f4f4
    color: #222
    -webkit-border-radius: 6px 6px 0 0
    -moz-border-radius: 6px 6px 0 0
    border-radius: 6px 6px 0 0
    -webkit-box-shadow: 0 0 12px rgba(0,0,0,0.75)
    -moz-box-shadow: 0 0 12px rgba(0,0,0,0.75)
    box-shadow: 0 0 12px rgba(0,0,0,0.75)
    position: relative /* IMPORTANT PART */
    z-index: 3 /* IMPORTANT PART */

7

최신 정보:

clip-path 이제 모든 주요 브라우저에서 지원됩니다.


원래 답변 :

부분적 으로 만 지원되는 실험 기술을 사용하려는 경우 clip-path속성을 사용할 수 있습니다 .

이렇게하면 원하는 효과를 얻을 수 있습니다. 위쪽, 왼쪽 및 오른쪽에 상자 그림자가 있고 아래쪽 가장자리가 깔끔하게 잘립니다.

귀하의 경우에는 clip-path를 사용할 것입니다 : inset (px px px px); 픽셀 값은 문제의 가장자리에서 계산됩니다 (아래 참조).

#container {
    box-shadow: 0 0 8px 2px #888;
    clip-path: inset(-8px -8px 0px -8px);
}

다음 위치에서 문제의 div를 자릅니다.

  • 위쪽 8 픽셀 (그림자 포함)
  • 오른쪽 가장자리 바깥 쪽 8 픽셀 (그림자 포함)
  • 아래쪽에서 0 픽셀 (그림자 숨기기)
  • 왼쪽 가장자리 바깥 쪽 8 픽셀 (그림자 포함)

픽셀 값 사이에는 쉼표가 필요하지 않습니다.

div의 크기는 유연 할 수 있습니다.


불행히도 두 그림자가 겹치는 간격이 있습니다.
sbaechler

@sbaechler 자세히 설명 할 수 있습니까? 그림자가 겹치는 곳은 어디입니까?
루크

4

여러 개의 상자 그림자를 사용하여 그림자를 가릴 수도 있습니다.

상자 그림자 : 0 10px 0 #fff, 0 0 10px #ccc;


1

연결할 두 개의 스팬을 추가 한 경우 다음과 같이 두 개를 사용할 수 있습니다.

box-shadow: -1px -1px 1px #000;

한 번에

box-shadow: 1px -1px 1px #000;

다른. 작동 할 수 있습니다!

그림자가 겹치는 경우 3 개의 그림자를 사용할 수도 있습니다. 하나는 왼쪽으로 1px, 하나는 오른쪽으로 1px, 다른 하나는 위로 1px 또는 원하는 두께로 사용할 수 있습니다.


0

완벽하지는 않지만 일종의 해킹을했지만 괜찮아 보입니다.

<ul class="tabs">
<li class="tab active"> Tab 1 </li>
<li class="tab"> Tab 2 </li>
<li class="tab"> Tab 3 </li>
</ul>

<div class="tab-content">Content of tab goes here</div>

SCSS

 .tabs { list-style-type: none; display:flex;align-items: flex-end;
  .tab {
    margin: 0;
    padding: 4px 12px;
    border: 1px solid $vivosBorderGrey2;
    background-color:$vivosBorderGrey2;
    color: $vivosWhite;
    border-top-right-radius: 8px;
    border-top-left-radius: 8px;
    border-bottom: 0;
    margin-right: 2px;
    font-size: 14px;
    outline: none;
    cursor: pointer;
    transition: 0.2s;
    &.active {
      padding-bottom: 10px;
      background-color: #ffffff;
      border-color: #eee;
      color: $vivosMedGrey;
      border-bottom-color: transparent;
      box-shadow: 0px -3px 8px -3px rgba(0, 0, 0, 0.1);
    }
    &:hover {padding-bottom: 10px;
    }
   } 

.tabContent {
  border: 1px solid #eee;
  padding:10px;
  margin-top: -1px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.