如何使CSS3圆角隐藏在Chrome/Opera中溢出

jmo*_*tes 147 html css rounded-corners css3

我需要父div上的圆角来掩盖其孩子的内容.overflow: hidden在简单的情况下工作,但在父级相对或绝对定位时,基于webkit的浏览器和Opera会中断.

这适用于Firefox和IE9:

CSS

#wrapper {
  width: 300px;
  height: 300px;
  border-radius: 100px;
  overflow: hidden;
  position: absolute;
}

#box {
  width: 300px;
  height: 300px;
  background-color: #cde;
}
Run Code Online (Sandbox Code Playgroud)

HTML

<div id="wrapper">
  <div id="box"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

关于JSFiddle的例子

谢谢您的帮助!

更新:导致此问题的错误已在Chrome中修复.我没有重新测试Opera或Safari.

gra*_*row 182

我找到了解决这个问题的另一种方案 这看起来像WebKit(或可能是Chrome)中的另一个错误,但它确实有效.您需要做的就是向#wrapper元素添加WebKit CSS Mask.您可以使用单个像素的png图像,甚至可以将其包含在CSS中以保存HTTP请求.

#wrapper {
width: 300px; height: 300px;
border-radius: 100px;
overflow: hidden;
position: absolute; /* this breaks the overflow:hidden in Chrome/Opera */

/* this fixes the overflow:hidden in Chrome */
-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
}

#box {
width: 300px; height: 300px;
background-color: #cde;
}?
Run Code Online (Sandbox Code Playgroud)

JSFiddle示例

  • 这会破坏元素上的任何阴影. (6认同)
  • 谢谢你的解决方案.今天在野生动物园尝试了(v6.0.2)并在那里为我工作! (3认同)
  • 使用Chrome 42.0.2311.90(64位),此修复程序仍然*需要*谢谢! (2认同)
  • 您的解决方案删除父元素的阴影. (2认同)

小智 104

将z-index添加到border-radius'd项目,它将掩盖其中的内容.

  • @simon:请记住,要使z-index产生效果,需要满足某些条件(例如,需要设置位置).有关详细信息,请参阅[此处](https://css-tricks.com/almanac/properties/z/z-index/). (7认同)
  • 这个实际上对我有用. (4认同)
  • 2021年,这个bug仍然存在(Safari版本14.0.3(16610.4.3.1.4)桌面版) (2认同)

jmo*_*tes 57

没关系所有人,我设法通过在包装器和盒子之间添加一个额外的div来解决问题.

CSS

#wrapper {
    position: absolute;
}

#middle {
    border-radius: 100px;
    overflow: hidden; 
}

#box {
    width: 300px; height: 300px;
    background-color: #cde;
}
Run Code Online (Sandbox Code Playgroud)

HTML

<div id="wrapper">
    <div id="middle">
        <div id="box"></div>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

谢谢大家的帮助!

http://jsfiddle.net/5fwjp/

  • 这是有效的,因为定位元素不会将其内容剪切到Webkit中的border-radius.这个额外的层只是使得它没有定位带有border-radius的div,而只是位于一个定位元素内. (12认同)
  • 您是否偶然知道这是一个错误/预期的行为? (9认同)
  • +1投票给bug ...当你有一个图像库自动生成div并将位置设置为绝对时,那么这个"功能"真的是sux ... (4认同)

小智 18

不透明度:0.99; 在包装器上解决webkit bug

  • `transform: translateY(0);` 是一种替代方法,可以在不干扰对象的视觉表示的情况下实现相同的结果(除非您使用透视)。 (3认同)

nak*_*ill 15

似乎这个工作:

.wrap {
    -webkit-transform: translateZ(0);
    -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%);
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/qWdf6/82/

  • `transform:translateZ(0)`对我来说已经足够了. (4认同)

ant*_*oni 8

支持最新的chrome,opera和safari,你可以这样做:

-webkit-clip-path: inset(0 0 0 0 round 100px);
clip-path: inset(0 0 0 0 round 100px);
Run Code Online (Sandbox Code Playgroud)

你一定要查看工具http://bennettfeely.com/clippy/!

  • 我认为你可以进一步缩短它 **clip-path: inset(0%);** ...只要有一个剪辑路径似乎就可以了:-) (2认同)

小智 6

不是答案,但这是Chromium来源下提交的错误:http: //code.google.com/p/chromium/issues/detail?id = 62363

不幸的是,看起来并没有人在研究它.:(