Shrink-to-fit(自適應(yīng)寬度)

自適應(yīng)寬度是指當(dāng)未明確設(shè)定容器的寬度(或外邊距設(shè)為auto)時,在特定的情況下容器的寬度會根據(jù)情況自行設(shè)定,而設(shè)定的結(jié)果往往并不是我們想要的。

W3C規(guī)范中描述了幾種shrink-to-fit的情況

規(guī)范中提到了一個基本概念,我們先來了解一下。

replaced elements & non-replaced elements

css把html元素分為了兩類:不可替換元素和可替換元素。

  • 1.可替換元素

CSS 里,可替換元素是這樣一些元素, 其展現(xiàn)不是由CSS來控制的。這些外部元素的展現(xiàn)不依賴于CSS規(guī)范。 典型的可替換元素有 img、 object、 video 以及 textarea、input這樣的表單元素。 一些元素,比如audio和 canvas ,只在一些特殊情況下是可替換元素。 使用了 CSS content 屬性插入的對象被稱作匿名的可替換元素。

  • 2.不可替換元素

反之,則為不可替換元素。

了解了概念后,我們回歸主題。shrink-to-fit的情況有多種,這里介紹一種最常見的情況,即不可替代元素浮動時的自適應(yīng)寬度(Floating, non-replaced elements),聽起來有點抽象,但你可能經(jīng)常遇到。先看一個例子:

html&css

<!DOCTYPE html>
<html>
    <style type="text/css">
        .outer {
            width: 800px;
            background: black;
            overflow: hidden;
        }
        .inner {
            float: left;
            background: red;
        }
        .sub1 {
            width: 26%;
            background: blue;
        }
        .sub2 {
            width: 50%;
            background: green;
        }
    </style>
<head>
</head>
<body>
    <div class="outer">
        <div class="inner">
            <div class="sub1">
                this is 1th line this is 2th line this is 3th line this is 4th line
            </div>
            <div class="sub2">
                sub2 block
            </div>

        </div>
    </div>
</body>
</html>

這段樣式定義了一個outer容器,背景為黑色且寬度為800px,它里面還有一個內(nèi)部容器inner,無寬度且左浮動,inner里有兩個小塊sub1和sub2。

那么問題來了,請問inner,sub1,sub2具體的寬度為多少?

先看效果圖再回答:

結(jié)果應(yīng)該會出乎你的意料:inner(紅色背景)的寬度并不是outer(黑色背景)的寬度(正常情況下應(yīng)該可以繼承父容器的寬度),因而sub1和sub2比我們預(yù)想的要小得多。

再回答這個問題之前,我們先試圖修改一下,看能否從中找到出現(xiàn)這個問題的原因。經(jīng)過調(diào)試,發(fā)現(xiàn)兩種最簡單的方案可以解決這個問題:

  • 1.給inner加寬度width: 100%;

  • 2.取消inner的浮動。

解決后的效果如下:

這的確是我們想要的,可這卻巧妙地'躲'過了不可替換元素浮動這個場景。老實講,我多次遇到過這個場景,但是無非也就是利用上述兩個方案去嘗試,可并不知曉真正的原因,于是還是啃了一下W3C有關(guān)這方面的規(guī)范,規(guī)范的描述如下:

首先不說英文的問題,單純的'Roughly'和‘CSS 2.1 does not define the exact algorithm’這兩句就讓人哭笑不得,然后還給出了shrink-to-fit的一個公式:

min(max(preferred minimum width, available width), preferred width)

呵呵,然并卵啊,天知道這三個值怎么算。

再網(wǎng)上google一下,發(fā)現(xiàn)很多人都遇到這個問題,但也是讀不懂規(guī)范,也有人把上面一段翻譯了一下,大家可以看看:

CSS2.1 并未給出 preferred minimum width、available width 和 preferred width 確切算法,通常,將內(nèi)容中非明確的換行外的其他部分強(qiáng)制不換行來計算 preferred width;反之,嘗試將內(nèi)容盡可能的換行,以得到 preferred minimum width;available width 即該元素的包含塊的寬度減去 'margin-left','border-left-width','padding-left','padding-right','border-right-width','margin-right' 的值以及任何存在的縱向滾動條的寬度。

已被這段翻譯繞暈的請舉手。。。。。。。。。。。。。

再次回歸主題,經(jīng)過近一個小時的摸索,終于讓我把這段難懂的英文捋順了:

這里有三個參數(shù),分別為:preferred minimum width, available width, preferred width.只需關(guān)心preferred width的計算方式即可,preferred width的計算方式如下:

讓元素內(nèi)容強(qiáng)制不換行后的最大寬度即為shrink-to-fit后的寬度

具體拿上面的例子,inner中的sub1的內(nèi)容由于寬度不夠被換行了,將其強(qiáng)制不換行算出的寬度就是inner自適應(yīng)的寬度(inner本身沒設(shè)寬度喔~),如何強(qiáng)制不換行也很簡單,慢慢的將sub1的寬度調(diào)大,就會發(fā)現(xiàn)調(diào)至100%時恰好足夠用一行來現(xiàn)實其內(nèi)容,這時內(nèi)容的寬度就是inner自適應(yīng)后的寬度。直接上圖:

總結(jié):對于浮動或者特殊的定位方式,推薦顯式的設(shè)置容器寬度,避免出現(xiàn)意想不到的結(jié)果

查看Blog原文請戳此處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,122評論 1 92
  • 簡介網(wǎng)絡(luò)瀏覽器很可能是使用最廣的軟件。在這篇入門文章中,我將會介紹它們的幕后工作原理。我們會了解到,從您在地址欄輸...
    wengjq閱讀 2,310評論 2 15
  • 一:在制作一個Web應(yīng)用或Web站點的過程中,你是如何考慮他的UI、安全性、高性能、SEO、可維護(hù)性以及技術(shù)因素的...
    Arno_z閱讀 1,361評論 0 1
  • 辟谷日記 日期:2017.7.20 辟谷第幾天:第一天 體重:48.5㎏ 運(yùn)動情況:晚上快走50分鐘,相撲式深蹲3...
    趙子誼閱讀 337評論 0 0
  • 身邊有許多的小伙伴都會說:"我沒吃零食,就吃點水果來著,這么健康怎么還沒健身有效果呢?"接下來看我下面的話,你能...
    Ryeoki閱讀 1,118評論 0 5

友情鏈接更多精彩內(nèi)容