创建一个 CSS3框阴影的所有方面,除了一个

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

我将使用 CSS3的 box-shadow属性来做到这一点,但是我不能找到一种方法来只遮盖我想要的部分。

通常,我会用内容区域(高于 z-index)覆盖打开标签的底部阴影,但是在这种情况下,内容区域本身有一个阴影,所以最终会覆盖标签。

标签布局

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


阴影线。

阴影会从水平线上升,从垂直线向外延伸。

_______
|       |
_______________|       |_________________


Here is a live example:

有人帮忙吗,天才们?

106236 次浏览

如果你增加了两个跨度,那么你可以使用两个,比如:

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

在一个跨度和

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

另一个,可能有用!

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

In your sample create a div inside #content with this style

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

and change #content style (remove paddings) and add shadow

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

用溢出物把它切掉。

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>

Personally I like the solution found here best: http://css3pie.com/demos/tabs/

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

shadowed tab with hover state

更新:

实际上我错了。您可以让已接受的解决方案支持上面显示的悬浮状态。这样做:

不要在 a 上使用正相对,而是将它放在 a.active 类上,其 z 索引高于下面的 # content div (上面有阴影) ,但低于 content _ wrapper 上的 z 索引。

For example:

<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
border-radius: 6px 6px 0 0


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

您可以使用多个 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>

Overall though its very unintrusive.

你也可以使用多个方块阴影来掩盖阴影。

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

解决这个问题的另一种相当有创造性的方法是向其中一个元素添加: after 或: before 伪元素。我的情况是这样的:

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

查看截图,使伪元素变成红色,使其更加可见。

See the screenshot, made the pseudo element red to make it more visible.

更新:

现在(2020年)所有主流浏览器都支持 clip-path


原答案:

如果你愿意使用只有 部分支持的实验技术,你可以使用 clip-path财产

This will produce the desired effect: a box shadow on the top, left and right sides with a clean cut-off on the bottom edge.

在您的情况下,您将使用剪切路径: 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像素(包括阴影)

Note that no commas are required between pixel values.

Div 的大小可以是灵活的。

I did a sort of hack, not perfect, but it looks okay:

<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);
}
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);