当前位置:  开发笔记 > 前端 > 正文

使用CSS保持div的宽高比

如何解决《使用CSS保持div的宽高比》经验,为你挑选了12个好方法。

我想创建一个div可以随着窗口宽度的变化而改变宽度/高度的东西.

是否有任何CSS3规则允许高度根据宽度改变,同时保持其宽高比

我知道我可以通过JavaScript实现这一点,但我更喜欢只使用CSS.

div根据窗口宽度保持纵横比



1> Web_Designer..:

只需创建一个

包含百分比值的包装器padding-bottom,如下所示:

div {
  width: 100%;
  padding-bottom: 75%;
  background: gold; /** <-- For the demo **/
}


2> web-tiki..:
vw 单位:

您可以使用vw单位来表示元素的宽度和高度.这允许基于视口宽度保留元素的宽高比.

vw:视口宽度的1/100.[ MDN ]

或者,您也可以使用vh视口高度,甚至vmin/ vmax使用视口尺寸的较小/较大(此处讨论).

示例:1:1宽高比

div {
  width: 20vw;
  height: 20vw;
  background: gold;
}


3> forgo..:

我已经找到了使用CSS执行此操作的方法,但您必须小心,因为它可能会根据您自己的网站流量而改变.我已经完成了它,以便在我的网站的流体宽度部分内嵌入具有恒定宽高比的视频.

假设您有这样的嵌入式视频:


     ...
     

然后,您可以将所有内容放在带有"视频"类的div中.此视频类可能是您网站中的流媒体元素,因此它本身没有直接的高度限制,但是当您调整浏览器大小时,它将根据网站的流量改变宽度.这可能是您在保持视频的某个宽高比时可能尝试获取嵌入视频的元素.

为了做到这一点,我在"视频"类div中的嵌入对象之前放置了一个图像.

!重要的是,图像具有您希望保持的正确宽高比.此外,请确保图像的大小至少与您期望的视频(或任何维持AR的大小)一样大,以便根据您的布局获得.这将避免在调整百分比大小时图像分辨率中的任何潜在问题.例如,如果您想保持3:2的宽高比,请不要只使用3px x 2px图像.它可能在某些情况下有效,但我没有测试过,它可能是一个好主意,可以避免.

您可能应该已经为网站的流体元素定义了这样的最小宽度.如果没有,最好这样做是为了避免在浏览器窗口太小时关闭元素或重叠元素.在某些时候最好有一个滚动条.网页应该获得的最小宽度约为600像素(包括任何固定宽度的列),因为除非您正在处理适合手机的网站,否则屏幕分辨率不会变小.!

我使用了一个完全透明的png,但如果你做得对,我真的认为它最终无关紧要.像这样:

...

现在您应该能够添加类似于以下内容的CSS:

div.video { ...; position: relative; }
div.video img.maintainaspectratio { width: 100%; }
div.video object { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; }
div.video embed {width: 100%; height: 100%; }

确保您还删除了通常附带复制/粘贴嵌入代码的对象和嵌入标记中的任何显式高度或宽度声明.

它的工作方式取决于视频类元素的位置属性和您想要保持一定宽高比的项目.它利用了在元素中调整大小时图像保持其正确宽高比的方式.它告诉视频类元素中的任何其他内容,通过强制其宽度/高度为图像调整的视频类元素的100%,充分利用动态图像提供的不动产.

很酷,嗯?

您可能需要稍微使用它来使其与您自己的设计一起工作,但这实际上对我来说效果非常好.一般的概念就在那里.



4> Florian Brei..:

艾略特激励我使用这个解决方案 - 谢谢:

aspectratio.png 是一个完全透明的PNG文件,其大小与首选宽高比相同,在我的情况下为30x10像素.

HTML

CSS3

.eyecatcher img {
  width: 100%;
  background-repeat: no-repeat;
  background-size: 100% 100%;
  background-image: url(../img/autoresized-picture.jpg);
}

请注意: background-size css3功能可能无法与目标浏览器配合使用.您可以检查互操作性(fe在caniuse.com上).



5> nabrown..:

要添加到Web_Designer的答案,

将具有75%的包含元素宽度的高度(完全由底部填充组成).这是一个很好的总结:http://mattsnider.com/css-using-percent-for-margin-and-padding/.我不确定为什么会这样,但事实就是如此.

如果您希望div的宽度不是100%,则需要另一个包装div来设置宽度:

div.ar-outer{
    width: 60%; /* container; whatever width you want */
    margin: 0 auto; /* centered if you like */
}
div.ar {
    width:100%; /* 100% of width of container */
    padding-bottom: 75%; /* 75% of width of container */
    position:relative;
}
div.ar-inner {
    position: absolute;
    top: 0; bottom: 0; left: 0; right: 0;
}

我最近使用类似于Elliot的图像技巧,允许我使用CSS媒体查询根据设备分辨率提供不同的徽标文件,但仍然按比例按比例缩放(我将徽标设置为背景图像为透明.png具有正确的宽高比).但是Web_Designer的解决方案会为我节省一个http请求.



6> Marc A..:

正如在w3schools.com上所述并在此接受的答案中有所重申,填充值为百分比(强调我的):

包含元素宽度的百分比指定填充

Ergo,保持16:9宽高比的响应式DIV的正确示例如下:

CSS

.parent {
    position: relative;
    width: 100%;
}
.child {
    position: relative;
    padding-bottom: calc(100% * 9 / 16);
}
.child > div {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}

HTML

Aspect is kept when resizing

演示JSFiddle



7> wener..:

由于@ web-tiki已经显示了使用vh/的方法vw,我还需要一种在屏幕中居的方法,这里是9:16肖像的片段代码.

.container {
  width: 100vw;
  height: calc(100vw * 16 / 9);
  transform: translateY(calc((100vw * 16 / 9 - 100vh) / -2));
}

translateY将这个中心保留在屏幕上.calc(100vw * 16 / 9)预计9月16日的高度.(100vw * 16 / 9 - 100vh)是溢出高度,因此,拉起overflow height/2将使其保持在屏幕中心.

对于风景,并保持16:9,你显示使用

.container {
  width: 100vw;
  height: calc(100vw * 9 / 16);
  transform: translateY(calc((100vw * 9 / 16 - 100vh) / -2));
}

9/16的比例很容易改变,不需要预定义100:56.25100:75.如果你想先确保高度,你应该切换宽度和高度,例如height:100vh;width: calc(100vh * 9 / 16)9:16的肖像.

如果您想要适应不同的屏幕尺寸,您可能也会感兴趣

背景大小的封面/包含

上面的样式类似于包含,取决于宽度:高度比.

对象的合

覆盖/包含img/video标签

@media (orientation: portrait)/@media (orientation: landscape)

媒体查询portrait/ landscape更改比率.



8> pie6k..:

基于你的解决方案,我已经做了一些技巧:

当您使用它时,您的HTML将是唯一的

Main content

以这种方式使用它:CSS:

*[data-keep-ratio] {
    display: block;
    width: 100%;
    position: relative;
}
*[data-keep-ratio] > * {
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
}

和js(jQuery)

$('*[data-keep-ratio]').each(function(){ 
    var ratio = $(this).data('keep-ratio');
    $(this).css('padding-bottom', ratio);
});

有了这个,你只需将attr设置data-keep-ratio为高度/宽度即可.


你应该使用`data-keep-ratio`而不是`keep-ratio`并使用`$(this).data('keep-ratio')来获得它的值;`

9> Salman A..:

这是对已接受答案的改进:

使用伪元素而不是包装器div

宽高比基于框的宽度而不是其父级

当内容变得更高时,盒子将垂直伸展

.box {
  margin-top: 1em;
  margin-bottom: 1em;
  background-color: #CCC;
}

.fixed-ar::before {
  content: "";
  float: left;
  width: 1px;
  margin-left: -1px;
}
.fixed-ar::after {
  content: "";
  display: table;
  clear: both;
}

.fixed-ar-16-9::before {
  padding-top: 56.25%;
}
.fixed-ar-3-2::before {
  padding-top: 66.66%;
}
.fixed-ar-4-3::before {
  padding-top: 75%;
}
.fixed-ar-1-1::before {
  padding-top: 100%;
}

.width-50 {
  display: inline-block;
  width: 50%;
}
.width-20 {
  display: inline-block;
  width: 20%;
}
16:9 full width

16:9

16:9
3:2
4:3
1:1

16:9
16:9


10> Maciej Krawc..:

你可以使用svg.使容器/包装器位置相对,将svg放在静止位置,然后放置绝对定位的内容(顶部:0;左:0;右:0;底部:0;)

16:9比例的示例:

image.svg :(可以在src中内联)


CSS:

.container {
  position: relative;
}
.content {
  position: absolute;
  top:0; left:0; right:0; bottom:0;
}

HTML:

请注意,内联svg似乎不起作用,但您可以对svg进行urlencode并将其嵌入到img src属性中,如下所示:




11> Andrei Gheor..:

我偶然发现了一个使用和的智能解决方案display:grid

网格元素允许您使用两个(或多个)元素占据相同的空间,而无需指定哪个元素来设置高度。这意味着,开箱即用的是更高的比例

这意味着您可以按原样使用它,因为当您知道内容永远不会高到无法填满整个“比例”时,您只是在寻找一种将内容放置在此空间中的方法(即,将内容在两个方向上居中放置) display:flex; align-items:center; justify-content:center)。
它与使用具有display:block和预定比例的透明胶片几乎相同,除了它更轻巧且易于修改(根据需要以响应方式更改比例)。

I'm square
I'm square

您需要做的就是更改s的比率:

看到它的工作:

.ratio {
  display: grid;
}
.ratio > * {
  grid-area: 1/1/1/1;
}
.ratio {
  display: grid;
}
.ratio > * {
  grid-area: 1/1/1/1;
}

/* below code NOT needed for setting the ratio 
 * I just wanted to mark it visually
 * and center contents
 */
.ratio div {
  border: 1px solid red;
  display: flex;
  align-items: center;
  justify-content: center;
}


12> gordie..:

就我而言,SCSS是最好的解决方案。使用数据属性:

[data-aspect-ratio] {
    display: block;
    max-width: 100%;
    position: relative;

    &:before {
        content: '';
        display: block;
    }

    > * {
        display: block;
        height: 100%;
        left: 0;
        position: absolute;
        top: 0;
        width: 100%;
    }
}
[data-aspect-ratio="3:1"]:before {
    padding-top: 33.33%;
}
[data-aspect-ratio="2:1"]:before {
    padding-top: 50%;
}
[data-aspect-ratio="16:9"]:before {
    padding-top: 56.25%;
}
[data-aspect-ratio="3:2"]:before {
    padding-top: 66.66%;
}
[data-aspect-ratio="4:3"]:before {
    padding-top: 75%;
}
[data-aspect-ratio="1:1"]:before {
    padding-top: 100%;
}
[data-aspect-ratio="3:4"]:before {
    padding-top: 133.33%;
}
[data-aspect-ratio="2:3"]:before {
    padding-top: 150%;
}
[data-aspect-ratio="9:16"]:before {
    padding-top: 177.77%;
}
[data-aspect-ratio="1:2"]:before {
    padding-top: 200%;
}
[data-aspect-ratio="1:3"]:before {
    padding-top: 300%;
}

例如 :

资源


仅供参考...您可以使用纯CSS在完全相同的行数中执行此操作(使用属性选择器)。您可以在CSS中使用[data-aspect-ratio]属性选择器。
推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有