缩放 div 以适应窗口但保留纵横比

IT技术 javascript jquery css html
2021-02-20 02:43:01

如何缩放 div 以适应浏览器视图端口,但保留 div 的纵横比。我如何使用 CSS 和/或 JQuery 做到这一点?

谢谢!

6个回答

您不需要为此使用 javascript。您可以使用纯 CSS。

padding-top 百分比是相对于包含块的宽度来解释的将它与 position: absolute 结合在子元素上,您可以将几乎任何东西放在保持其纵横比的框中。

HTML:

<div class="aspectwrapper">
  <div class="content">
  </div>
</div>

CSS:

.aspectwrapper {
  display: inline-block; /* shrink to fit */
  width: 100%;           /* whatever width you like */
  position: relative;    /* so .content can use position: absolute */
}
.aspectwrapper::after {
  padding-top: 56.25%; /* percentage of containing block _width_ */
  display: block;
  content: '';
}
.content {
  position: absolute;
  top: 0; bottom: 0; right: 0; left: 0;  /* follow the parent's edges */
  outline: thin dashed green;            /* just so you can see the box */
}

display: inline-block叶片的底部边缘下方一点点额外的空间.aspectwrapper中,使其下方的另一个元素不会对其运行平齐。使用display: block将摆脱它。

感谢这篇文章的提示!


另一种方法依赖于这样一个事实,即当您仅调整图像的宽度或高度时,浏览器会尊重图像的纵横比。(为了演示目的,我会让 google 生成一个 16x9 的透明图像,但实际上你会使用自己的静态图像。)

HTML:

<div class="aspectwrapper">
  <img class="aspectspacer" src="http://chart.googleapis.com/chart?cht=p3&chs=160x90" />
  <div class="content">
  </div>
</div>

CSS:

.aspectwrapper {
  width: 100%;
  position: relative;
}
.aspectspacer {
  width: 100%; /* let the enlarged image height push .aspectwrapper's bottom edge */
}
.content {
  position: absolute;
  top: 0; bottom: 0; right: 0; left: 0;
  outline: thin dashed green;
}
这似乎只是根据宽度调整大小。所以它不会调整 div 的宽度以适应高度。所以它并不是真正适合视口,而是相当无聊的旧容易实现纵横比保持。
2021-04-19 02:43:01
你能举一个 jsFiddle 的例子,用第一种方法调整大小的完美框(所有边 euqal)吗?我不太明白如何使用您的第一种方法来完成。
2021-04-29 02:43:01
万分谢意!您应该更新您的答案以包含此测试页
2021-05-06 02:43:01
你在这里: jsfiddle.net/ks2jH/1 请注意,使它成为完美盒子的关键是padding-top: 100%高度应该是.aspectwrapper宽度大小的 100% 由于该宽度设置为 50%,它将随其父项调整大小。我还添加overflow: hidden了文本不会使小尺寸的框变形。
2021-05-10 02:43:01
如果您想要一个高度为宽度一半的矩形,您可以使用padding-top: 50%. 在上面的示例中,我使用padding-top: 56.25%(9/16 = 56.25%)制作了一个 16:9 矩形,适用于宽屏视频
2021-05-12 02:43:01

感谢 Geoff 关于如何构建数学和逻辑的提示。这是我的 jQuery 实现,我用它来调整灯箱的大小,使其充满窗口:

var height = originalHeight;
var width = originalWidth;
aspect = width / height;

if($(window).height() < $(window).width()) {
    var resizedHeight = $(window).height();
    var resizedWidth = resizedHeight * aspect;
}

else { // screen width is smaller than height (mobile, etc)
    var resizedWidth = $(window).width();
    var resizedHeight = resizedWidth / aspect;      
}

这对我来说现在适用于笔记本电脑和手机屏幕尺寸。

您的检查height < width仅适用于 1:1 的纵横比。
2021-04-25 02:43:01
用很少的炼油厂这行得通,但你的 IF 没有检查正确的东西 var vw=$("#absoluteSized").width(); var vh=$("#absoluteSized").height(); var divAspect=vw/vh; if(divAspect > aspect) { resizedHeight = vh; 调整后的宽度 = 调整后的高度 * 方面;} else { // 屏幕宽度小于高度(移动设备等)resizedWidth = vw; 调整后的高度 = 调整后的宽度/纵横比;}
2021-05-10 02:43:01

我有一种不同的纯 HTML/CSS 方法,它不依赖于填充或绝对定位。相反,它使用em单位并依赖于CSS min() 函数加上一点数学。

想象一下,我们想要一个纵横比为 16:9 的视口 div,它总是适合浏览器窗口,并且以轴为中心,有多余的空间。以下是我们如何做到这一点:

HTML

  <body>
    <div class="viewport">
      <p>
        This should be a 16:9 viewport that fits the window.
      </p>
    </div>
  </body>

CSS

body {
  width: 100vw;
  height: 100vh;
  margin: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: white;
  font-size: min(1vw, 1.778vh);
}

div.viewport {
  width: 100em;
  height: 56.25em;
  background-color: lightblue;
}

div.viewport > p {
  font-size: 3em;
  text-align: center;
}

您可以在此处的示例 JSFiddle 中对此进行试验

秘诀就在体内font-size它应该设置为min(1vw, Avh),其中A是您希望 div 具有的纵横比,即width / height在上面的例子中,我们使用 1.778,大约是 16 / 9。

在 CSS 中,em单位基于font-size元素的 ,如果未明确设置,则从父元素继承。对于您的视口 div,将widthto 100em(NOT rem) 和heightto 设置为Iem,其中I以百分比表示的纵横比的倒数,即100 / A100 * height / width。在上面的示例中,我们使用 56.25,即 100 * 9 / 16。

这种方法的一个好处是所有嵌套元素也可以使用em单位,以便它们始终与视口的大小精确缩放。您可以p在示例中元素上看到它的使用

请注意,作为上述的替代方案,您可以在html元素上设置字体大小rem在任何地方使用单位。CSSrem单位类似于em单位,但始终相对于根元素的font-size.

这可以通过 JQuery 和一些数学来实现。

使用 JQuery 获取视口宽度和高度以及 div 当前尺寸。

$(document).width();

计算 div 当前的纵横比。例如宽度/高度

你需要一点逻辑来确定是先设置宽度还是高度,然后使用初始比例来计算另一边。

+1 用于提供简单的数学路径而不是插件路径。
2021-05-06 02:43:01

jQuery 有一个插件,可以使对象增长,直到它的一侧达到某个 px 值。耦合这将视口的高度,您可以将任何元素扩展到该大小:jQuery MaxSide