将 div 调整为容器中最大可能的正方形 [重复]

Posted

技术标签:

【中文标题】将 div 调整为容器中最大可能的正方形 [重复]【英文标题】:Resize a div to largest possible square in container [duplicate] 【发布时间】:2017-07-12 22:27:11 【问题描述】:

如何使用 CSS 将 div 调整为容器内最大的正方形?如果用 CSS 做不到,那么用 javascript 怎么办?

如果容器有height > width,我希望正方形的大小为width x width。如果容器有width > height,我希望正方形的大小为height x height

当容器的尺寸发生变化时,孩子的尺寸应相应调整。

我发现this answer 有助于保持孩子的纵横比。当容器的宽度大于高度时,这种方法不起作用,因为子溢出父容器,如下面的 sn-p 所示。

.flex 
  display: flex;


.wide,
.tall 
  flex: none;
  border: 3px solid red;


.wide 
  width: 150px;
  height: 100px;


.tall 
  width: 100px;
  height: 150px;


div.stretchy-wrapper 
  width: 100%;
  padding-bottom: 100%;
  position: relative;
  background: blue;


div.stretchy-wrapper>div 
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  color: white;
  font-size: 24px;
  text-align: center;
<div class="flex">
  <div class="wide">
    <div class="stretchy-wrapper">
      <div>Wide container</div>
    </div>
  </div>
  <div class="tall">
    <div class="stretchy-wrapper">
      <div>Tall container</div>
    </div>
  </div>
</div>

【问题讨论】:

您可以在 CSS (developer.mozilla.org/en-US/docs/Web/CSS/calc) 中进行尺寸计算,但是您将无法检测到元素的尺寸变化,您需要 JS,因为您基本上是在询问条件在事情发生之前就被满足,而 CSS 没有那种逻辑。 你希望哪个 div 是正方形的?您当前的示例有什么问题? 我希望 .stretchy-wrapper 的 div 后代(蓝色框)是方形的,就是这样。在示例中,宽容器中的蓝色框溢出了您可以通过边框看到的父项。 您可能可以使用vmin jsfiddle.net/mkfLjmgz 但不确定您的真实情况。 通过提供真实案例,我们或许能够建议一个合适的基于 CSS 的解决方案 【参考方案1】: 使用 map() 获取所有 .stretchy-wrapper 及其父级的宽度和高度。 现在使用 for 循环为其父级分配最大值。 然后,只要浏览器窗口大小发生变化,$(window).resize 就会调用 resizeDiv 函数。

$(document).ready (function () 
  function resizeDiv ()  
    var stretchyWrapper = $(".stretchy-wrapper"),
      sWrapperWidth = stretchyWrapper.map (function () 
        return $(this).width ();
      ),
      sWrapperHeight = stretchyWrapper.map (function () 
        return $(this).height ();
      ),
      container = stretchyWrapper.map (function () 
        return $(this).parent ();
      );
    
    for (var i in container) 
      var maxVal = Math.max (sWrapperWidth[i], sWrapperHeight[i]);
      $(container[i]).css ("width": maxVal, "height": maxVal);
    
  
  resizeDiv ();
  
  $(window).resize (function () 
    resizeDiv ();
  );
);
.flex 
  display: flex;


.wide,
.tall 
  flex: none;
  border: 3px solid red;


.wide 
  width: 150px;
  height: 100px;


.tall 
  width: 100px;
  height: 150px;


div.stretchy-wrapper 
  width: 100%;
  padding-bottom: 100%;
  position: relative;
  background: blue;


div.stretchy-wrapper>div 
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  color: white;
  font-size: 24px;
  text-align: center;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="flex">
  <div class="wide">
    <div class="stretchy-wrapper">
      <div>Wide container</div>
    </div>
  </div>
  <div class="tall">
    <div class="stretchy-wrapper">
      <div>Tall container</div>
    </div>
  </div>
</div>

【讨论】:

以上是关于将 div 调整为容器中最大可能的正方形 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

由容器包裹的响应方块网格[重复]

在 PHP 中将图像裁剪为正方形,而不是调整为相同的纵横比

Xcode 自动布局:最适合正方形

使用视口动态调整 3x3 方格的大小

用中心方形组件填充柔性容器

如何使用 CSS 将 div 的高度调整为其容器高度?