如何在边框后面创建阴影?
How can I create a shadow behind a border?
我有一个包含包含我的文本的 span 元素的锚点。 span 元素具有这些属性
border-bottom: 5px solid #59DFB8;
padding-bottom: 2px;
现在我想在边框后面创建一个阴影,而不是整个文本。在不放弃响应能力的情况下我该怎么做?
.selected {
border-bottom: 5px solid #59DFB8;
padding-bottom: 2px;
box-shadow: 10px 10px 10px #59DFB8;
}
<div class="nav">
<ul>
<li><a href="index.html"><span class="selected">Home</span><span class="shadow"></span></a></li>
<li><a href="">Projects</a></li>
<li><a href="about.html">About</a></li>
</ul>
</div>
示例:
您可以使用 :after 或 :before 伪元素来实现。
.selected {
display: block;
float: left;
position: absolute;
width: 100%;
border-bottom: 5px solid #59DFB8;
padding-bottom: 2px;
box-shadow: 10px 10px 10px #59DFB8;
}
<div class="nav">
<ul>
<li><a href="index.html"><span class="selected">Home</span><span class="shadow"></span></a></li>
<li><a href="">Projects</a></li>
<li><a href="about.html">About</a></li>
</ul>
</div>
我正要详细说明,但我看到伍德罗抢先了我一分钟。 ;p
box-shadow
属性 始终使用其包含元素的边界框。您不能将它仅应用于元素的一部分,因此您需要专门为您想要有阴影的部分创建一个元素。
一种解决方案是使用伪元素创建 .selected
元素的子元素,并使该子元素 看起来 像下划线/底部边框。然后你可以应用box-shadow
。
使您的 .selected
元素成为行内块,以便其宽度根据其内容调整大小。然后使用 ::after
伪选择器在其中创建一个块元素,大小为父元素的宽度,高度为 5 像素,背景为纯色。
.selected {
/* so that its bounding box is only as wide as its contents */
display: inline-block;
}
.selected::after {
/* pseudo-elements must have content in order to render; give it a blank string */
content: '';
/* so it fills the parent horizontally */
display: block;
/* adjust to how tall you want the "bottom border" to be */
height: 5px;
/* color for the "bottom border" */
background: #59DFB8;
/* here's the shadow effect, adjust offsets and color as desired */
box-shadow: 10px 10px 10px #59DFB8;
}
这是一个完整的示例,其中包含简化的标记和一些额外的样式,使其看起来更像您的示例图片。
ul {
list-style: none;
display: block;
background: #003447;
padding: 20px;
}
ul li {
display: inline-block;
padding-left: 20px;
padding-right: 20px;
}
ul li a {
font-family: Arial, sans-serif;
font-size: 20px;
color: #59DFB8;
text-decoration: none;
text-transform: uppercase;
}
ul li a::after {
content: '';
display: block;
margin-top: 5px;
height: 2px;
background: #59DFB8;
}
ul li a.selected::after {
box-shadow: 0px 0px 10px 1px #59DFB8;
}
ul li a:active::after,
ul li a:hover::after {
visibility: hidden;
}
ul li a.selected:active::after,
ul li a.selected:hover::after {
visibility: visible;
}
<ul>
<li><a href="index.html" class="selected">Home</a></li>
<li><a href="">Projects</a></li>
<li><a href="about.html">About</a></li>
</ul>
没有看到您希望它看起来如何的示例,我不得不猜测。该方法可能取决于您想要的效果有多微妙。在这里,我添加了一个带有负扩散和半透明填充的盒子阴影:
a{text-decoration:none; color:#555;}
a:hover, a.active {
color:#000;
border-bottom: 5px solid #59DFB8;
padding-bottom: 2px;
box-shadow: 0 8px 10px -8px hsl(0, 0%, 40%);
}
.nav ul {margin:0; padding:0; display:flex;}
.nav li {margin:15px; list-style-type:none;}
<div class="nav">
<ul>
<li><a href="index.html" class="active">Home</a></li>
<li><a href="">Projects</a></li>
<li><a href="">About</a></li>
<li><a href="">A Long One</a></li>
</ul>
</div>
我有一个包含包含我的文本的 span 元素的锚点。 span 元素具有这些属性
border-bottom: 5px solid #59DFB8;
padding-bottom: 2px;
现在我想在边框后面创建一个阴影,而不是整个文本。在不放弃响应能力的情况下我该怎么做?
.selected {
border-bottom: 5px solid #59DFB8;
padding-bottom: 2px;
box-shadow: 10px 10px 10px #59DFB8;
}
<div class="nav">
<ul>
<li><a href="index.html"><span class="selected">Home</span><span class="shadow"></span></a></li>
<li><a href="">Projects</a></li>
<li><a href="about.html">About</a></li>
</ul>
</div>
示例:
您可以使用 :after 或 :before 伪元素来实现。
.selected {
display: block;
float: left;
position: absolute;
width: 100%;
border-bottom: 5px solid #59DFB8;
padding-bottom: 2px;
box-shadow: 10px 10px 10px #59DFB8;
}
<div class="nav">
<ul>
<li><a href="index.html"><span class="selected">Home</span><span class="shadow"></span></a></li>
<li><a href="">Projects</a></li>
<li><a href="about.html">About</a></li>
</ul>
</div>
我正要详细说明,但我看到伍德罗抢先了我一分钟。 ;p
box-shadow
属性 始终使用其包含元素的边界框。您不能将它仅应用于元素的一部分,因此您需要专门为您想要有阴影的部分创建一个元素。
一种解决方案是使用伪元素创建 .selected
元素的子元素,并使该子元素 看起来 像下划线/底部边框。然后你可以应用box-shadow
。
使您的 .selected
元素成为行内块,以便其宽度根据其内容调整大小。然后使用 ::after
伪选择器在其中创建一个块元素,大小为父元素的宽度,高度为 5 像素,背景为纯色。
.selected {
/* so that its bounding box is only as wide as its contents */
display: inline-block;
}
.selected::after {
/* pseudo-elements must have content in order to render; give it a blank string */
content: '';
/* so it fills the parent horizontally */
display: block;
/* adjust to how tall you want the "bottom border" to be */
height: 5px;
/* color for the "bottom border" */
background: #59DFB8;
/* here's the shadow effect, adjust offsets and color as desired */
box-shadow: 10px 10px 10px #59DFB8;
}
这是一个完整的示例,其中包含简化的标记和一些额外的样式,使其看起来更像您的示例图片。
ul {
list-style: none;
display: block;
background: #003447;
padding: 20px;
}
ul li {
display: inline-block;
padding-left: 20px;
padding-right: 20px;
}
ul li a {
font-family: Arial, sans-serif;
font-size: 20px;
color: #59DFB8;
text-decoration: none;
text-transform: uppercase;
}
ul li a::after {
content: '';
display: block;
margin-top: 5px;
height: 2px;
background: #59DFB8;
}
ul li a.selected::after {
box-shadow: 0px 0px 10px 1px #59DFB8;
}
ul li a:active::after,
ul li a:hover::after {
visibility: hidden;
}
ul li a.selected:active::after,
ul li a.selected:hover::after {
visibility: visible;
}
<ul>
<li><a href="index.html" class="selected">Home</a></li>
<li><a href="">Projects</a></li>
<li><a href="about.html">About</a></li>
</ul>
没有看到您希望它看起来如何的示例,我不得不猜测。该方法可能取决于您想要的效果有多微妙。在这里,我添加了一个带有负扩散和半透明填充的盒子阴影:
a{text-decoration:none; color:#555;}
a:hover, a.active {
color:#000;
border-bottom: 5px solid #59DFB8;
padding-bottom: 2px;
box-shadow: 0 8px 10px -8px hsl(0, 0%, 40%);
}
.nav ul {margin:0; padding:0; display:flex;}
.nav li {margin:15px; list-style-type:none;}
<div class="nav">
<ul>
<li><a href="index.html" class="active">Home</a></li>
<li><a href="">Projects</a></li>
<li><a href="">About</a></li>
<li><a href="">A Long One</a></li>
</ul>
</div>