1

我正在尝试将:before,:after box-shadow放在按钮后面。但是过渡是从 a 标签前面开始的。对于我的作品 CMS,我需要将所有属性都放在 a 标签上。

<a href="#" class="btn">Join Today</a>


.btn{
  position: relative;
  z-index: 1;
  display: inline-block;
  text-align: center;
  background-color: #8ec656;
  border-radius: 30px;
  font-family: 'Roboto Condensed', sans-serif;
  font-size: 20px;
  color: #fff;
  border: 3px #d2d2d2 solid;
  padding: 15px 40px;
  line-height: 1;
  transition: box-shadow .4s;
}
.btn:hover{
  background: #6b9640;
  box-shadow: inset 0px -22px 13px 0px #84b652, inset 0px 2px 5px 0px #84b652;
}
.btn:before,
.btn:after{
  content: "";
  position: absolute;
  z-index: -1;
  bottom: 9px;
  left: 10px;
  width: 88%;
  top: 73%;
  transition: box-shadow .4s;
}
.btn:hover:before,
.btn:hover:after{
  box-shadow: 0 15px 10px #777;
}

https://jsfiddle.net/3aj5muyu/

4

3 回答 3

0
.btn:before,
.btn:after{
  transition: .6s;
  content: "";
  box-shadow: 0 28px 17px -3px #777;
  width: 84%;
  height: 11px;
  top: 48%;
  left: 15px;
  position: absolute;
  opacity: 0;
}
.btn:hover:before,
.btn:hover:after{
  opacity: 1;
}

这是我必须解决的。谢谢您的反馈!

于 2016-02-22T23:49:15.650 回答
0

看看这个工作示例:

.btn {
  position: relative;
  /* z-index: 1; */
  display: inline-block;
  
  background-color: #8ec656;
  border-radius: 30px;
  border: 3px #d2d2d2 solid;
  padding: 15px 40px;
  transition: box-shadow .4s;
  text-decoration: none;
}

.btn > span {
  text-align: center;
  font-family: 'Roboto Condensed', sans-serif;
  font-size: 20px;
  color: #fff;
  line-height: 1;
}

.btn:hover{
  background: #6b9640;
  box-shadow: inset 0px -22px 13px 0px #84b652, inset 0px 2px 5px 0px #84b652;
}
.btn:before,
.btn:after{
  display: inline-block;
  content: "";
  position: absolute;
  z-index: -1;
  bottom: 9px;
  left: 10px;
  width: 88%;
  top: 73%;
  transition: box-shadow .4s;
}
.btn:hover:before,
.btn:hover:after{
  box-shadow: 0 15px 10px #777;
}
<a href="#" class="btn"><span>Join Today</span></a>

https://jsfiddle.net/7argwcje/

这是因为 before 和 after 元素实际上是 .btn 元素的子元素和纯文本的兄弟元素(今天加入)。因此,您无法强制将文本放在前面。

这些是变化:

.btn {
  position: relative;
  /* z-index: 1; */
  display: inline-block;
  background-color: #8ec656;
  border-radius: 30px;
  border: 3px #d2d2d2 solid;
  padding: 15px 40px;
  transition: box-shadow .4s;
  text-decoration: none;
}

.btn > span {
  text-align: center;
  font-family: 'Roboto Condensed', sans-serif;
  font-size: 20px;
  color: #fff;
  line-height: 1;
}

基本上将一些属性从.btn包装器跨度元素转移。

请注意,不再需要 z 索引。

于 2016-02-22T21:13:59.560 回答
0

那是因为.btn建立了一个堆叠上下文,所以它的背景总是在它的内容的后面。从后到前的顺序

  1. 构成堆叠上下文的元素的背景和边框。
  2. 具有负堆栈级别(最负优先)的子堆栈上下文。
  3. 流入的、非内联级别的、非定位的后代。
  4. 未定位的浮动。
  5. 流入的、内联级的、非定位的后代,包括内联表和内联块。
  6. 堆栈级别 0 的子堆栈上下文和堆栈级别 0 的定位后代。
  7. 具有正堆栈级别的子堆栈上下文(最不积极的优先)。

要修复它,.btn不应建立堆叠上下文。将以下属性移动到包装器:

position: relative;
z-index: 1;

.btn-wrapper {
  position: relative;
  z-index: 1;
  display: inline-block;
}
.btn{
  display: inline-block;
  text-align: center;
  background-color: #8ec656;
  border-radius: 30px;
  font-family: 'Roboto Condensed', sans-serif;
  font-size: 20px;
  color: #fff;
  border: 3px #d2d2d2 solid;
  padding: 15px 40px;
  line-height: 1;
  transition: box-shadow .4s;
  text-decoration: none;
}
.btn:hover{
  background: #6b9640;
  box-shadow: inset 0px -22px 13px 0px #84b652, inset 0px 2px 5px 0px #84b652;
}
.btn:before,
.btn:after{
  content: "";
  position: absolute;
  z-index: -1;
  bottom: 9px;
  left: 10px;
  width: 88%;
  top: 73%;
  transition: box-shadow .4s;
}
.btn:hover:before,
.btn:hover:after{
  box-shadow: 0 15px 10px #777;
}
<div class="btn-wrapper">
  <a href="#" class="btn">Join Today</a>
</div>

于 2016-02-22T21:04:22.427 回答