【问题标题】:How to make CSS3 rounded corners hide overflow in Chrome/Opera如何使 CSS3 圆角在 Chrome/Opera 中隐藏溢出
【发布时间】:2011-08-09 20:09:33
【问题描述】:

我需要父 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;
}

HTML

<div id="wrapper">
  <div id="box"></div>
</div>

Example on JSFiddle

感谢您的帮助!

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

【问题讨论】:

    标签: html rounded-corners css


    【解决方案1】:

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

    #wrapper {
        width: 300px; height: 300px;
        border-radius: 100px;
        overflow: hidden;
        position: absolute; /* this breaks the overflow:hidden in Chrome/Opera */
        -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC); /* this fixes the overflow:hidden in Chrome/Opera */
    }
    
    #box {
        width: 300px; height: 300px;
        background-color: #cde;
    }
    <div id="wrapper">
        <div id="box"></div>
    </div>

    【讨论】:

    • 感谢您的修复。今天在 Safari 中试用(v6.0.2)并在那里为我工作!
    • 这将打破元素上的任何阴影。
    • 这也适用于具有绝对定位子元素的包装器,而此处的其他解决方案则不能。不错!
    • 使用 Chrome 42.0.2311.90(64 位),并且此修复仍然需要...谢谢!
    • 您的解决方案移除了父元素的阴影。
    【解决方案2】:

    在最新的 chrome、opera 和 safari 中支持,您可以这样做:

    -webkit-clip-path: inset(0 0 0 0 round 100px);
    clip-path: inset(0 0 0 0 round 100px);
    

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

    【讨论】:

    • 我认为你可以进一步缩短这个 clip-path: inset(0%); ... 只是有一个剪辑路径似乎就可以了 :-)
    • 哇。这是完美的答案。
    【解决方案3】:

    不透明度:0.99;关于 wrapper 解决 webkit 的 bug

    【讨论】:

    • transform: translateY(0); 是一种替代方法,它可以在不干扰对象的视觉表示的情况下达到相同的结果(除非您使用透视)。
    【解决方案4】:

    如果您要为图像创建蒙版并将图像放置在容器内,请不要设置“位置:绝对”属性。您所要做的就是更改左边距和右边距。 Chrome/Opera 将遵守溢出:隐藏和边框半径规则。

    // Breaks in Chrome/Opera.
        .container {
            overflow: hidden;
            border-radius: 50%;
            img {
                position: absolute;
                left: 20px;
                right: 20px;
            }
        }
    
    // Works in Chrome/Opera.
        .container {
            overflow: hidden;
            border-radius: 50%;
            img {
                margin-left: 20px;
                margin-right: 20px;
            }
        }
    

    【讨论】:

      【解决方案5】:

      用边框改变父元素的不透明度,这将重新组织堆叠的元素。经过数小时的研究和失败的尝试,这对我来说奇迹般地奏效了。就像添加 0.99 的不透明度来重新组织浏览器的绘制过程一样简单。查看http://philipwalton.com/articles/what-no-one-told-you-about-z-index/

      【讨论】:

        【解决方案6】:

        为你的边框半径项目添加一个 z-index,它会掩盖它里面的东西。

        【讨论】:

        • @Sifu:你完全错了。无论出于何种原因,按照建议添加 z-index 为我解决了这个确切的问题(在当前版本的 Chrome 中),这是一个比最佳答案更简单、更通用的解决方案。
        • @simon: 请记住,要使 z-index 生效,需要满足某些条件(例如,需要设置位置)。详情请见here
        • @NickF -- 这是 Chrome(-ium) 中的一个错误; -webkit-mask-image: -webkit-radial-gradient(circle, white, black); 是一种有效的解决方法,但幸运的是,该错误已在我收到的 Chrome 最新更新中得到修复。
        • z-index 1 到容器。 z-index -1 到绝对元素为我解决了这个问题。
        • 2021,这个bug依然存在(Safari version 14.0.3 (16610.4.3.1.4) Desktop)
        【解决方案7】:

        看来这个可行:

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

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

        【讨论】:

        • transform: translateZ(0) 对我来说已经足够了。
        • 请注意,这(特别是translateZ)会隐式地为您的元素启用硬件加速,遗憾的是,在某些情况下,这会打开一个全新的蠕虫罐。
        • transform: translateZ(0) 也为我工作。在我的情况下,这个项目是硬件加速的不是一个坏主意。
        【解决方案8】:

        就我而言,没有一个解决方案效果很好,只使用:

        -webkit-mask-image: -webkit-radial-gradient(circle, white, black);
        

        在包装元素上完成了这项工作。

        这里是示例:http://jsfiddle.net/gpawlik/qWdf6/74/

        【讨论】:

          【解决方案9】:

          基于 graycrow 的出色回答...

          这是一个更真实的示例,它有两个带有一些填充内容的圆形 div。我只用一个十六进制值替换了硬编码的 png 背景,即

          -=-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
          

          替换为

          -webkit-mask-image:#fff;
          

          查看这个 JSFiddle...http://jsfiddle.net/hqLkA/

          【讨论】:

            【解决方案10】:

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

            CSS

            #wrapper {
                position: absolute;
            }
            
            #middle {
                border-radius: 100px;
                overflow: hidden; 
            }
            
            #box {
                width: 300px; height: 300px;
                background-color: #cde;
            }
            

            HTML

            <div id="wrapper">
                <div id="middle">
                    <div id="box"></div>
                </div>
            </div>
            

            感谢所有帮助过的人!

            http://jsfiddle.net/5fwjp/

            【讨论】:

            • 这是可行的,因为定位的元素不会将它们的内容裁剪到它们在 Webkit 中的边界半径。这个额外的层只是使具有边界半径的 div 没有被定位,而只是位于定位的元素内。
            • 您是否会偶然知道这是否是错误/预期行为?
            • +1 投票给错误...当您有一个自动生成 div 并将位置设置为绝对位置的图片库时,那么这个“功能”真的很不错...
            • @RunLoop 我刚刚在 Safari 7.1 中测试了 jsfiddle 并且工作正常。您能否更具体地说明什么不起作用?
            • 我们的平面设计师同事实际上在找到这个答案之前的 20 秒“发现”了:D
            【解决方案11】:

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

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

            【讨论】:

            • 3年过去了还没有修好>.
            【解决方案12】:

            这里看看我是怎么做到的; Jsfiddle

            通过我输入的代码,我设法让它在 Webkit (Chrome/Safari) 和 Firefox 上运行。 我不知道它是否适用于最新版本的 Opera。 是的,它适用于最新版本的 Opera。

            #wrapper {
              width: 300px; height: 300px;
              border-radius: 100px;
              overflow: hidden;
              position: absolute; /* this breaks the overflow:hidden in Chrome/Opera */
            }
            
            #box {
              width: 300px; height: 300px;
              background-color: #cde;
              border-radius: 100px;
              -webkit-border-radius: 100px;
              -moz-border-radius: 100px;
              -o-border-radius: 100px;
            }
            

            【讨论】:

            • 在这种情况下,为什么还要将border-radius 放在包装器上,只需将其设置在#box 上就会得到相同的结果。此外,如果 #box 边框半径只是为了修复 WebKit,您可以在其中包含 -webkit- 属性。
            • 迷宫,这在某些情况下可能会起作用,但在我的情况下,我正在寻找一种不会改变盒子形状的解决方案(并且包装器仍然可以用作遮罩)。我的示例非常简化,但我正在尝试使用包装器从盒子中隐藏阴影(使用包装器上的填充以仅使我想要的阴影边缘可见)。
            • 感谢迷宫的帮助!您的解决方案帮助我更批判地思考问题。顺便说一句,您可以忽略我对您的帖子所做的编辑。我本来打算自己做的。对不起:)
            • @user480837 没问题,伙计,很高兴我能帮上忙。 :)
            • @Maze 如果应用任何类型的边框,这将不起作用:jsfiddle.net/ptW85/228
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-07-09
            • 2016-03-21
            • 1970-01-01
            • 1970-01-01
            • 2012-05-28
            • 1970-01-01
            相关资源
            最近更新 更多