在一个侧面上创建一个CSS3盒子阴影


115

我有一个选项卡式导航栏,我希望在打开的选项卡上添加阴影,以使其与其他选项卡区分开。我还希望整个选项卡部分上有一个阴影(请参阅底部的水平线),以阴影除打开的所有选项卡的底部。

我将使用CSS3的box-shadow属性来执行此操作,但是我无法找出一种仅对所需部分进行着色的方法。

通常,我会用内容区域(较高z-index)遮盖打开的选项卡的底部阴影,但是在这种情况下,内容区域本身会带有阴影,以便最终覆盖该选项卡。

标签布局

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

阴影线。

阴影将从水平线上升,并从垂直线向外上升。

                _______
               | |
________________ | | _________________

是一个实时示例:

天才有什么帮助吗?


23
@the_drow回复:CSS3,我想考虑诸如阴影,圆角等设计功能。这对于使用现代浏览器的用户是一种奖励。
bloudermilk

3
哇,这正是我所需要的,很高兴已经存在一个问题。我也想将此标签应用到与您显示的完全一样的标签上:哇
豪尔赫·以色列·佩尼亚

解决此问题的另一种好方法是使用伪元素,有关更多详细信息,请参见我的答案。
Silver Ringvee '16

请在此处查看伪元素解决方案的详细信息:stackoverflow.com/a/38372215/4769218
Silver Ringvee

我知道这是一个老问题,但是标签的大小已知吗?还是他们灵活?我可以想象可以设置高度,但不能设置宽度吗?
路加福音

Answers:


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 */
}

此解决方案缺少一些内容。编辑他的代码并应用推荐的样式,您仍然在“ selected”选项卡上留下阴影。似乎有一个溢出:隐藏丢失?
Bob Spryn 2010年

1
是的 您将需要一个溢出:使其隐藏在导航上。
Bob Spryn 2010年

1
中显示的“线条阴影” #content_over_shadow实际上应为#content的样式。
AppleGrew

这个解决方案在2009年可能是正确的,但现在不是。正确答案是stackoverflow.com/a/9800481/835753
Guilherme Ferreira 2015年

具有伪元素的解决方案:stackoverflow.com/a/38372215/4769218
Silver Ringvee

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
这也是一个通过溢出starikovs.com/2011/11/09/css3-one-side-shadow切断它的示例。
starikovs 2011年

仅当您不希望阴影
覆盖

很棒!父div可以放置在正确的位置z-index
Rvanlaak

我目前正在使用此解决方案,我在需要溢出的子元素上遇到了一些麻烦(如按钮之类的Facebook)。
Loenix

1
对于大多数响应式设计而言,它不是很有用,因为您必须设置元素的高度
Jonathan Tonge 2013年

13

您可以使用多个CSS阴影,而无需任何其他div来获得理想的效果,同时要注意的是,在角落没有阴影。

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 2012年

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/

它使您可以具有零状态或具有状态颜色的悬停状态,但仍然具有来自其下的内容阴影的阴影。不确定上述方法是否可行:

带悬停状态的阴影选项卡

更新:

其实我是不对的。您可以使接受的解决方案支持上面显示的悬停状态。做这个:

而不是在a上具有正向相对,将其放在a.active类中,其z-index高于下面的#content div(上面有阴影),但低于您的z-index 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 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

您也可以使用多个框阴影掩盖阴影。

box-shadow:0 10px 0 #fff,0 0 10px #ccc;


1

如果添加了两个跨度,则可以使用两个,例如:

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

在一个跨度上

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

另外一个。可能会工作!

如果阴影重叠,您甚至可以使用3个阴影-左边1个像素,右边1个像素,上方1个像素,或者您想要它们的厚度。


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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.