【问题标题】:Bug with transform: scale and overflow: hidden in Chrome转换错误:缩放和溢出:隐藏在 Chrome 中
【发布时间】:2025-11-27 01:25:01
【问题描述】:

使用 CSS3 属性 transform: scale,我发现了一个有趣的问题。我想为图片制作一点缩放效果。但是当我用于父 div overflow: hiddenborder-radius 时,子 div 扩展了父 div。

更新:

问题没有解决。如果我添加transition,仍然不起作用。我试图解决这个问题,但没有成功。

这是demo

【问题讨论】:

  • 它对我来说很好用:jsfiddle.net/qWdf6/1(我更改了图片,因为我的代理阻止了你,并添加了边框以查看发生了什么)
  • 它可以工作因为您添加了border。我可以确认没有边框,这在 Windows 上的 Chrome 26 中被破坏,在 Firefox 19 上更正(用于比较)。添加 border:1px solid transparent; 作为解决方法修复 Chrome
  • 安德烈,谢谢。它工作正常,但仅适用于边框属性。我修改了您的示例,并将边框颜色更改为透明。它仍在工作。谢谢。
  • 不确定 border:1px solid transparenttransform:translateZ(0); 到 .wrap 对我有用。 jsfiddle.net/locateganesh/qWdf6/754

标签: google-chrome transform transition css


【解决方案1】:

包装元素上的transform: translateZ(0); 对我有用。

有关此技术的更多信息,请参阅CSS performance relative to translateZ(0)

【讨论】:

  • 您的解决方案对我有用。谢谢,你能把你的代码从transform(translateZ(0))编辑成transform:translateZ(0);
【解决方案2】:

透明边框对我不起作用,但更改 .wrap div 的 z-index 并且图像有效(在我的情况下,图像实际上是视频)

这是css:

.videoContainer{
    overflow: hidden;
    z-index: 10;
}

video{
    margin-left: -55%;
    transform: scale(-1,1);
    -webkit-transform: scale(-1,1);
    -moz-transform: scale(-1,1);
    z-index: 0;
}

注意:请参阅下面的 Jake Blues 评论,了解需要定位元素才能使 z-index 正常工作。

【讨论】:

  • 这似乎是解决方案。我认为不需要添加如此大的 z-index,并且在您的示例中 z-index 根本不起作用,因为 z-index 仅适用于定位元素(位置:绝对;位置:相对;或位置:固定;)W3C。我已经更新了我的示例,所以一年后这个问题终于得到了解决:) jsfiddle.net/qWdf6/136
  • 感谢您的评论,我相应地更改了我的评论,但在我的情况下透明边框仍然不起作用。
  • 这似乎解决了元素从带有overflow: hiddenborder-radius 的元素中溢出的问题。
【解决方案3】:

这是基于 Webkit 的浏览器中的一个已知错误 - 请参阅 #62363。您可以将 border:1px solid transparent; 添加到您的 .wrap 类以解决该问题。

对于更新后的要求,向带有border-radius 的元素添加过渡,这是另一个已知的Chomre/Webkit 错误#157218。抱歉,但仍然没有已知的通用解决方法,尽管对该错误的一条评论说使用 chrome://flags 和使用 --ignore-gpu-blacklist 标志可以在 Chrome 29 中修复它(今天刚刚进入 Chrome 开发频道)。

【讨论】:

  • 对不起。这是我关于*的第一个问题。你是对的,但我认为这个问题还没有完全解决。如果我添加“过渡”,子 div 仍然会超出父 div。如果这个错误没有解决,我很乐意接受你的回答。 )
  • 没问题!每个人都必须从他们的第一个问题开始!我看看能不能看一下更新后的demo。
  • 哇,答案写于 2013 年,我在 Chrome v73 中遇到了这个问题!罪魁祸首是边界半径,我删除了半径,现在一切正常。令人惊讶的错误 #157218 声称它已在 2017 年修复!
【解决方案4】:

解决这个问题的两种方法都很好:

  1. 将以下行添加到父包装器(z-index: 0 对于图像本身不是必需的):position: relative; z-index: 10

  2. 或将transform: translateZ(0); 添加到父包装器(使用相应的前缀以获得更好的浏览器支持)

【讨论】:

  • 我的 +1 仅适用于包装器上的 z-index。 translateZ() 可能会导致性能问题。
  • 并拥有 100% 的浏览器支持以太
  • 位置:相对; z-index: 10 ....这是解决我问题的答案...非常感谢。
【解决方案5】:

发生这种情况是因为合成图层没有被其父图层剪裁。所以有时你需要将带有overflow:hidden 的父级带到它自己的合成层上,这样它才能正确应用overflow:hidden

因此,您必须将 CSS 属性 transform: translateZ(0) 添加到转换后元素的父元素中。

/* add to parent so it is composited on its own layer before rendering */
.parent-of-transformed-element {
     -webkit-transform:translateZ(0);
     transform:translateZ(0);
}

然后overflow:hidden 将起作用,因为转换后的元素像转换后的子元素一样合成在其自己的渲染层上。

在 iOS 和非 iOS 设备上的最新 Safari 和 Chrome 上测试

【讨论】:

    【解决方案6】:

    奇怪的是,我在升级到 Chrome 65 后就遇到了这个问题,对我来说,将 will-change: transform; 添加到 IFRAME 样式就可以了。

    【讨论】:

      【解决方案7】:

      对不起我的英语不好。

      如果页面没有定位元素,则不需要同时设置容器元素和子元素的z-index属性。

      只需将 z-index: 0(或其他)属性添加到容器元素。

      .container {
          border-radius: .14rem;
          overflow: hidden;
          z-index: 0;
      }
      .child {
      
          }
      

      【讨论】:

        【解决方案8】:

        这里是Solution

        HTML:

        <div class="wrap">
            <div class="image"></div>
        </div>
        

        CSS:

        .wrap{
            width: 400px;
            height: 260px;
            overflow: hidden;
            border-radius: 15px;
            border:1px solid transparent;
        }
        div.image{
            background: url(http://blog.dothegreenthing.com/wp-content/uploads/2012/10/take-a-smile.jpg) no-repeat;
            width: 400px;
            height: 260px;
        
        
        }
        div.image:hover{
            -webkit-transform: scale(1.2, 1.2);
            transform: scale(1.2, 1.2);
            cursor: pointer;
            border:1px solid transparent;
        }
        

        Chrome 需要一个透明的border 包围盒子。 希望这会有所帮助。

        【讨论】:

        • 谢谢。只为 .wrap div 添加边框就足够了;)
        • 嘿,我先回答了,当时我正忙着解决问题,发帖后看到所有关于边界的 cmets。没关系,发生在 *,5-10 秒的延迟会得到越来越多的解决方案。我的坏,只是不能在正确的时间。很高兴知道您找到了解决方案。干杯。关于 wrap div 的问题 - @JakeBlues
        • 很酷的把戏!谢谢!但是,如果图像具有“绝对”位置,则它不起作用。 :( 在较新的 Chrome 版本 (v32) 中也不再需要透明边框。
        【解决方案9】:

        我在使用最新版本的 Chrome 65 时遇到了类似的问题。 我有一个 iFrame 视频在 div 中使用 transform: scale() 放大,在最新的 Chrome 版本中,它不再被遮盖在侧面,而是从父容器中弹出,即使溢出:隐藏;

        虽然 translateZ 有点帮助,但只有当我在父级上使用 translateX 时,它才正确掩盖宽度:

         transform:translateX(0);
        

        【讨论】:

        • 这个解决方案对我有用,以防绝对定位的子元素被转换。将transform: translateX(0) 添加到父元素使子元素“服从”父元素的overflow:hidden,这是以前没有的。我想这归结为一个新的复合层是由父元素(包含子元素)创建的,而不是子元素在父元素“外部”拥有自己的层。
        【解决方案10】:

        当缩放遮罩时,该错误仍然存​​在于 webkit 浏览器(iOS 下的 Safari 和 Chrome)中。然后上面的所有解决方法都不起作用。但使用非标准 css 属性 -webkit-mask-box-image 也有助于缩放蒙版。

        【讨论】:

          【解决方案11】:

          我已经关注这个很久了,唯一对我有用的是这个rotate(0.1deg) translateZ(0)。因此,如果您要缩放元素

          .something:hover img{
          
              -webkit-transform: scale(1.1) rotate(0.1deg) translateZ(0);
              -moz-transform: scale(1.1) rotate(0.1deg) translateZ(0);
              -o-transform: scale(1.1) rotate(0.1deg) translateZ(0);
              transform: scale(1.1) rotate(0.1deg) translateZ(0);
          
          }
          

          没有旋转修复对我来说不起作用。

          如果您将变换添加到 ANY img 父级(例如旋转图像所在的容器),您需要为元素添加相同的修复,例如

          .something_parent{
              transform: translate(-9%,9%) rotate(0.1deg) translateZ(0);
              -webkit-transform: translate(-9%,9%) rotate(0.1deg) translateZ(0);
              -mos-transform: translate(-9%,9%) rotate(0.1deg) translateZ(0);
              -o-transform: translate(-9%,9%) rotate(0.1deg) translateZ(0);
          }
          

          【讨论】:

            【解决方案12】:

            在 Chrome 版本 78.0.3904.87 上,在父元素上尝试 will-change: transformborder: 1px solid transparenttransform: translateZ(0) 没有成功后,我能够通过将 border-radius 从 50% 减少到 49 来解决问题%。看来border-radius: 50% 是一个特例。

            所以我的工作解决方案是:

            .parent {
              z-index: 1;
              position: absolute;
              overflow: hidden;
              border-radius: 49%;
            }
            
            .child {
              z-index: 0;
              position: absolute;
            }
            

            【讨论】:

              【解决方案13】:

              添加 contain 对我有用。

              contain: strict;
              overflow: hidden;
              

              https://developer.mozilla.org/en-US/docs/Web/CSS/contain

              【讨论】:

                【解决方案14】:

                嗯...试图找到解决方法发现

                -webkit-appearance: button; 
                

                修复了此行为,但如果元素实际上不是按钮,则会产生一些不良副作用,例如边框行为怪异,但是,在我的情况下,将 &lt;a&gt; 替换为 &lt;button&gt; 会使缩放的内容保持在其范围内。

                【讨论】:

                  最近更新 更多