如果看到我共享的代码示例,则可以看到叠加层超出了框的范围。我将问题追溯到该transition属性。
transition
我想删除div之外的内容。溢出无法正常运行。(正在删除transition作品,但如果可能,我想保留它)
任何帮助表示赞赏
码
var timer = setInterval(function() { document.querySelector(".qs-timer-overlay").style.opacity = (document.querySelector(".qs-timer-overlay").style.opacity * 1) + 0.1; if (document.querySelector(".qs-timer-overlay").style.opacity * 1 == 1) { clearInterval(timer); } }, 1000); .qs-main-header .qs-timer { padding: 13px 10px; min-width: 130px; text-align: center; display: inline-block; background-color: #dd8b3a; color: #FFF; font-size: 20px; border-radius: 50px; text-transform: uppercase; float: right; cursor: pointer; position: relative; overflow: hidden; } .qs-main-header .qs-timer-overlay { z-index: 1; width: 10%; max-width: 100%; position: absolute; height: 100%; top: 0; left: 0; background-color: #c7543e; opacity: 0.0; /* border-radius: 50px 50px 0px 50px; */ } .qs-main-header .qs-timer-content { z-index: 2; position: relative; } .scale-transition { -webkit-transition: all 1s; transition: all 1s; } <div class="qs-main-header"> <div class="qs-timer scale-transition ng-hide" ng-show="visibility.timer"> <div class="scale-transition qs-timer-overlay"></div> <div class="qs-timer-content ng-binding">0 <span class="ng-binding">Sec(s)</span> </div> </div> </div>
实际上,border-radius当过渡发生时,它并没有得到尊重。
border-radius
禁用过渡后,为什么不会出现此问题?
在开发人员工具中启用“显示油漆矩形”和“显示复合层边框”后,请查看以下代码段(以全屏模式显示),并注意以下几点:
a
.outer {
position: relative;
height: 100px;
width: 100px;
margin-top: 50px;
border: 1px solid red;
overflow: hidden;
}
.border-radius {
border-radius: 50px;
.inner {
width: 50px;
height: 50px;
background-color: gray;
opacity: 0.75;
a:focus + .outer.border-radius > .inner {
transform: translateX(50px);
height: 51px;
opacity: 0.5;
Test
为什么添加过渡会带来问题?
在过渡结束时,由于合成层不再适用(基于创建层的标准),重新绘制恰好将所有层合并回到单个层中。
transition: all 1s 5s;
/transition: height 1s 5s; / uncomment this to see how other properties don’t create a compositing layer */
/height: 60px; /
这说明当合并图层并进行完全重绘时,border- radius父级上的也会得到应用和尊重。但是,在过渡期间仅更改了合成层的属性,因此该层似乎不了解其他层的属性,因此不考虑父层的边界半径。
border- radius
我认为这是因为图层渲染的工作方式。每一层都是一个软件位图,因此它有点像具有圆形图像,然后在其div上放置一个。显然,这不会导致内容的裁剪。
div
这个bug线程中的注释似乎还确认了当不再需要单独的图层时是否发生了重新绘制。
如果“获取自己的图层”将要更改,我们想重绘
注意: 尽管它们是特定于Chrome的,但我认为其他行为也应相似。
解决办法是什么?
解决方案似乎是为parent(.qs- timer)元素创建一个单独的堆栈上下文。创建一个单独的堆栈上下文似乎会为父级创建一个单独的合成层,从而解决了这个问题。
.qs- timer
所提到的,以下任何一个选项都将为父级创建一个单独的堆栈上下文,而执行其中一个似乎可以解决此问题。
将z-index父项上的设置为.qs-timerauto以外的任何值。
z-index
.qs-timer
var timer = setInterval(function() {
document.querySelector(“.qs-timer-overlay”).style.opacity = (document.querySelector(“.qs-timer-overlay”).style.opacity * 1) + 0.1;
if (document.querySelector(“.qs-timer-overlay”).style.opacity * 1 == 1) {
clearInterval(timer);
}, 1000);
.qs-main-header .qs-timer {
padding: 13px 10px;
min-width: 130px;
text-align: center;
display: inline-block;
background-color: #dd8b3a;
color: #FFF;
font-size: 20px;
text-transform: uppercase;
float: right;
cursor: pointer;
z-index: 1; / creates a separate stacking context /
.qs-main-header .qs-timer-overlay {
z-index: 1;
width: 10%;
max-width: 100%;
position: absolute;
height: 100%;
top: 0;
left: 0;
background-color: #c7543e;
opacity: 0.0;
/ border-radius: 50px 50px 0px 50px; /
.qs-main-header .qs-timer-content {
z-index: 2;
.scale-transition {
-webkit-transition: all 1s;
transition: all 1s;
<div class="qs-main-header">
<div class="scale-transition qs-timer-overlay"></div> <div class="qs-timer-content ng-binding">0 <span class="ng-binding">Sec(s)</span> </div>
设置opacity为小于1的值。我在下面的代码段中使用了0.99,因为它不会引起任何视觉差异。
opacity
opacity: 0.99; / creates a separate stacking context /
向transform元素添加一个。我translateZ(0px)在以下代码段中使用过,因为这也不会产生任何视觉差异。
transform
translateZ(0px)
transform: translateZ(0px) / creates a separate stacking context /
前三种方法比第三种更可取,因为第三种方法仅在支持CSS转换的浏览器上起作用。