【问题标题】:How to style a div to be a responsive square? [duplicate]如何将 div 设置为响应式正方形? [复制]
【发布时间】:2013-10-04 18:32:45
【问题描述】:

我希望我的 div 将其高度调整为始终等于其宽度。宽度是百分比。当父级的宽度减小时,盒子应该通过保持其纵横比来减小。

这是CSS怎么做的?

【问题讨论】:

标签: css layout responsive-design aspect-ratio


【解决方案1】:

适用于几乎所有浏览器。

您可以尝试以百分比形式给出padding-bottom

<div style="height:0;width:20%;padding-bottom:20%;background-color:red">
<div>
Content goes here
</div>
</div>

外部 div 正在制作一个正方形,内部 div 包含内容。这个解决方案对我有用很多次。

这是jsfiddle

【讨论】:

  • 它有效,但我不了解该技术。你能解释一下为什么这真的有效吗?
  • 如果您想使用 padding-bottom 方法,这是一个非常好的教程。 [链接]dwuser.com/education/content/…
  • 教程很好,技术我很容易理解。
  • 首选选择的答案,因为它在容器的约束下工作,而不是很少有用的视口
  • @C.Lee 您必须在内部div 上添加position: absolute; 才能使其工作。计算父尺寸时,将忽略具有绝对定位的元素。这意味着您可以向内部元素添加内容,还可以添加填充、边框等。 :) 见this fiddle
【解决方案2】:

要实现您正在寻找的内容,您可以使用viewport-percentage length vw

这是我在jsfiddle 上制作的一个简单示例。

HTML:

<div class="square">
    <h1>This is a Square</h1>
</div>

CSS:

.square {
    background: #000;
    width: 50vw;
    height: 50vw;
}
.square h1 {
    color: #fff;
}

我相信还有很多其他方法可以做到这一点,但这种方法对我来说似乎是最好的。

【讨论】:

  • 这绝对是最干净的解决方案。对于对浏览器支持感兴趣的人,我找到了this overview
  • 非常好,但目前浏览器支持有点粗略,不是吗 - google.ie/…
  • 这个解决方案不能很好地与网格系统配合使用。如果您正在查看随列宽扩展的正方形,@rahulbehl 的答案效果更好。
  • 浏览器支持vw : caniuse.com/#search=vw
  • 提示:如果您想在纵向或横向视图的视口内放置一个正方形:``` @media (orientation:portrait){width:100vw;高度:100vw;}@媒体(方向:横向){宽度:100vh;高度:100vh;}```
【解决方案3】:

这就是我想出的。这里是a fiddle

首先,我需要三个用于方形和居中文本的包装元素。

<div><div><div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat
volutpat.</div></div></div>

这是样式表。它使用了两种技术,一种用于square shapes,另一种用于centered text

body > div {
    position:relative;
    height:0;
    width:50%; padding-bottom:50%;
}

body > div > div {
    position:absolute; top:0;
    height:100%; width:100%;
    display:table;
    border:1px solid #000;
    margin:1em;
}

body > div > div > div{
    display:table-cell;
    vertical-align:middle; text-align:center;
    padding:1em;
}

【讨论】:

  • 一个简单的正方形的额外元素,yuk,但我想是可行的。边注; IE7 或更早版本不支持display:table-cell
【解决方案4】:

就像指定一个与宽度相同大小的填充底部(以百分比为单位)一样简单。所以如果你有50%的宽度,就用下面这个例子

id or class{
    width: 50%;
    padding-bottom: 50%;
}

这是一个 jsfiddle http://jsfiddle.net/kJL3u/2/

带有响应文本的编辑版本http://jsfiddle.net/kJL3u/394

【讨论】:

  • 不过,一旦您向其中添加内容,它就会超出方形纵横比。
  • 您可以使用overflow:hidden 或容器内的其他绝对位置的孩子来解决这个问题。很方便,就像@gidzior 的回答一样
【解决方案5】:

另一种方法是在div 中使用带有width: 100%height: auto 的透明 1x1.png,并在其中使用绝对定位的内容:

html:

<div>
    <img src="1x1px.png">
    <h1>FOO</h1>
</div>

css:

div {
    position: relative;
    width: 50%;
}

img {
    width: 100%;
    height: auto;
}

h1 {
    position: absolute;
    top: 10px;
    left: 10px;
}

文件:http://jsfiddle.net/t529bjwc/

【讨论】:

  • 这是一种更有用的方法,因为您可以使用实际的大小和高度 - 对于方形 div 内的元素很有用。
  • 不错的提示,但使用&lt;svg viewBox='0 0 1 1'&gt;&lt;/svg&gt; 效果更好
【解决方案6】:

HTML

<div class='square-box'>
    <div class='square-content'>
        <h3>test</h3>
    </div>
</div>

CSS

.square-box{
    position: relative;
    width: 50%;
    overflow: hidden;
    background: #4679BD;
}
.square-box:before{
    content: "";
    display: block;
    padding-top: 100%;
}
.square-content{
    position:  absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    color: white;
    text-align: center;
}

http://jsfiddle.net/38Tnx/1425/

【讨论】:

  • 这是纯粹的魔法,但它有效!谢谢!
  • 这是什么黑魔法?!
  • 当宽度可能受“最大宽度”规则限制时,此解决方案非常有效。在这些情况下,实际计算的宽度可能小于以百分比设置的宽度,并且直接在最外层元素上设置填充的所有其他解决方案都将失败。
  • 这是有效的,因为元素的填充是相对于其父元素的 width 计算的。
  • 我一直在寻找答案来保持 div 的纵横比,同时使用 flex box 调整它们的大小,这是唯一一个完美运行的方法。纯魔法,谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多