我有一个元素,想要在其中一个端点上产生阴影效果,就像这个Photoshop的图片一样:
我最接近的实现方式是使用这段HTML+CSS3代码:
那么,是否可以使阴影变得渐变,就像第一张图片一样?以下是我的代码:
box-shadow: 0px 0px 5px 1px rgba(0,0,0,.4);
确实可以只用CSS实现这种效果,但是CSS非常难理解:
.container {
background-color: rgba(168,214,255,1);
padding: 20px;
}
.tab {
height: 50px;
background-color: #4790CE;
margin-bottom: 10px;
border-radius: 20px;
position: relative;
}
.tab.active {
background-color: #63B6FF;
border-radius: 20px 0 0 20px;
box-shadow: 0 0 15px #3680BD;
}
.tab .shadow {
position: absolute;
top: -10px;
left: 50px;
right: -20px;
bottom: -10px;
border-radius: 20px;
background-color: transparent;
-webkit-border-image: -webkit-gradient(linear, left top, right top, color-stop(10%,rgba(168,214,255,0)), color-stop(80%,rgba(168,214,255,1))) 50 50 stretch;
border-width: 10px 20px 10px 0;
}
你基本上使用border-image来遮盖投影。你可以通过 :after 伪选择器实现这一点而不需要额外的标记,但是 :after 在动画方面表现得不好。
在jsfiddle上查看演示(仅适用于Webkit,但您可以轻松地将其适应到FF。不幸的是,IE9将无法使用)。
:after
伪类(Webkit)实现它。http://jsfiddle.net/HerrSerker/Zb5Qn/26/ - yunzen<div class="container">
<div class="tab">
<div class="content">Tab3</div>
</div>
<div class="tab active">
<div class="shadow1"></div>
<div class="shadow2"></div>
<div class="content">Tab2</div>
</div>
<div class="tab">
<div class="content">Tab3</div>
</div>
</div>
.container {
background-color: rgba(255,255,255,1);
padding: 20px;
}
.tab {
position: relative;
}
.tab .content{
height: 50px;
background-color: #4790CE;
margin-bottom: 10px;
border-radius: 20px;
position: relative;
line-height: 50px;
padding-left: 50px;
}
.tab.active .content {
background-color: #63B6FF;
border-radius: 20px 0 0 20px;
position:relative;
}
.tab .content {
position:relative;
z-index:2;
background: red;
}
.tab .shadow1 {
box-shadow: 0px 0px 5px 1px rgba(0,0,0,.4);
position:absolute;
top: 0;
left: 0;
right:10px;
bottom: 50%;
border-radius: 20px 0 0 3px;
z-index: 1;
-moz-transform: rotate(0.5deg);
-moz-transform-origin: 0 50%;
-webkit-transform: rotate(0.5deg);
-webkit-transform-origin: 0 50%;
-o-transform: rotate(0.5deg);
-o-transform-origin: 0 50%;
-ms-transform: rotate(0.5deg);
-ms-transform-origin: 0 50%;
}
.shadow2 {
box-shadow: 0px 0px 5px 1px rgba(0,0,0,.4);
position:absolute;
top: 50%;
left: 0;
right:10px;
bottom: 0;
border-radius: 3px 0 0 20px;
z-index: 1;
-webkit-transform: rotate(-0.5deg);
-webkit-transform-origin: 0 50%;
-moz-transform: rotate(-0.5deg);
-moz-transform-origin: 0 50%;
-o-transform: rotate(-0.5deg);
-o-transform-origin: 0 50%;
-ms-transform: rotate(-0.5deg);
-ms-transform-origin: 0 50%;
}
.container {
background-color: rgba(168,214,255,1);
padding: 20px;
}
.tab {
height: 50px;
background-color: #4790CE;
margin-bottom: 10px;
border-radius: 20px;
position: relative;
}
.tab.active {
background-color: #63B6FF;
border-radius: 20px 0 0 20px;
transform: perspective(150px);
transform-style: preserve-3d; /* this puts shadow behind the .tab.active without the need of z-index. */
}
.tab.active .shadow {
position: absolute;
top: 0px; left: 0px;
right: 0px; bottom: 0px;
border-radius: 20px;
transform-origin: left center 0px;
transform: rotateY(6deg);
box-shadow: 0 0 10px 2px #050d4b;
}
<div class="container">
<div class="tab"></div>
<div class="tab active">
<div class="shadow"></div>
</div>
<div class="tab"></div>
</div>
你需要将元素分成两个部分 - 左侧带有阴影的一部分,只需要几个像素 - 可能不超过五个 - 其余部分将是所有不需要阴影的内容。
将元素分成两个部分后,你会得到类似于以下的一些 CSS:
#left-shadow
box-shadow: 0px 0px 5px 1px rgba(0,0,0,.4);
#right-no-shadow
box-shadow 0px 0px 0px 0px
我认为可以通过创建比真实条形图更短的克隆条形图,将阴影应用于克隆条形图,并使用颜色渐变隐藏克隆条形图来实现。
虽然有些混乱,但我想不到其他方法了。
将它们彼此叠放(第一层在顶部,第三层在底部)。