【问题标题】:How to fit HTML parent element's bounding box to a CSS transformed child?如何使 HTML 父元素的边界框适合 CSS 转换的子元素?
【发布时间】:2021-07-27 04:24:23
【问题描述】:

有没有办法,最好不使用 JS,在下面的代码 sn-p 中制作容器来包装缩放的,更一般地,转换的子元素,即纯红色外边框完全包含蓝色虚线边框?

顺便说一句,这似乎是一个浏览器错误,因为它违反了默认的盒子模型行为,即父母的大小会自动调整以适合孩子。

#container {
  border: 1px solid red;
}

#scaled {
  border: 1px dashed blue;
  transform: scale(3, 3);
  transform-origin: 0 0;
}
<div id="container">
  container
  <div id="scaled">
    scaled 3x
  </div>
</div>

【问题讨论】:

    标签: javascript html css css-transforms


    【解决方案1】:

    不使用 JavaScript 就无法做到这一点,但这也不是浏览器错误。 CSS 转换发生在图形管道中,在计算页面流并确定每个未转换元素的位置和大小之后。

    这意味着 CSS 转换不会导致任何其他元素的大小被重新计算,这就是为什么容器没有被调整大小以包含转换后的子元素的原因。这实际上是transform 的一个功能,旨在通过完全避免重新计算布局来提高性能。

    您可以干净地做到这一点的唯一方法是将转换应用到父元素,这似乎是您试图摆脱的。如果你希望它是动态的,并且你想远离 JS,很遗憾没有其他办法。

    #container {
      border: 1px solid red;
      transform: scale(3, 3);
      transform-origin: 0 0;
    }
    
    #scaled {
      border: 1px dashed blue;
      
    }
    <div id="container">
      container
      <div id="scaled">
        scaled 3x
      </div>
    </div>

    【讨论】:

    • 谢谢。我不想缩放父母。你知道有什么流行的 JS 库可以解决这个问题吗?
    • @abbr 不幸的是,我不知道有一个库可以做到这一点,但如果你可以使用只有 3 倍宽度和高度而不是缩放的子元素,你总是可以得到它的默认值通过获取 JS innerWidthinnerHeight 的宽度和高度,然后使用 JS 将元素的 CSS widthheight 设置为这些的 3 倍。
    • 我工作的应用程序大量使用 css 转换,而不仅仅是缩放,所以这个选项对我来说也不可行。我确实对 JS 解决方案持开放态度,尤其是如果不能仅通过 css 解决。
    【解决方案2】:

    由于Maximillian Laumeister's Answer 给出的原因,没有转换的相同可见结果可能是:

    #container {
      border: 1px solid red;
    }
    
    #scaled {
      border: 3px dashed blue;
      font-size:3em;
    }
    <div id="container">
      container
      <div id="scaled">
        scaled 3x
      </div>
    </div>

    但是由于某种原因,这似乎并不能解决问题,所以让我们玩转变换功能,添加一些 javascript 来修复高度:

    //JavaScript
    var scale = 3;
    var scaled = document.getElementById("scaled");
    var container = document.getElementById("container");
    container.style.height = //set the height of the container to
      container.clientHeight + //the old container height including the unscaled div
      (scale-1)*scaled.clientHeight + //add to that 2 more of the unscaled div
      (scale+scale/2|0) + //a kind of magic buffer to acount for border |0 converts to int
      "px";// make it css readable in pixls
    /*CSS*/
    #container {
      border: 1px solid red;
      /*height: 86px; tweakable magic number if not using JavaScript*/
    }
    #scaled {
      border: 1px dashed blue;
      transform: scale(3,3);
      transform-origin: 0 0;
      width: 33%
    }
    <div id="container">
     container
      <div id="scaled">
        scaled 3x
      </div>
    </div>
    <script>
      //insert JavaScript here
    </script>

    正如我在代码中指出的那样,您可以通过更改 css 中的高度来手动执行此操作,但如果您愿意使用 JavaScript,则此解决方案应该是有效的,并且每次添加内容时都不需要更改。

    【讨论】:

    • Scale 不仅仅适用于字体,这正是我所需要的。就像在浏览器中一样,放大镜不只是放大文本。
    【解决方案3】:

    其他答案已经解释了为什么这需要 JS。 这是一种隐藏变换后剩余的“额外”空间的方法。

    • 假设您想要 50% 的缩放比例
    • 您已在您的项目上设置了transform: scale(.5); transform-origin: 0 0
    • 如果您知道要调整大小的项目的原始尺寸,则可以通过将宽度和高度乘以缩放因子来计算其新尺寸。
    • 在父 div 上设置这些新尺寸,以便页面上的其他所有内容都可以围绕它流动。

    如果您不知道元素的大小,您可以使用ResizeObserver 找到它(它将是未缩放的大小),然后将缩放因子乘以宽度/高度并将这些新值设置在父元素上包装div。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      相关资源
      最近更新 更多