对于这个问题,你可能尚未过相关需求,或者尚未在面试的时候被问到过,可是歪马相信你终将有须要。css
这个问题提及来也是老生常谈,歪马今天再次提起也是但愿有朝一日当你被问到的时候,可以答得漂亮。前端
若是有一天你被问到:“你能说一下如何实现一个固定宽高比的元素吗?”ios
听到这个的时候你必定不要盲目的说出答案。由于这么问的话,题目并不明确。因此你能够帮面试官补充题设或提问来确认要求。你能够作以下回答:web
<img>
或
<video>
,该怎么实现?
今天歪马就和你们一块儿看看上面几种状况。面试
首先,元素尺寸已知,这个 pass 掉。不用说,说了我怕大家打我。浏览器
咱们重点讨论元素尺寸未知的状况。app
因此本文主要分为可替换元素和普通元素如何实现固定宽高比。编辑器
可替换元素(如<img>
、<video>
)和其余元素不一样,它们自己有像素宽度和高度的概念。因此若是想实现这一类元素固定宽高比,就比较简单。ide
咱们能够指定其宽度或者高度值,另外一边自动计算就能够了。spa
以下,咱们固定图片元素的宽度,高度自适应:
<div class="img-wrapper">
<img src="https://p3.ssl.qhimg.com/t01f7d210920c0c73bd.jpg" alt="">
</div>
复制代码
.img-wrapper {
width: 50vw;
margin: 100px auto;
padding: 10px;
border: 5px solid lightsalmon;
font-size: 0;
}
复制代码img { width: 100%; height: auto; } 复制代码
效果以下图所示,能够看出当可视区域不断变大的过程当中,图片会跟着变大,而且保留了原比例。
你可能没注意到,咱们给
img
元素设定了height: auto;
,这是为了不开发者或者内容管理系统在 HTML 源码中给图片添加了height
属性,经过这个方式能够覆盖掉,避免出现 bug。
此外,对于video
元素也相似,你们能够试下,效果以下。
虽然咱们上面实现了可替换元素的固定宽高比,可是这个比例主要是由于可替换元素自己有尺寸,并且这个比例还会受到原有尺寸比例的限制。显然,这并不灵活,那咱们该如何针对普通元素实现固定宽高比呢。
首先咱们来看看最经典的padding-bottom/padding-top
的 hack 方式。
padding-bottom
实现普通元素固定宽高比在以前的陪读章节《精通 CSS》第 3 章 可见格式化模型中,咱们提到垂直方向上的内外边距使用百分比作单位时,是基于包含块的宽度来计算的。
下面均以
padding-bottom
为例
经过借助padding-bottom
咱们就能够实现一个宽高比例固定的元素,以div
为例。
HTML:
<div class="wrapper">
<div class="intrinsic-aspect-ratio-container"></div>
</div>
复制代码
CSS:
.wrapper {
width: 40vw;
}
.intrinsic-aspect-ratio-container {
width: 100%;
height: 0;
padding: 0;
padding-bottom: 75%;
margin: 50px;
background-color: lightsalmon;
}
复制代码
效果以下:
如上代码,咱们将div
元素的高度设为了0
,经过padding-bottom
来撑开盒子的高度,实现了4/3
的固定宽高比。
这样是实现了固定宽高比,但其只是一个徒有其表的空盒子,里面没有内容。若是想在里面放入内容,咱们还须要将
div`内部的内容使用绝对定位来充满固定尺寸的容器元素。
以下:
.intrinsic-aspect-ratio {
position: relative;
width: 100%;
height: 0;
padding: 0;
padding-bottom: 75%;
margin: 50px;
background-color: lightsalmon;
}
.content {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
复制代码
经过这种方式咱们就能够实现一个能够填充内容的固定尺寸的容器了。
此外,尺寸比例,咱们也能够经过calc()
来计算,这样比较灵活。咱们能够快速的写出任意比例,如padding-bottom: calc(33 / 17 * 100%);
。
不知道,你有没有发现,上面的这种方式只能高度随着宽度动,并不能实现宽度随着高度动。
那有没有办法实现宽度随着高度动呢?答案是没有,至少如今没有。但未来就会有了。接下来咱们一块儿看看更简单便捷的另外一种方式。
aspect-ratio
属性指定元素宽高比因为固定宽高比的需求存在已久,经过padding-bottom
来 hack 的方式也很不直观,而且须要元素的嵌套。
W3C 的 CSS 工做组为了不这一问题,已经在致力于实现这样一个属性aspect-ratio
。该方案已经提出,可是尚未浏览器实现,如今还处于设计节点,暂时尚未已发布的工做组草案,只有编辑草案。
可是这并不妨碍咱们来提早了解一下这个新技术。
下面让咱们一块儿来看看是如何的便利吧。
aspect-ratio
的语法格式以下:aspect-ratio: <widtu-ratio>/<height-ratio>
。
以下,咱们能够将width
或height
设为auto
,而后指定aspect-ratio
。另外一个值就会按照比例自动变化。
/* 高度随动 */
.box1 {
width: 100%;
height: auto;
aspect-ratio: 16/9;
}
复制代码/* 宽度随动 */ .box2 { height: 100%; width: auto; aspect-ratio: 16/9; } 复制代码
这一技术能够很灵活的实现元素的固定宽高比,而且指定宽高之一都可。只是如今尚未浏览器实现,让咱们共同期待吧。
本文总结了如何实现元素的固定宽高比。若是你再在面试的过程当中被问到这个问题。你就能够像这样回答了。
<img>
或
<video>
,能够将
width
/
height
其一设定尺寸,另外一个设为
auto
,则可替换元素会根据其固有尺寸进行变化。
padding-top
/
padding-bottom
的方式来模拟固定宽高比,不过这种方式不灵活,只可以高度随着宽度变。CSS 工做组如今正在引入一种新的方案
aspect-ratio
,能够很方便地指定宽高比,不过暂时尚未浏览器实现。相信不久以后就会有浏览器逐渐实现了。
若是最后你的答案是这样的,那么你不只完善了老师的题设,给出了各类状况的解决方案,最后还点出了标准中正在制定的新方案。这样回答不只展现了你对于问题考虑的严谨,还能够看出你时刻关注着标准的制定,这都是大大的加分项哟。这样,我只能说,此次面试你稳了。
若是你喜欢,欢迎扫码关注个人公众号,若是可以转发分享那就更好了。我会按期陪读,并分享一些其余的前端知识,期待与你共同进步。