CSS:不会破坏 3D 变换的“溢出:隐藏”替代方案

Posted

技术标签:

【中文标题】CSS:不会破坏 3D 变换的“溢出:隐藏”替代方案【英文标题】:CSS: "overflow: hidden" alternative that doesn't break 3D transforms 【发布时间】:2021-11-29 17:24:27 【问题描述】:

我正在尝试制作具有视差效果的水平部分。在背景中应该有一个以与页面不同的速度滚动的图像。

问题是:我希望视差元素包含在父元素中,因此父元素的作用类似于子元素的掩码:子元素仅在父元素的边界内可见。

我知道这可以通过将视差元素放在两个元素之间来实现,这些元素的背景在视差元素“上方”并阻挡它,但这种方法不适用于我的情况。

想到的明显想法是使用溢出:隐藏在父级上。然而,这会破坏 3D 变换,因此不会留下任何视差。

如何实现描述的效果?

这是一个代码笔:https://codepen.io/rradarr/full/mdwgard。 我希望红色矩形在带有黑色边框的“视差容器”之外不可见。

* 
      margin: 0;
    
    
    html, body 
      height: 100%
    
    
    main 
      position: relative;
      width: 100%;
      
      perspective: 1px;
      transform-style: preserve-3d;
      overflow-y: auto;
      overflow-x: hidden;
      height: 100vh;
      
      background-color: blue;
    
    
    .static 
      min-height: 800px;
    
    
    .parallax-container 
      border: solid black 3px;
      height: 600px;
      width: 100%;
      transform-style: preserve-3d;
      position: relative;
    
    
    .parallax-child 
      position: relative;
      width: 100%;
      height: 100%;
      transform: translateZ(-2px) scale(2.01);
      z-index: -1;
    
    
    #img-or-whatever 
      height: 900px;
      width: 100%;
      background-color: red;
      position: relative;
      z-index: -1;
    
<main>
      <div class="static"></div>
        
      <div class="parallax-container">
        <div class="parallax-child">
          <div id="img-or-whatever"></div>
        </div>
      </div>
    
      <div class="static"></div>
    </main>

【问题讨论】:

【参考方案1】:

据我所知,您无法使用 translateZ 实现所描述的效果。 这是因为根据this article about CSS 3D

...赋予 overflow 任何除 visible 以外的值都会有效地将 transform-style 的值强制为 flat,即使我们已明确将其设置为 preserve-3d。

据我所知,溢出隐藏的唯一替代方法是put something "above" the parallax element(您说过要避免)。

如果实在没有办法在视差元素“上方”放置一些东西,你可以尝试用 js 做一些类似的事情(比如this for example)。这并不理想,因为它意味着大量的计算和变量,并且可能需要一些时间才能完全完成您想要的(并且由于您需要溢出,所以您在容器内松散了 3D:无论如何都隐藏)。

如果你真的需要里面的 3d,你可以使用 javascript 创建一个更复杂的解决方案,也可以跳过 overflow: hidden。但我会尽量避免 if 不是强制性的(我宁愿在启用 3D 的overflow: hidden 容器上添加一个绝对元素。如果您在该部分仍需要 3D,则提供绝对容器透明背景)。

通常我也建议尽量避免使用.js 处理这类东西(如果可能的话),但我认为你在这里没有很多选择。

【讨论】:

【参考方案2】:

你可以试试 :not() 伪类,但我不知道你会在括号中传递什么,类似于黑色方块中的 not。

【讨论】:

以上是关于CSS:不会破坏 3D 变换的“溢出:隐藏”替代方案的主要内容,如果未能解决你的问题,请参考以下文章

替代不剪切中间字符的“溢出:隐藏”

css 带有CSS 3D变换的倾斜标签

CSS3 3D Transform

css 3d

CSS3 使用 JavaScript 拖动转换 3d 变换

CSS3 matrix3d矩阵变换和动画变换