CSS秘密花園: 流體背景,固定內容

371509796 8年前發布 | 10K 次閱讀 CSS 前端技術

CSS Secrets 》是 @Lea Verou 最新著作,這本書講解了有關于CSS中一些小秘密。是一本CSSer值得一讀的一本書,經過一段時間的閱讀,我、@南北和@彥子一起將在W3cplus發布一系列相關的讀后感,與大家一起分享。

問題

在過去的幾年中,有種網頁設計趨熱是越來越受歡迎:這就是我所說的“自適應的背景,固定寬度的內容”。這種模型常用于以下幾種場景中:

  • 有多個內容部分 <section> ,每個內容都占據整個視窗寬度而且都有不同的背景。
  • 固定寬度的內容,即使寬度會根據不同的媒體查詢修改。在某些情況之下,不同的區域 <section> 會有不同的內容寬度

有時候整個網站都是由這種風格組成,如下圖所示:

更微妙點的如下圖:

特定的區域使用這種模式的要屬頁腳,使用最頻繁:

完成這樣的效果最常見的方法就是使用兩個元素,一個用于流體的背景,另一個用于固定寬度的內容。后者使用 margin: auto ,讓內容保持水平居中。例如,頁腳的區域,他的結構如下:

<footer>
    <div class="wrapper">
        <!-- 這里放頁腳的內容 -->
    </div>
</footer>

CSS通常這樣寫:

footer {
    background: #333;
} 
.wrapper {
    max-width: 900px;
    margin: 1em auto;
}

看上去是不是很熟悉。大多數網頁設計師或者開發人員都寫過類似的代碼。添加額外的標簽元素是問題爭執所在,或者說我們使用現代的CSS能不能避免添加額外的標簽元素?

解決方案

讓我們思考一下這個例子中使用的 margin:auto 。這個 margin 的值等于視窗一半的寬度減去頁面內容一半寬度值。因為視窗寬度我們不知道他具體有多大的值,所以他的一半寬度只能用百分比來計算(假設其祖先元素沒有顯式的設置寬度),在這個示例中,可以使用 50% - 450px 來表達。在 CSS Values and Units Level 3 定義了一個 calc() 函數,允許我們做一些簡單的數學表達式運算。通過 calc() 可以來替代 auto 值,此時, .wrapper 樣式變成:

.wrapper {
    max-width: 900px;
    margin: 1em calc(50% - 450px);
}

使用 margin:auto 讓固定內容元素居中,唯一的原因是不得不用第二個容器來包裹內容。然而,現在使用 calc() 來替代 auto 。 calc() 只是另一個CSS長度值,而且任何接受長度值的屬性都可以使用。這也意味著,如果我們想要,我們現在可以將其運用其父元素的 padding 值上:

footer {
    max-width: 900px;
    padding: 1em calc(50% - 450px);
    background: #333;
}
.wrapper {}

警告:別忘了,在 calc() 中表達式的運算符之間要用空格符隔開,否則將會出錯。這是一個非常奇怪的規則,主要原因是向前兼容,或許在未來, calc() 可以識別標識符,甚至也可以包含連字符。

正如你所見,通過這樣方式的處理, .wrapper 容器的沒有任何CSS代碼,這意味著我們不需要了,也可以放心的從結構中刪除這個容器元素。現在已經達到我們需要的風格,而且沒有多余的HTML標簽出現。那么我們還可以進一步改善它嗎?像往常一樣,這個問題的答案是肯定的。

請注意,如果我們把 width 樣式注釋掉,其實什么也不會發生。無論視窗大小,視覺上的效果完全相同。那是為什么呢?因為 padding 的值是 50% - 450px ,其有效空間始終沒離開 900px ( 2 × 450px ),只有寬度是 900px 以外,不管是更大還是更小,我們才能看到不同效果。但 900px 是我們得到的可用空間,所以它是多余的,我們可以直接刪除它。

如果我們做一下改進,可以提高向后兼容性,通過添加一個備用的 padding ,這樣一來,當瀏覽器不支持 calc() 屬性,至少還會有一些內距的填充:

footer {
    padding: 1em;
    padding: 1em calc(50% - 450px);
    background: #333;
}

就是這樣簡單,我們只使用了三行CSS代碼,而且沒有添加額外的HTML標簽,就實現了一個靈活的,干凈的,可向后兼容的流體背景,固定寬度內容的效果。

來自: http://www.w3cplus.com/css3/css-secrets/fluid-background-fixed-content.html

 本文由用戶 371509796 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!