CSS动画与background-color冲突问题求助
问题:容器添加背景后CSS按钮动画失效的原因与解决方法
刚接触CSS动画,搞不懂为什么给按钮所在容器加background-color或者背景图片后,按钮动画就没法正常工作了——第一个按钮动画正常,第二个直接失效。我猜测是按钮的:after伪类背景设置有冲突,但对动画了解不够,没法确定具体原因,求帮忙。
代码示例
CSS 代码
a.animated-button:link, a.animated-button:visited { position: relative; display: block; margin: 30px auto 0; padding: 14px 15px; color: #fff; font-size:14px; font-weight: bold; text-align: center; text-decoration: none; text-transform: uppercase; overflow: hidden; letter-spacing: .08em; border-radius: 0; text-shadow: 0 0 1px rgba(0, 0, 0, 0.2), 0 1px 0 rgba(0, 0, 0, 0.2); -webkit-transition: all 1s ease; -moz-transition: all 1s ease; -o-transition: all 1s ease; transition: all 1s ease; } a.animated-button:link:after, a.animated-button:visited:after { content: ""; position: absolute; height: 0%; left: 50%; top: 50%; width: 150%; z-index: -1; -webkit-transition: all 0.75s ease 0s; -moz-transition: all 0.75s ease 0s; -o-transition: all 0.75s ease 0s; transition: all 0.75s ease 0s; } a.animated-button:link:hover, a.animated-button:visited:hover { color: #FFF; text-shadow: none; } a.animated-button:link:hover:after, a.animated-button:visited:hover:after { height: 450%; } /* 注意:此处重复定义了上面的选择器,建议合并 */ a.animated-button:link, a.animated-button:visited { position: relative; display: block; margin: 30px auto 0; padding: 14px 15px; color: #fff; font-size:14px; border-radius: 0; font-weight: bold; text-align: center; text-decoration: none; text-transform: uppercase; overflow: hidden; letter-spacing: .08em; text-shadow: 0 0 1px rgba(0, 0, 0, 0.2), 0 1px 0 rgba(0, 0, 0, 0.2); -webkit-transition: all 1s ease; -moz-transition: all 1s ease; -o-transition: all 1s ease; transition: all 1s ease; } /* Victoria Buttons */ a.animated-button.victoria-one { border: 2px solid #D24D57; } a.animated-button.victoria-one:after { background: #D24D57; -moz-transform: translateX(-50%) translateY(-50%) rotate(-25deg); -ms-transform: translateX(-50%) translateY(-50%) rotate(-25deg); -webkit-transform: translateX(-50%) translateY(-50%) rotate(-25deg); transform: translateX(-50%) translateY(-50%) rotate(-25deg); }
HTML 代码
<div> <a href="#" class="animated-button victoria-one">Sign up</a> </div> <div style="background-color:black;"> <a href="#" class="animated-button victoria-one">Sign up</a> </div>
原因与解决方案
核心原因
问题出在z-index层级堆叠顺序:
- 按钮的
:after伪类设置了z-index: -1,它会被放置在按钮元素的下方 - 当容器添加背景色后,容器的默认堆叠层级(
z-index: auto,等价于0)高于z-index: -1的元素,会完全遮挡住:after伪类的背景,导致hover时的展开动画无法被看到
解决方法
给按钮元素添加一个正的z-index值,确保:after伪类的背景能显示在容器背景之上:
a.animated-button:link, a.animated-button:visited { /* 保留原有所有样式 */ z-index: 1; /* 新增该行,调整按钮自身的堆叠层级 */ }
此时:after伪类的z-index: -1会相对于按钮(z-index:1)处于下方,但会在容器背景(默认z-index:0)的上方,hover动画就能正常显示了。
另外建议你合并CSS中重复定义的a.animated-button:link, a.animated-button:visited选择器,减少冗余代码。
内容的提问来源于stack exchange,提问作者pm541
相关产品推荐
相关产品推荐

