純 CSS 實現高度與寬度成比例的效果


近在做一個產品列表頁面,布局如右圖所示。頁面中有若干個 item,其中每個 item 都向左浮動,並包含在自適應瀏覽器窗口寬度的父元素中。

item 元素的 CSS 定義如下:

.item { float: left; margin: 10px 2%; width: 21%; } 

這時遇到的一個需求:在保持 item 元素寬高比恆定(如高是寬的 1.618 倍)的情況下,使得 item 元素可以和父元素同比縮放。 我們知道,如果當 item 元素是圖片,同時需要保持的寬高比恰好為圖片本身的寬高比時,可以設置 item 的 height 為 auto 即可輕松實現這個需求。然而當 item 元素不是圖片或者要保持的寬高比和圖片本身的寬高比不同時,這個需求顯得很難直接用 CSS 實現。

為此我放棄 CSS,直接用 JavaScript 綁定 window 的 onresize 事件來動態獲取每個 item 的寬度,從而計算並設置其高度。

我一直在使用這個解決方案,直到今天調整樣式時,突然想到這個需求竟然是可以只使用 CSS 解決的。

首先需要知道,一個元素的 padding,如果值是一個百分比,那這個百分比是相對於其父元素的寬度而言的,即使對於 padding-bottom 和 padding-top 也是如此。

另外,在計算 Overflow 時,是將元素的內容區域(即 width / height 對應的區域)和 Padding 區域一起計算的。換句話說,即使將元素的 overflow 設置為 hidden,“溢出”到 Padding 區域的內容也會照常顯示。

綜上兩條所述,我們可以使用 padding-bottom 來代替 height 來實現高度與寬度成比例的效果。因為 item 元素的寬度是其父元素寬度的 21%,所以我們將 padding-bottom 設置為它的 1.618 倍,即 33.98%。同時將其 height 設置為 0 以使元素的“高度”等於 padding-bottom 的值,從而實現需要的效果。

最后 item 元素的 CSS 樣式為:

.item { float: left; margin: 10px 5%; padding-bottom: 33.98%; width: 21%; height: 0; } 

頁面效果見 http://jsfiddle.net/luin/25BbH/7/,拖動窗口調整頁面寬度,item 元素始終保持恆定的寬高比。

同樣,這個解決方案也自然支持前文說的“當 item 元素是

圖片但要保持的寬高比和圖片本身的寬高比不同”的情況,具體見我在 Ruby China 上的一篇回復:圖片 CSS:怎樣才能“響應式+固定寬高比例”?

 

 

轉自 http://zihua.li/2013/12/keep-height-relevant-to-width-using-css/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM