119

我有一个选项卡式导航栏,我希望打开的选项卡有一个阴影,以便将其与其他选项卡区分开来。我还希望整个选项卡部分有一个单一的阴影(见底部水平线)向上,阴影除打开的选项卡之外的所有选项卡的底部。

我将使用 CSS3 的box-shadow属性来做到这一点,但我想不出一种方法来仅对我想要的部分进行着色。

通常我会用内容区域(更高)覆盖打开选项卡的底部阴影z-index,但在这种情况下,内容区域本身有一个阴影,因此最终会覆盖选项卡。

选项卡布局

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

阴影线。

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

                _______
               | |
_______________| |_________________

是一个活生生的例子:

有大神帮忙吗?

4

9 回答 9

73

在您的示例中,使用此样式在 #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 */
}
于 2009-09-20T14:56:05.687 回答
27

用溢出将其切断。

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>

于 2009-09-27T09:15:58.077 回答
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>

总的来说,虽然它非常不引人注目。

于 2012-03-21T07:47:16.657 回答
11

解决此问题的另一种颇有创意的方法是将 :after 或 :before 伪元素添加到其中一个元素中。就我而言,它看起来像这样:

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

看截图,把伪元素变成红色,让它更显眼。

看截图,把伪元素变成红色,让它更显眼。

于 2016-07-14T10:49:37.517 回答
8

更新:

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 的大小可以是灵活的。

于 2017-03-17T02:51:05.720 回答
7

我个人最喜欢这里找到的解决方案:http: //css3pie.com/demos/tabs/

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

带有悬停状态的阴影选项卡

更新:

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

与其在 a 上放置正相关,不如将其放在 a.active 类上,其 z-index 高于您下面的#content div(上面有阴影)但低于您的 z-index内容包装器。

例如:

<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 */
于 2012-01-19T05:53:50.953 回答
4

您也可以使用多个盒子阴影来掩盖阴影。

盒子阴影:0 10px 0 #fff,0 0 10px #ccc;

于 2013-02-20T10:04:12.380 回答
1

如果您添加了两个跨度来挂钩,那么您可以使用两个,例如:

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

在一个跨度和

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

另外一个。可能工作!

如果阴影重叠,您甚至可以使用 3 个阴影 - 一个向左 1px,一个向右 1px,一个向上 1px,或者您想要它们有多厚。

于 2009-09-15T21:40:40.363 回答
0

我做了一种 hack,并不完美,但看起来还不错:

<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);
}
于 2019-02-26T17:45:05.683 回答