今天遇到一個頗有趣的問題:如何實現一個寬度自適應,高度爲寬度的一半的矩形。post
通過搜索引擎的篩選和本身的反覆試驗,發現使用padding-bottom
是最完美的解決方案。搜索引擎
首先咱們要明白,padding
和margin
都是相對於父元素的寬度來計算的,咱們能夠利用這一屬性來實現咱們的需求。spa
代碼以下:code
<divclass="scale"></div>
<style>
.scale {
width: 100%;
height: 0;
padding-bottom: 50%;
}
</style>
複製代碼
這其中的關鍵點就是height: 0;
和padding-bottom: 50%;
。索引
咱們將元素的高度由padding
撐開,因爲padding
是根據父元素寬度計算的,因此高度也就變成了相對父元素寬度,同時要將height
設置爲 0,這是爲了將元素高度徹底交給padding
負責。get
最後padding-bottom
的值設爲width
的值一半,就能夠實現高度是寬度的一半且自適應啦。it
光是這樣寫仍是不夠的,由於元素的height
爲 0,致使該元素裏面再有子元素的時候,就沒法正常設置高度。因此咱們須要用到position: absolute;
。代碼以下:io
<divclass="scale"><divclass="item">
這裏是全部子元素的容器
</div></div>
<style>
.scale {
width: 100%;
padding-bottom: 56.25%;
height: 0;
position: relative; //
}
.item {
width: 100%;
height: 100%;
background-color: aquamarine;
position: absolute; //
}
</style>
複製代碼
解決了子元素的問題,那麼咱們再來看看元素自己。因爲咱們一開始的需求是寬高比 2:1
,這種比較好實現,可是後來需求又想要 16:9
的寬高比,並且寬度不是 100%,那這樣計算 padding-bottom
的時候就很麻煩了。如何解決呢?class
這時候咱們須要在外層再套一個父元素,將寬度的控制交給這個父元素來作。容器
代碼以下:
<body><divclass="box"><divclass="scale"><divclass="item">
item
</div></div></div></body>
<style>
/* box 用來控制寬度 */
.box {
width: 80%;
}
/* scale 用來實現寬高等比例 */
.scale {
width: 100%;
padding-bottom: 56.25%;
height: 0;
position: relative;
}
/* item 用來放置所有的子元素 */
.item {
width: 100%;
height: 100%;
background-color: aquamarine;
position: absolute;
}
</style>
複製代碼
如此,就能夠完美解決。