首頁  >  文章  >  web前端  >  分享Shrinktofit(自適應寬度)的用法和實例教程

分享Shrinktofit(自適應寬度)的用法和實例教程

零下一度
零下一度原創
2017-05-09 14:14:332983瀏覽

自適應寬度是指當未明確設定容器的寬度(或外邊距設為auto)時,在特定的情況下容器的寬度會根據情況自行設定,而設定的結果往往不是我們想要的。

W3C規格中描述了幾種shrink-to-fit的情況

  • 10.3.5 Floating, non-replaced elements

  • 10.3.7 Absolutely positioned, non-replaced elements

  • 10.3.8 Absolutely positioned, replaced elements

  • 10.6.4 Absolutely positioned, non-replaced elements

規格中提到了一個基本概念,我們先來了解一下。

replaced elements & non-replaced elements

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

1.可替換元素

分享Shrinktofit(自適應寬度)的用法和實例教程CSS 裡,可替換元素是這樣一些元素, 其展現不是由CSS來控制的。這些外在元素的展現不依賴CSS規範。 典型的可替換元素有 img、 object、 video 以及 textarea、input這樣的表單元素。 有些元素,如audio和 canvas ,只在一些特殊情況下是可替換元素。 使用了 CSS content 屬性插入的物件被稱為匿名的可替換元素。

2.不可替換元素

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

    了解了概念後,我們回歸主題。 shrink-to-fit的情況有多種,這裡介紹一種最常見的情況,即不可替代元素浮動時的自適應寬度(Floating, non-replaced elements),聽起來有點抽象,但你可能經常遇到。先看一個例子:
  • html&css<pre class="brush:html;toolbar:false;">&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;style type=&quot;text/css&quot;&gt; .outer { width: 800px; background: black; overflow: hidden; } .inner { float: left; background: red; } .sub1 { width: 26%; background: blue; } .sub2 { width: 50%; background: green; } &lt;/style&gt; &lt;head&gt; &lt;/head&gt; &lt;body&gt; &lt;p class=&quot;outer&quot;&gt; &lt;p class=&quot;inner&quot;&gt; &lt;p class=&quot;sub1&quot;&gt; this is 1th line this is 2th line this is 3th line this is 4th line &lt;/p&gt; &lt;p class=&quot;sub2&quot;&gt; sub2 block &lt;/p&gt; &lt;/p&gt; &lt;/p&gt; &lt;/body&gt; &lt;/html&gt;</pre>這段樣式定義了一個outer容器,背景為黑色且寬度為800px,它裡面還有一個內部容器inner,無寬度且左浮動,inner裡有兩個小塊sub1和sub2。

  • 那麼問題來了,請問inner,sub1,sub2具體的寬度是多少?

    先看效果圖再回答:

分享Shrinktofit(自適應寬度)的用法和實例教程#結果應該會出乎你的意料:inner (紅色背景)的寬度並不是outer(黑色背景)的寬度(正常情況下應該可以
繼承

父容器的寬度),因而sub1和sub2比我們預想的要小得多。

再回答這個問題之前,我們先試著修改一下,看看能否從中找到出現這個問題的原因。經過

調試
,發現兩個最簡單的方案可以解決這個問題:

分享Shrinktofit(自適應寬度)的用法和實例教程

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

2.取消inner的浮動。

解決後的效果如下:

###這的確是我們想要的,但這卻巧妙地'躲'過了不可替換元素浮動這個場景。老實講,我多次遇到這個場景,但是無非也就是利用上述兩個方案去嘗試,可並不知曉真正的原因,於是還是啃了一下W3C有關這方面的規範,規範的描述如下:# #######################首先不說英文的問題,單純的'Roughly'和'CSS 2.1 does not define the exact algorithm'這兩句話就讓人哭笑不得,然後也給了shrink-to-fit的一個公式:#########min(max(preferred minimum width, available width), preferred width)######### #呵呵,然並卵啊,天知道這三個值怎麼算。 ######再網路上google一下,發現很多人都遇到這個問題,但也是讀不懂規範,也有人把上面一段翻譯了一下,大家可以看看:######## CSS2.1 並未給出preferred minimum width、available width 和preferred width 確切演算法,通常,將內容中非明確的換行外的其他部分強制不換行來計算preferred width;反之,嘗試將內容盡可能的換行,以得到preferred minimum width;available width 即該元素的包含塊的寬度減去'margin-left','border-left-width','padding-left','padding-right','border-right-width ','margin-right' 的值以及任何存在的縱向滾動條的寬度。 #########已被這段翻譯繞暈的請舉手。 。 。 。 。 。 。 。 。 。 。 。 。 ######再次回歸主題,經過近一小時的摸索,終於讓我把這段難懂的英文捋順了:###

這裡有三個參數,分別是:preferred minimum width, available width, preferred width.只需關心preferred width的計算方式即可,preferred width的計算方式如下:

讓元素內容強制不換行後的最大寬度即為shrink-to-fit後的寬度

具體拿上面的例子,inner中的sub1的內容由於寬度不夠被換行了,將其強制不換行算出的寬度就是inner自適應的寬度(inner本身沒設寬度喔~),如何強制不換行也很簡單,慢慢的將sub1的寬度調大,就會發現調至100%時恰好足夠用一行來現實其內容,這時內容的寬度就是inner自適應後的寬度。直接上圖:

分享Shrinktofit(自適應寬度)的用法和實例教程


#總結:對於浮動或特殊的定位方式,建議明確的設定容器寬度,避免意想不到的結果

查看Blog原文請戳此處

【相關推薦】

##1. 

免費css線上影片教學

2. 

css線上手冊

#3. 

php.cn獨孤九賤(2)-css影片教學教學

以上是分享Shrinktofit(自適應寬度)的用法和實例教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn