高度等于动态宽度(CSS流体布局)

Tho*_*man 414 html javascript css jquery responsive-design

是否可以设置与宽度相同的高度(比例1:1)?

+----------+
| body     |
| 1:3      |
|          |
| +------+ |
| | div  | |
| | 1:1  | |
| +------+ |
|          |
|          |
|          |
|          |
|          |
+----------+
Run Code Online (Sandbox Code Playgroud)

CSS

div {
  width: 80%;
  height: same-as-width
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*yan 668

[更新:虽然我独立发现了这个技巧,但我已经知道Thierry Koblentz打败了我.你可以在A List Apart上找到他2009年的文章.信用到期的信用.]

我知道这是一个老问题,但我遇到了我类似的问题只能用CSS解决.这是我的博客文章,讨论了解决方案.帖子中包含一个实例.代码转发如下.

HTML:

<div id="container">
    <div id="dummy"></div>
    <div id="element">
        some text
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

#container {
    display: inline-block;
    position: relative;
    width: 50%;
}
#dummy {
    margin-top: 75%; /* 4:3 aspect ratio */
}
#element {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: silver /* show me! */
}
Run Code Online (Sandbox Code Playgroud)

#container {
  display: inline-block;
  position: relative;
  width: 50%;
}

#dummy {
  margin-top: 75%;
  /* 4:3 aspect ratio */
}

#element {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background-color: silver/* show me! */
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
  <div id="dummy"></div>
  <div id="element">
    some text
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 这可以通过使用`:before`伪元素来改进.`的#container:前{内容: "";显示:块;边距:100%;}` (124认同)
  • 这是伪元素解决方案的小提琴:http://jsfiddle.net/B8FU8/2441/ (48认同)
  • 它的工作原理是边距/填充顶部/底部,当指定为百分比时,根据包含元素的*width*确定.从本质上讲,您可以根据"水平"属性调整"垂直"属性的大小.这不是漏洞利用或黑客攻击,因为这是CSS规范的定义方式. (21认同)
  • @KenB:单个元素可以相对定位在方面保留元素内.单行文本可以使用绝对定位和拉伸(http://www.vanseodesign.com/css/vertical-centering/)垂直居中,高度为1em.但是,不知道如何进行多行文本,或者如何定位除居中之外的文本. (3认同)
  • @Greg:使用伪元素是一种替代解决方案,不一定是改进.伪元素有自己的警告.我试验过这个,特别是我记得在Opera上有问题(虽然这可能不再是向WebKit过渡的问题). (2认同)
  • @格雷格:同意。这是更丑陋的 div 魔法,尽管它很好地说明了该技术。顺便说一句,我认为 HTML/CSS 实际上缺少一种应该应用于数据模型以获得表示模型的树转换语言。我在加载时为此目的使用 JS,尽管这些操作最好由 DSL 捕获。 (2认同)
  • 不幸的是,如果元素是`img`而不是`div`这个技巧不起作用:( (2认同)

Kri*_*jan 389

有一种方法使用CSS!

如果根据父容器设置宽度,可以将高度设置为0,并将padding-bottom设置为将根据当前宽度计算的百分比:

.some_element {
    position: relative;
    width: 20%;
    height: 0;
    padding-bottom: 20%;
}
Run Code Online (Sandbox Code Playgroud)

这适用于所有主流浏览器.

JSFiddle:https://jsfiddle.net/ayb9nzj3/

  • http://jsfiddle.net/C9W94/ (4认同)
  • @Kristijan,对我不起作用。尝试使用动态大小的 nivo-slider,只要我将外部包装器设置为 `height: 0`,它就会消失。 (3认同)
  • @neverfox PS:.inner应该有位置:绝对; 宽度:100%; 高度:100%; 顶部:0; 左:0; (在某些情况下,最好设置底部:0,firefox有问题)当我需要比率为3:2的响应和内部的iframe播放器时,我会一直使用它.我相信它也适用于任何图表插件,因为它会检查.inner值 (3认同)
  • 它更好,因为它不使用`position:absolute`作为Nathan (2认同)

Sat*_*ran 93

没有任何Javascript可能:)

本文完美地描述了它 - http://www.mademyday.de/css-height-equals-width-with-pure-css.html

HTML:

<div class='box'>
    <div class='content'>Aspect ratio of 1:1</div>
</div> 
Run Code Online (Sandbox Code Playgroud)

CSS:

.box {
    position: relative;
    width:    50%; /* desired width */
}

.box:before {
    content:     "";
    display:     block;
    padding-top: 100%; /* initial ratio of 1:1*/
}

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

/* Other ratios - just apply the desired class to the "box" element */
.ratio2_1:before{
    padding-top: 50%;
}
.ratio1_2:before{
    padding-top: 200%;
}
.ratio4_3:before{
    padding-top: 75%;
}
.ratio16_9:before{
    padding-top: 56.25%;
}
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这是Nathan Ryan提供的更优雅的解决方案版本.布拉沃. (2认同)

Hus*_*ein 70

使用jQuery,您可以通过执行此操作来实现

var cw = $('.child').width();
$('.child').css({'height':cw+'px'});
Run Code Online (Sandbox Code Playgroud)

查看http://jsfiddle.net/n6DAu/1/上的工作示例

  • 见内森的回答. (33认同)
  • 有一种方法只使用CSS,你可以检查我的答案. (15认同)
  • 请更新你的答案.你说它不能用CSS来完成,这不是真的. (7认同)
  • 这不应该是公认的答案,因为没有办法用CSS做这件事(问题就是如此). (5认同)
  • 您需要做的就是包含jQuery脚本和CSS样式.查看http://jsfiddle.net/n6DAu/24/上的完整代码 (2认同)

web*_*iki 69

简单和neet:vw根据视口宽度使用单位作为响应高度/宽度.

vw:视口宽度的1/100.(来源MDN)

DEMO

HTML:

<div></div>
Run Code Online (Sandbox Code Playgroud)

1:1宽高比的CSS:

div{
    width:80vw;
    height:80vw; /* same as width */
}
Run Code Online (Sandbox Code Playgroud)

表根据所需的纵横比和元素宽度计算高度.

   aspect ratio  |  multiply width by
    -----------------------------------
         1:1      |         1
         1:3      |         3
         4:3      |        0.75
        16:9      |       0.5625
Run Code Online (Sandbox Code Playgroud)

这种技术允许您:

  • 在不使用的情况下在元素内插入任何内容 position:absolute;
  • 没有不必要的HTML标记(只有一个元素)
  • 使用vh单位根据视口的高度调整元素纵横比
  • 您可以根据视口的高度和宽度制作一个响应方形或其他纵横比,这些比例始终适合视口(请参阅此答案:根据视口或此演示的宽度和高度响应方形)

这些单元由IE9 +支持,请参阅canIuse以获取更多信息

  • 这实际上是一种非常聪明的方法,但唯一的问题是你失去了基于父级的大小的能力,宽度:33.3%的父网格结构的最大宽度失败.如果这不是一个问题,这是一个不错的选择. (5认同)
  • 请注意,您可以使用`calc`函数使您的代码更清晰一些.例如,要有一个宽高比为16:9的元素,其中`width`为'80vw`,你可以使用`height:calc(80vw*(9/16));`. (5认同)
  • 当您需要将维度绑定到父容器(不一定是 &lt;document&gt;)时,使用视口单位是非常有限的——不过,它非常适合全局容器! (2认同)
  • 您也可以为小元素设置 `line-height:0` (2认同)

Nin*_*non 59

非常简单的方法jsfiddle

HTML

<div id="container">
    <div id="element">
        some text
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS

#container {
    width: 50%; /* desired width */
}

#element {
    height: 0;
    padding-bottom: 100%;
}
Run Code Online (Sandbox Code Playgroud)

  • 这为什么有效? (6认同)
  • 或者只是 .contianer { width:50%; padding-top:50%) .. 不需要元素 (2认同)
  • @cocoseis填充和边距从元素宽度读取它们的百分比.http://www.hongkiat.com/blog/calculate-css-percentage-margins/ (2认同)

Sal*_*n A 9

扩展填充顶部/底部技术,可以使用伪元素来设置元素的高度.使用浮点和负边距从流和视图中删除伪元素.

这允许您将内容放在框内,而无需使用额外的div和/或CSS定位.

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


/* proportions */

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


/* demo */

.fixed-ar {
  margin: 1em 0;
  max-width: 400px;
  background: #EEE url(https://lorempixel.com/800/450/food/5/) center no-repeat;
  background-size: contain;
}
Run Code Online (Sandbox Code Playgroud)
<div class="fixed-ar fixed-ar-1-1">1:1 Aspect Ratio</div>
<div class="fixed-ar fixed-ar-4-3">4:3 Aspect Ratio</div>
<div class="fixed-ar fixed-ar-16-9">16:9 Aspect Ratio</div>
Run Code Online (Sandbox Code Playgroud)


小智 5

宽度:80vmin;高度:80vmin;

CSS 处理最小视图、高度或宽度的 80%

http://caniuse.com/#feat=viewport-units