最近在整理 CSS 的時候發現遇到了很多面試中常見的面試題,本部分主要原作者在 Github 等各大論壇收錄的 CSS 相關知識和一些相關面試題時所做的筆記,分享這份總結給大家,對大家對 CSS 的可以來一次全方位的檢漏和排查,感謝原作者 CavsZhouyou 的付出,原文鏈接放在文章最下方,如果出現錯誤,希望大家共同指出!
相關知識點:
(1)有兩種盒子模型:IE盒模型(border-box)、W3C標準盒模型(content-box)
(2)盒模型:分為內容(content)、填充(padding)、邊界(margin)、邊框(border)四個部分
IE盒模型和W3C標準盒模型的區別:
(1)W3C標準盒模型:屬性width,height只包含內容content,不包含border和padding
(2)IE盒模型:屬性width,height包含content、border和padding,指的是content
+padding+border。
在ie8+瀏覽器中使用哪個盒模型可以由box-sizing(CSS新增的屬性)控制,默認值為content-box,即標準盒模型;
如果將box-sizing設為border-box則用的是IE盒模型。如果在ie6,7,8中DOCTYPE缺失會將盒子模型解釋為IE
盒子模型。若在頁面中聲明了DOCTYPE類型,所有的瀏覽器都會把盒模型解釋為W3C盒模型。
回答:
盒模型都是由四個部分組成的,分別是margin、border、padding和content。
標準盒模型和IE盒模型的區別在于設置width和height時,所對應的范圍不同。標準盒模型的width和height屬性的
范圍只包含了content,而IE盒模型的width和height屬性的范圍包含了border、padding和content。
一般來說,我們可以通過修改元素的box-sizing屬性來改變元素的盒模型。
詳細的資料可以參考:《CSS 盒模型詳解》
(1)id選擇器(#myid)
(2)類選擇器(.myclassname)
(3)標簽選擇器(div,h1,p)
(4)后代選擇器(h1p)
(5)相鄰后代選擇器(子)選擇器(ul>li)
(6)兄弟選擇器(li~a)
(7)相鄰兄弟選擇器(li+a)
(8)屬性選擇器(a[rel="external"])
(9)偽類選擇器(a:hover,li:nth-child)
(10)偽元素選擇器(::before、::after)
(11)通配符選擇器(*)
相關知識點:
單冒號(:)用于CSS3偽類,雙冒號(::)用于CSS3偽元素。(偽元素由雙冒號和偽元素名稱組成)
雙冒號是在當前規范中引入的,用于區分偽類和偽元素。不過瀏覽器需要同時支持舊的已經存在的偽元素寫法,
比如:first-line、:first-letter、:before、:after等,
而新的在CSS3中引入的偽元素則不允許再支持舊的單冒號的寫法。
想讓插入的內容出現在其它內容前,使用::before,否者,使用::after;
在代碼順序上,::after生成的內容也比::before生成的內容靠后。
如果按堆棧視角,::after生成的內容會在::before生成的內容之上。
回答:
在css3中使用單冒號來表示偽類,用雙冒號來表示偽元素。但是為了兼容已有的偽元素的寫法,在一些瀏覽器中也可以使用單冒號
來表示偽元素。
偽類一般匹配的是元素的一些特殊狀態,如hover、link等,而偽元素一般匹配的特殊的位置,比如after、before等。
css引入偽類和偽元素概念是為了格式化文檔樹以外的信息。也就是說,偽類和偽元素是用來修飾不在文檔樹中的部分,比如,一句
話中的第一個字母,或者是列表中的第一個元素。
偽類用于當已有的元素處于某個狀態時,為其添加對應的樣式,這個狀態是根據用戶行為而動態變化的。比如說,當用戶懸停在指定的
元素時,我們可以通過:hover來描述這個元素的狀態。
偽元素用于創建一些不在文檔樹中的元素,并為其添加樣式。它們允許我們為元素的某些部分設置樣式。比如說,我們可以通過::be
fore來在一個元素前增加一些文本,并為這些文本添加樣式。雖然用戶可以看到這些文本,但是這些文本實際上不在文檔樹中。
有時你會發現偽元素使用了兩個冒號(::)而不是一個冒號(:)。這是CSS3的一部分,并嘗試區分偽類和偽元素。大多數瀏覽
器都支持這兩個值。按照規則應該使用(::)而不是(:),從而區分偽類和偽元素。但是,由于在舊版本的W3C規范并未對此進行
特別區分,因此目前絕大多數的瀏覽器都支持使用這兩種方式表示偽元素。
詳細資料可以參考:《總結偽類與偽元素》
相關資料:
每個CSS屬性定義的概述都指出了這個屬性是默認繼承的,還是默認不繼承的。這決定了當你沒有為元素的屬性指定值時該如何計算
值。
當元素的一個繼承屬性沒有指定值時,則取父元素的同屬性的計算值。只有文檔根元素取該屬性的概述中給定的初始值(這里的意思應
該是在該屬性本身的定義中的默認值)。
當元素的一個非繼承屬性(在Mozillacode里有時稱之為resetproperty)沒有指定值時,則取屬性的初始值initialv
alue(該值在該屬性的概述里被指定)。
有繼承性的屬性:
(1)字體系列屬性
font、font-family、font-weight、font-size、font-style、font-variant、font-stretch、font-size-adjust
(2)文本系列屬性
text-indent、text-align、text-shadow、line-height、word-spacing、letter-spacing、
text-transform、direction、color
(3)表格布局屬性
caption-sideborder-collapseempty-cells
(4)列表屬性
list-style-type、list-style-image、list-style-position、list-style
(5)光標屬性
cursor
(6)元素可見性
visibility
(7)還有一些不常用的;speak,page,設置嵌套引用的引號類型quotes等屬性
注意:當一個屬性不是繼承屬性時,可以使用inherit關鍵字指定一個屬性應從父元素繼承它的值,inherit關鍵字用于顯式地
指定繼承性,可用于任何繼承性/非繼承性屬性。
回答:
每一個屬性在定義中都給出了這個屬性是否具有繼承性,一個具有繼承性的屬性會在沒有指定值的時候,會使用父元素的同屬性的值
來作為自己的值。
一般具有繼承性的屬性有,字體相關的屬性,font-size和font-weight等。文本相關的屬性,color和text-align等。
表格的一些布局屬性、列表屬性如list-style等。還有光標屬性cursor、元素可見性visibility。
當一個屬性不是繼承屬性的時候,我們也可以通過將它的值設置為inherit來使它從父元素那獲取同名的屬性值來繼承。
詳細的資料可以參考:《繼承屬性》《CSS 有哪些屬性可以繼承?》
相關知識點:
CSS的優先級是根據樣式聲明的特殊性值來判斷的。
選擇器的特殊性值分為四個等級,如下:
(1)標簽內選擇符x,0,0,0
(2)ID選擇符0,x,0,0
(3)class選擇符/屬性選擇符/偽類選擇符 0,0,x,0
(4)元素和偽元素選擇符0,0,0,x
計算方法:
(1)每個等級的初始值為0
(2)每個等級的疊加為選擇器出現的次數相加
(3)不可進位,比如0,99,99,99
(4)依次表示為:0,0,0,0
(5)每個等級計數之間沒關聯
(6)等級判斷從左向右,如果某一位數值相同,則判斷下一位數值
(7)如果兩個優先級相同,則最后出現的優先級高,!important也適用
(8)通配符選擇器的特殊性值為:0,0,0,0
(9)繼承樣式優先級最低,通配符樣式優先級高于繼承樣式
(10)!important(權重),它沒有特殊性值,但它的優先級是最高的,為了方便記憶,可以認為它的特殊性值為1,0,0,0,0。
計算實例:
(1)#demoa{color:orange;}/*特殊性值:0,1,0,1*/
(2)div#demoa{color:red;}/*特殊性值:0,1,0,2*/
注意:
(1)樣式應用時,css會先查看規則的權重(!important),加了權重的優先級最高,當權重相同的時候,會比較規則的特殊性。
(2)特殊性值越大的聲明優先級越高。
(3)相同特殊性值的聲明,根據樣式引入的順序,后聲明的規則優先級高(距離元素出現最近的)
回答:
判斷優先級時,首先我們會判斷一條屬性聲明是否有權重,也就是是否在聲明后面加上了!important。一條聲明如果加上了權重,
那么它的優先級就是最高的,前提是它之后不再出現相同權重的聲明。如果權重相同,我們則需要去比較匹配規則的特殊性。
一條匹配規則一般由多個選擇器組成,一條規則的特殊性由組成它的選擇器的特殊性累加而成。選擇器的特殊性可以分為四個等級,
第一個等級是行內樣式,為1000,第二個等級是id選擇器,為0100,第三個等級是類選擇器、偽類選擇器和屬性選擇器,為0010,
第四個等級是元素選擇器和偽元素選擇器,為0001。規則中每出現一個選擇器,就將它的特殊性進行疊加,這個疊加只限于對應的等
級的疊加,不會產生進位。選擇器特殊性值的比較是從左向右排序的,也就是說以1開頭的特殊性值比所有以0開頭的特殊性值要大。
比如說特殊性值為1000的的規則優先級就要比特殊性值為0999的規則高。如果兩個規則的特殊性值相等的時候,那么就會根據它們引
入的順序,后出現的規則的優先級最高。
對于組合聲明的特殊性值計算可以參考:《CSS 優先級計算及應用》《CSS 優先級計算規則》
a標簽有四種狀態:鏈接訪問前、鏈接訪問后、鼠標滑過、激活,分別對應四種偽類:link、:visited、:hover、:active;
當鏈接未訪問過時:
(1)當鼠標滑過a鏈接時,滿足:link和:hover兩種狀態,要改變a標簽的顏色,就必須將:hover偽類在:link偽
類后面聲明;
(2)當鼠標點擊激活a鏈接時,同時滿足:link、:hover、:active三種狀態,要顯示a標簽激活時的樣式(:active),
必須將:active聲明放到:link和:hover之后。因此得出LVHA這個順序。
當鏈接訪問過時,情況基本同上,只不過需要將:link換成:visited。
這個順序能不能變?可以,但也只有:link和:visited可以交換位置,因為一個鏈接要么訪問過要么沒訪問過,不可能同時滿足,
也就不存在覆蓋的問題。
(1)elem:nth-child(n)選中父元素下的第n個子元素,并且這個子元素的標簽名為elem,n可以接受具體的數
值,也可以接受函數。
(2)elem:nth-last-child(n)作用同上,不過是從后開始查找。
(3)elem:last-child選中最后一個子元素。
(4)elem:only-child如果elem是父元素下唯一的子元素,則選中之。
(5)elem:nth-of-type(n)選中父元素下第n個elem類型元素,n可以接受具體的數值,也可以接受函數。
(6)elem:first-of-type選中父元素下第一個elem類型元素。
(7)elem:last-of-type選中父元素下最后一個elem類型元素。
(8)elem:only-of-type如果父元素下的子元素只有一個elem類型元素,則選中該元素。
(9)elem:empty選中不包含子元素和內容的elem類型元素。
(10)elem:target選擇當前活動的elem元素。
(11):not(elem)選擇非elem元素的每個元素。
(12):enabled 控制表單控件的禁用狀態。
(13):disabled 控制表單控件的禁用狀態。
(14):checked單選框或復選框被選中。
詳細的資料可以參考:《CSS3 新特性總結(偽類)》《淺談 CSS 偽類和偽元素及 CSS3 新增偽類》
-水平居中:給 div 設置一個寬度,然后添加 margin:0auto 屬性
div {
width: 200px;
margin: 0auto;
}
-水平居中,利用 text-align:center 實現
.container {
background: rgba(0, 0, 0, 0.5);
text-align: center;
font-size: 0;
}
.box {
display: inline-block;
width: 500px;
height: 400px;
background-color: pink;
}
-讓絕對定位的 div 居中
div {
position: absolute;
width: 300px;
height: 300px;
margin: auto;
top: 0;
left: 0;
bottom: 0;
right: 0;
background-color: pink; /*方便看效果*/
}
-水平垂直居中一
/*確定容器的寬高寬500高300的層設置層的外邊距div{*/
position:absolute;/*絕對定位*/
width:500px;
height:300px;
top:50%;
left:50%;
margin:-150px00-250px;/*外邊距為自身寬高的一半*/
background-color:pink;/*方便看效果*/
}
-水平垂直居中二
/*未知容器的寬高,利用`transform`屬性*/
div {
position: absolute; /*相對定位或絕對定位均可*/
width: 500px;
height: 300px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: pink; /*方便看效果*/
}
-水平垂直居中三
/*利用flex布局實際使用時應考慮兼容性*/
.container {
display: flex;
align-items: center; /*垂直居中*/
justify-content: center; /*水平居中*/
}
.containerdiv {
width: 100px;
height: 100px;
background-color: pink; /*方便看效果*/
}
-水平垂直居中四
/*利用text-align:center和vertical-align:middle屬性*/
.container {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: rgba(0, 0, 0, 0.5);
text-align: center;
font-size: 0;
white-space: nowrap;
overflow: auto;
}
.container::after {
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}
.box {
display: inline-block;
width: 500px;
height: 400px;
background-color: pink;
white-space: normal;
vertical-align: middle;
}
回答:
一般常見的幾種居中的方法有:
對于寬高固定的元素
(1)我們可以利用margin:0auto來實現元素的水平居中。
(2)利用絕對定位,設置四個方向的值都為0,并將margin設置為auto,由于寬高固定,因此對應方向實現平分,可以實現水
平和垂直方向上的居中。
(3)利用絕對定位,先將元素的左上角通過top:50%和left:50%定位到頁面的中心,然后再通過margin負值來調整元素
的中心點到頁面的中心。
(4)利用絕對定位,先將元素的左上角通過top:50%和left:50%定位到頁面的中心,然后再通過translate來調整元素
的中心點到頁面的中心。
(5)使用flex布局,通過align-items:center和justify-content:center設置容器的垂直和水平方向上為居中對
齊,然后它的子元素也可以實現垂直和水平的居中。
對于寬高不定的元素,上面的后面兩種方法,可以實現元素的垂直和水平的居中。
block 塊類型。默認寬度為父元素寬度,可設置寬高,換行顯示。
none 元素不顯示,并從文檔流中移除。
inline 行內元素類型。默認寬度為內容寬度,不可設置寬高,同行顯示。
inline-block默認寬度為內容寬度,可以設置寬高,同行顯示。
list-item 像塊類型元素一樣顯示,并添加樣式列表標記。
table 此元素會作為塊級表格來顯示。
inherit 規定應該從父元素繼承display屬性的值。
詳細資料可以參考:《CSSdisplay 屬性》
相關知識點:
absolute
生成絕對定位的元素,相對于值不為static的第一個父元素的paddingbox進行定位,也可以理解為離自己這一級元素最近的
一級position設置為absolute或者relative的父元素的paddingbox的左上角為原點的。
fixed(老IE不支持)
生成絕對定位的元素,相對于瀏覽器窗口進行定位。
relative
生成相對定位的元素,相對于其元素本身所在正常位置進行定位。
static
默認值。沒有定位,元素出現在正常的流中(忽略top,bottom,left,right,z-index聲明)。
inherit
規定從父元素繼承position屬性的值。
回答:
relative定位的元素,是相對于元素本身的正常位置來進行定位的。
absolute定位的元素,是相對于它的第一個position值不為static的祖先元素的paddingbox來進行定位的。這句話
我們可以這樣來理解,我們首先需要找到絕對定位元素的一個position的值不為static的祖先元素,然后相對于這個祖先元
素的paddingbox來定位,也就是說在計算定位距離的時候,padding的值也要算進去。
新增各種CSS選擇器 (:not(.input):所有class不是“input”的節點)
圓角 (border-radius:8px)
多列布局 (multi-columnlayout)
陰影和反射 (Shadow\Reflect)
文字特效 (text-shadow)
文字渲染 (Text-decoration)
線性漸變 (gradient)
旋轉 (transform)
縮放,定位,傾斜,動畫,多背景
例如:transform:\scale(0.85,0.90)\translate(0px,-30px)\skew(-9deg,0deg)\Animation:
相關知識點:
Flex是FlexibleBox的縮寫,意為"彈性布局",用來為盒狀模型提供最大的靈活性。
任何一個容器都可以指定為Flex布局。行內元素也可以使用Flex布局。注意,設為Flex布局以后,子元素的float、cl
ear和vertical-align屬性將失效。
采用Flex布局的元素,稱為Flex容器(flexcontainer),簡稱"容器"。它的所有子元素自動成為容器成員,稱為Flex
項目(flexitem),簡稱"項目"。
容器默認存在兩根軸:水平的主軸(mainaxis)和垂直的交叉軸(crossaxis),項目默認沿主軸排列。
以下6個屬性設置在容器上。
flex-direction屬性決定主軸的方向(即項目的排列方向)。
flex-wrap屬性定義,如果一條軸線排不下,如何換行。
flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡寫形式,默認值為rownowrap。
justify-content屬性定義了項目在主軸上的對齊方式。
align-items屬性定義項目在交叉軸上如何對齊。
align-content屬性定義了多根軸線的對齊方式。如果項目只有一根軸線,該屬性不起作用。
以下6個屬性設置在項目上。
order屬性定義項目的排列順序。數值越小,排列越靠前,默認為0。
flex-grow屬性定義項目的放大比例,默認為0,即如果存在剩余空間,也不放大。
flex-shrink屬性定義了項目的縮小比例,默認為1,即如果空間不足,該項目將縮小。
flex-basis屬性定義了在分配多余空間之前,項目占據的主軸空間。瀏覽器根據這個屬性,計算主軸是否有多余空間。它的默認
值為auto,即項目的本來大小。
flex屬性是flex-grow,flex-shrink和flex-basis的簡寫,默認值為01auto。
align-self屬性允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性。默認值為auto,表示繼承父
元素的align-items屬性,如果沒有父元素,則等同于stretch。
回答:
flex布局是CSS3新增的一種布局方式,我們可以通過將一個元素的display屬性值設置為flex從而使它成為一個flex
容器,它的所有子元素都會成為它的項目。
一個容器默認有兩條軸,一個是水平的主軸,一個是與主軸垂直的交叉軸。我們可以使用flex-direction來指定主軸的方向。
我們可以使用justify-content來指定元素在主軸上的排列方式,使用align-items來指定元素在交叉軸上的排列方式。還
可以使用flex-wrap來規定當一行排列不下時的換行方式。
對于容器中的項目,我們可以使用order屬性來指定項目的排列順序,還可以使用flex-grow來指定當排列空間有剩余的時候,
項目的放大比例。還可以使用flex-shrink來指定當排列空間不足時,項目的縮小比例。
詳細資料可以參考:《Flex 布局教程:語法篇》《Flex 布局教程:實例篇》
采用的是相鄰邊框連接處的均分原理。
將元素的寬高設為0,只設置
border
,把任意三條邊隱藏掉(顏色設為
transparent),剩下的就是一個三角形。
#demo {
width: 0;
height: 0;
border-width: 20px;
border-style: solid;
border-color: transparenttransparentredtransparent;
}
簡單的方式:
上面的div寬100%,
下面的兩個div分別寬50%,
然后用float或者inline使其不換行即可
(1)利用padding-bottom|margin-bottom正負值相抵,不會影響頁面布局的特點。設置父容器設置超出隱藏(overflow:
hidden),這樣父容器的高度就還是它里面的列沒有設定padding-bottom時的高度,當它里面的任一列高度增加了,則
父容器的高度被撐到里面最高那列的高度,其他比這列矮的列會用它們的padding-bottom補償這部分高度差。
(2)利用table-cell所有單元格高度都相等的特性,來實現多列等高。
(3)利用flex布局中項目align-items屬性默認為stretch,如果項目未設置高度或設為auto,將占滿整個容器的高度
的特性,來實現多列等高。
詳細資料可以參考:《前端應該掌握的 CSS 實現多列等高布局》《CSS:多列等高布局》
(1)png24位的圖片在iE6瀏覽器上出現背景
解決方案:做成PNG8,也可以引用一段腳本處理。
(2)瀏覽器默認的margin和padding不同
解決方案:加一個全局的*{margin:0;padding:0;}來統一。
(3)IE6雙邊距bug:在IE6下,如果對元素設置了浮動,同時又設置了margin-left或
margin-right,margin值會加倍。
#box{float:left;width:10px;margin:00010px;}
這種情況之下IE會產生20px的距離
解決方案:在float的標簽樣式控制中加入_display:inline;將其轉化為行內屬性。(_這個符號只有ie6會識別)
(4)漸進識別的方式,從總體中逐漸排除局部。
首先,巧妙的使用"\9"這一標記,將IE游覽器從所有情況中分離出來。
接著,再次使用"+"將IE8和IE7、IE6分離開來,這樣IE8已經獨立識別。
.bb{
background-color:#f1ee18;/*所有識別*/
.background-color:#00deff\9;/*IE6、7、8識別*/
+background-color:#a200ff;/*IE6、7識別*/
_background-color:#1e0bd1;/*IE6識別*/
}
(5)IE下,可以使用獲取常規屬性的方法來獲取自定義屬性,也可以使用getAttribute()獲取自定義
屬性;Firefox下,只能使用getAttribute()獲取自定義屬性
解決方法:統一通過getAttribute()獲取自定義屬性。
(6)IE下,event對象有x、y屬性,但是沒有pageX、pageY屬性;Firefox下,event對象有
pageX、pageY屬性,但是沒有x、y屬性。
解決方法:(條件注釋)缺點是在IE瀏覽器下可能會增加額外的HTTP請求數。
(7)Chrome中文界面下默認會將小于12px的文本強制按照12px顯示
解決方法:
1.可通過加入CSS屬性-webkit-text-size-adjust:none;解決。但是,在chrome
更新到27版本之后就不可以用了。
2.還可以使用-webkit-transform:scale(0.5);注意-webkit-transform:scale(0.75);
收縮的是整個span的大小,這時候,必須要將span轉換成塊元素,可以使用display:block/inline-block/...;
(8)超鏈接訪問過后hover樣式就不出現了,被點擊訪問過的超鏈接樣式不再具有hover和active了
解決方法:改變CSS屬性的排列順序L-V-H-A
(9)怪異模式問題:漏寫DTD聲明,Firefox仍然會按照標準模式來解析網頁,但在IE中會觸發怪異模
式。為避免怪異模式給我們帶來不必要的麻煩,最好養成書寫DTD聲明的好習慣。
瀏覽器會把inline元素間的空白字符(空格、換行、Tab等)渲染成一個空格。而為了美觀。我們通常是一個<li>放在一行,
這導致<li>換行后產生換行字符,它變成一個空格,占用了一個字符的寬度。
解決辦法:
(1)為<li>設置float:left。不足:有些容器是不能設置浮動,如左右切換的焦點圖等。
(2)將所有<li>寫在同一行。不足:代碼不美觀。
(3)將<ul>內的字符尺寸直接設為0,即font-size:0。不足:<ul>中的其他字符尺寸也被設為0,需要額外重新設定其他
字符尺寸,且在Safari瀏覽器依然會出現空白間隔。
(4)消除<ul>的字符間隔letter-spacing:-8px,不足:這也設置了<li>內的字符間隔,因此需要將<li>內的字符
間隔設為默認letter-spacing:normal。
詳細資料可以參考:《li 與 li 之間有看不見的空白間隔是什么原因引起的?》
-因為瀏覽器的兼容問題,不同瀏覽器對有些標簽的默認值是不同的,如果沒對CSS初始化往往會出現瀏覽器之間的頁面顯示差異。
-當然,初始化樣式會對SEO有一定的影響,但魚和熊掌不可兼得,但力求影響最小的情況下初始化。
最簡單的初始化方法:*{padding:0;margin:0;}(強烈不建議)
淘寶的樣式初始化代碼:
body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend
,button,input,textarea,th,td{margin:0;padding:0;}
body,button,input,select,textarea{font:12px/1.5tahoma,arial,\5b8b\4f53;}
h1,h2,h3,h4,h5,h6{font-size:100%;}
address,cite,dfn,em,var{font-style:normal;}
code,kbd,pre,samp{font-family:couriernew,courier,monospace;}
small{font-size:12px;}
ul,ol{list-style:none;}
a{text-decoration:none;}
a:hover{text-decoration:underline;}
sup{vertical-align:text-top;}
sub{vertical-align:text-bottom;}
legend{color:#000;}
fieldset,img{border:0;}
button,input,select,textarea{font-size:100%;}
table{border-collapse:collapse;border-spacing:0;}
包含塊(containingblock)就是元素用來計算和定位的一個框。
(1)根元素(很多場景下可以看成是<html>)被稱為“初始包含塊”,其尺寸等同于瀏覽器可視窗口的大小。
(2)對于其他元素,如果該元素的position是relative或者static,則“包含塊”由其最近的塊容器祖先盒的contentbox
邊界形成。
(3)如果元素position:fixed,則“包含塊”是“初始包含塊”。
(4)如果元素position:absolute,則“包含塊”由最近的position不為static的祖先元素建立,具體方式如下:
如果該祖先元素是純inline元素,則規則略復雜:
?假設給內聯元素的前后各生成一個寬度為0的內聯盒子(inlinebox),則這兩個內聯盒子的paddingbox外面的包
圍盒就是內聯元素的“包含塊”;
?如果該內聯元素被跨行分割了,那么“包含塊”是未定義的,也就是CSS2.1規范并沒有明確定義,瀏覽器自行發揮
否則,“包含塊”由該祖先的paddingbox邊界形成。
如果沒有符合條件的祖先元素,則“包含塊”是“初始包含塊”。
(1)對于一般的元素,它的表現跟visibility:hidden;是一樣的。元素是不可見的,但此時仍占用頁面空間。
(2)但例外的是,如果這個元素是table相關的元素,例如table行,tablegroup,table列,tablecolumngroup,它的
表現卻跟display:none一樣,也就是說,它們占用的空間也會釋放。
在不同瀏覽器下的區別:
在谷歌瀏覽器里,使用collapse值和使用hidden值沒有什么區別。
在火狐瀏覽器、Opera和IE11里,使用collapse值的效果就如它的字面意思:table的行會消失,它的下面一行會補充它的位
置。
詳細資料可以參考:《CSS 里的 visibility 屬性有個鮮為人知的屬性值:collapse》
一般而言
width:100%會使元素box的寬度等于父元素的contentbox的寬度。
width:auto會使元素撐滿整個父元素,margin、border、padding、content區域會自動分配水平空間。
絕對定位元素的寬高百分比是相對于臨近的position不為static的祖先元素的paddingbox來計算的。
非絕對定位元素的寬高百分比則是相對于父元素的contentbox來計算的。
base64編碼是一種圖片處理格式,通過特定的算法將圖片編碼成一長串字符串,在頁面上顯示的時候,可以用該字符串來代替圖片的
url屬性。
使用base64的優點是:
(1)減少一個圖片的HTTP請求
使用base64的缺點是:
(1)根據base64的編碼原理,編碼后的大小會比原文件大小大1/3,如果把大圖片編碼到html/css中,不僅會造成文件體
積的增加,影響文件的加載速度,還會增加瀏覽器對html或css文件解析渲染的時間。
(2)使用base64無法直接緩存,要緩存只能緩存包含base64的文件,比如HTML或者CSS,這相比域直接緩存圖片的效果要
差很多。
(3)兼容性的問題,ie8以前的瀏覽器不支持。
一般一些網站的小圖標可以使用base64圖片來引入。
詳細資料可以參考:《玩轉圖片 base64 編碼》《前端開發中,使用 base64 圖片的弊端是什么?》《小 tip:base64:URL 背景圖片與 web 頁面性能優化》
(1)首先我們判斷display屬性是否為none,如果為none,則position和float屬性的值不影響元素最后的表現。
(2)然后判斷position的值是否為absolute或者fixed,如果是,則float屬性失效,并且display的值應該被
設置為table或者block,具體轉換需要看初始轉換值。
(3)如果position的值不為absolute或者fixed,則判斷float屬性的值是否為none,如果不是,則display
的值則按上面的規則轉換。注意,如果position的值為relative并且float屬性的值存在,則relative相對
于浮動后的最終位置定位。
(4)如果float的值為none,則判斷元素是否為根元素,如果是根元素則display屬性按照上面的規則轉換,如果不是,
則保持指定的display屬性值不變。
總的來說,可以把它看作是一個類似優先級的機制,"position:absolute"和"position:fixed"優先級最高,有它存在
的時候,浮動不起作用,'display'的值也需要調整;其次,元素的'float'特性的值不是"none"的時候或者它是根元素
的時候,調整'display'的值;最后,非根元素,并且非浮動元素,并且非絕對定位的元素,'display'特性值同設置值。
詳細資料可以參考:《position 跟 display、margincollapse、overflow、float 這些特性相互疊加后會怎么樣?》
相關知識點:
塊級元素的上外邊距(margin-top)與下外邊距(margin-bottom)有時會合并為單個外邊距,這樣的現象稱為“margin合
并”。
產生折疊的必備條件:margin必須是鄰接的!
而根據w3c規范,兩個margin是鄰接的必須滿足以下條件:
?必須是處于常規文檔流(非float和絕對定位)的塊級盒子,并且處于同一個BFC當中。
?沒有線盒,沒有空隙,沒有padding和border將他們分隔開
?都屬于垂直方向上相鄰的外邊距,可以是下面任意一種情況
?元素的margin-top與其第一個常規文檔流的子元素的margin-top
?元素的margin-bottom與其下一個常規文檔流的兄弟元素的margin-top
?height為auto的元素的margin-bottom與其最后一個常規文檔流的子元素的margin-bottom
?高度為0并且最小高度也為0,不包含常規文檔流的子元素,并且自身沒有建立新的BFC的元素的margin-top
和margin-bottom
margin合并的3種場景:
(1)相鄰兄弟元素margin合并。
解決辦法:
?設置塊狀格式化上下文元素(BFC)
(2)父級和第一個/最后一個子元素的margin合并。
解決辦法:
對于margin-top合并,可以進行如下操作(滿足一個條件即可):
?父元素設置為塊狀格式化上下文元素;
?父元素設置border-top值;
?父元素設置padding-top值;
?父元素和第一個子元素之間添加內聯元素進行分隔。
對于margin-bottom合并,可以進行如下操作(滿足一個條件即可):
?父元素設置為塊狀格式化上下文元素;
?父元素設置border-bottom值;
?父元素設置padding-bottom值;
?父元素和最后一個子元素之間添加內聯元素進行分隔;
?父元素設置height、min-height或max-height。
(3)空塊級元素的margin合并。
解決辦法:
?設置垂直方向的border;
?設置垂直方向的padding;
?里面添加內聯元素(直接Space鍵空格是沒用的);
?設置height或者min-height。
回答:
margin重疊指的是在垂直方向上,兩個相鄰元素的margin發生重疊的情況。
一般來說可以分為四種情形:
第一種是相鄰兄弟元素的marin-bottom和margin-top的值發生重疊。這種情況下我們可以通過設置其中一個元素為BFC
來解決。
第二種是父元素的margin-top和子元素的margin-top發生重疊。它們發生重疊是因為它們是相鄰的,所以我們可以通過這
一點來解決這個問題。我們可以為父元素設置border-top、padding-top值來分隔它們,當然我們也可以將父元素設置為BFC
來解決。
第三種是高度為auto的父元素的margin-bottom和子元素的margin-bottom發生重疊。它們發生重疊一個是因為它們相
鄰,一個是因為父元素的高度不固定。因此我們可以為父元素設置border-bottom、padding-bottom來分隔它們,也可以為
父元素設置一個高度,max-height和min-height也能解決這個問題。當然將父元素設置為BFC是最簡單的方法。
第四種情況,是沒有內容的元素,自身的margin-top和margin-bottom發生的重疊。我們可以通過為其設置border、pa
dding或者高度來解決這個問題。
相關知識點:
塊格式化上下文(BlockFormattingContext,BFC)是Web頁面的可視化CSS渲染的一部分,是布局過程中生成塊級盒
子的區域,也是浮動元素與其他元素的交互限定區域。
通俗來講
?BFC是一個獨立的布局環境,可以理解為一個容器,在這個容器中按照一定規則進行物品擺放,并且不會影響其它環境中的物品。
?如果一個元素符合觸發BFC的條件,則BFC中的元素布局不受外部影響。
創建BFC
(1)根元素或包含根元素的元素
(2)浮動元素float=left|right或inherit(≠none)
(3)絕對定位元素position=absolute或fixed
(4)display=inline-block|flex|inline-flex|table-cell或table-caption
(5)overflow=hidden|auto或scroll(≠visible)
回答:
BFC指的是塊級格式化上下文,一個元素形成了BFC之后,那么它內部元素產生的布局不會影響到外部元素,外部元素的布局也
不會影響到BFC中的內部元素。一個BFC就像是一個隔離區域,和其他區域互不影響。
一般來說根元素是一個BFC區域,浮動和絕對定位的元素也會形成BFC,display屬性的值為inline-block、flex這些
屬性時也會創建BFC。還有就是元素的overflow的值不為visible時都會創建BFC。
詳細資料可以參考:《深入理解 BFC 和 MarginCollapse》《前端面試題-BFC(塊格式化上下文)》
IFC指的是行級格式化上下文,它有這樣的一些布局規則:
(1)行級上下文內部的盒子會在水平方向,一個接一個地放置。
(2)當一行不夠的時候會自動切換到下一行。
(3)行級上下文的高度由內部最高的內聯盒子的高度決定。
詳細資料可以參考:
《BFC 和 IFC 的理解(布局)》
浮動元素可以左右移動,直到遇到另一個浮動元素或者遇到它外邊緣的包含框。浮動框不屬于文檔流中的普通流,當元素浮動之后,
不會影響塊級元素的布局,只會影響內聯元素布局。此時文檔流中的普通流就會表現得該浮動框不存在一樣的布局模式。當包含框
的高度小于浮動框的時候,此時就會出現“高度塌陷”。
清除浮動是為了清除使用浮動元素產生的影響。浮動的元素,高度會塌陷,而高度的塌陷使我們頁面后面的布局不能正常顯示。
清除浮動的方式
(1)使用clear屬性清除浮動。參考28。
(2)使用BFC塊級格式化上下文來清除浮動。參考26。
因為BFC元素不會影響外部元素的特點,所以BFC元素也可以用來清除浮動的影響,因為如果不清除,子元素浮動則父元
素高度塌陷,必然會影響后面元素布局和定位,這顯然有違BFC元素的子元素不會影響外部元素的設定。
使用clear屬性清除浮動,其語法如下:
clear:none|left|right|both
如果單看字面意思,clear:left應該是“清除左浮動”,clear:right應該是“清除右浮動”的意思,實際上,這種解釋是有問
題的,因為浮動一直還在,并沒有清除。
官方對clear屬性的解釋是:“元素盒子的邊不能和前面的浮動元素相鄰。”,我們對元素設置clear屬性是為了避免浮動元素
對該元素的影響,而不是清除掉浮動。
還需要注意的一點是clear屬性指的是元素盒子的邊不能和前面的浮動元素相鄰,注意這里“前面的”3個字,也就是clear屬
性對“后面的”浮動元素是不聞不問的。考慮到float屬性要么是left,要么是right,不可能同時存在,同時由于clear
屬性對“后面的”浮動元素不聞不問,因此,當clear:left有效的時候,clear:right必定無效,也就是此時clear:left
等同于設置clear:both;同樣地,clear:right如果有效也是等同于設置clear:both。由此可見,clear:left和cle
ar:right這兩個聲明就沒有任何使用的價值,至少在CSS世界中是如此,直接使用clear:both吧。
一般使用偽元素的方式清除浮動
.clear::after{
content:'';
display:table;//也可以是'block',或者是'list-item'
clear:both;
}
clear屬性只有塊級元素才有效的,而::after等偽元素默認都是內聯水平,這就是借助偽元素清除浮動影響時需要設置disp
lay屬性值的原因。
清除浮動,觸發hasLayout;
zoom屬性是IE瀏覽器的專有屬性,它可以設置或檢索對象的縮放比例。解決ie下比較奇葩的bug。譬如外邊距(margin)
的重疊,浮動清除,觸發ie的haslayout屬性等。
來龍去脈大概如下:
當設置了zoom的值之后,所設置的元素就會就會擴大或者縮小,高度寬度就會重新計算了,這里一旦改變zoom值時其實也會發
生重新渲染,運用這個原理,也就解決了ie下子元素浮動時候父元素不隨著自動擴大的問題。
zoom屬性是IE瀏覽器的專有屬性,火狐和老版本的webkit核心的瀏覽器都不支持這個屬性。然而,zoom現在已經被逐步標
準化,出現在CSS3.0規范草案中。
目前非ie由于不支持這個屬性,它們又是通過什么屬性來實現元素的縮放呢?可以通過css3里面的動畫屬性scale進行縮放。
假設你現在正用一臺顯示設備來閱讀這篇文章,同時你也想把它投影到屏幕上,或者打印出來,而顯示設備、屏幕投影和打印等這些
媒介都有自己的特點,CSS就是為文檔提供在不同媒介上展示的適配方法
當媒體查詢為真時,相關的樣式表或樣式規則會按照正常的級聯規被應用。當媒體查詢返回假,標簽上帶有媒體查詢的樣式表仍將被
下載(只不過不會被應用)。
包含了一個媒體類型和至少一個使用寬度、高度和顏色等媒體屬性來限制樣式表范圍的表達式。CSS3加入的媒體查詢使得無需修改
內容便可以使樣式應用于某些特定的設備范圍。
詳細資料可以參考:《CSS3@media 查詢》《響應式布局和自適應布局詳解》
SASS(SASS、LESS沒有本質區別,只因為團隊前端都是用的SASS)
加載性能:
(1)css壓縮:將寫好的css進行打包壓縮,可以減少很多的體積。
(2)css單一樣式:當需要下邊距和左邊距的時候,很多時候選擇:margin:top0bottom0;但margin-bottom:bot
tom;margin-left:left;執行的效率更高。
(3)減少使用@import,而建議使用link,因為后者在頁面加載時一起加載,前者是等待頁面加載完成之后再進行加載。
選擇器性能:
(1)關鍵選擇器(keyselector)。選擇器的最后面的部分為關鍵選擇器(即用來匹配目標元素的部分)。CSS選擇符是從右到
左進行匹配的。當使用后代選擇器的時候,瀏覽器會遍歷所有子元素來確定是否是指定的元素等等;
(2)如果規則擁有ID選擇器作為其關鍵選擇器,則不要為規則增加標簽。過濾掉無關的規則(這樣樣式系統就不會浪費時間去匹
配它們了)。
(3)避免使用通配規則,如*{}計算次數驚人!只對需要用到的元素進行選擇。
(4)盡量少的去對標簽進行選擇,而是用class。
(5)盡量少的去使用后代選擇器,降低選擇器的權重值。后代選擇器的開銷是最高的,盡量將選擇器的深度降到最低,最高不要超過
三層,更多的使用類來關聯每一個標簽元素。
(6)了解哪些屬性是可以通過繼承而來的,然后避免對這些屬性重復指定規則。
渲染性能:
(1)慎重使用高性能屬性:浮動、定位。
(2)盡量減少頁面重排、重繪。
(3)去除空規則:{}。空規則的產生原因一般來說是為了預留樣式。去除這些空規則無疑能減少css文檔體積。
(4)屬性值為0時,不加單位。
(5)屬性值為浮動小數0.**,可以省略小數點之前的0。
(6)標準化各種瀏覽器前綴:帶瀏覽器前綴的在前。標準屬性在后。
(7)不使用@import前綴,它會影響css的加載速度。
(8)選擇器優化嵌套,盡量避免層級過深。
(9)css雪碧圖,同一頁面相近部分的小圖標,方便使用,減少頁面的請求次數,但是同時圖片本身會變大,使用時,優劣考慮清
楚,再使用。
(10)正確使用display的屬性,由于display的作用,某些樣式組合會無效,徒增樣式體積的同時也影響解析性能。
(11)不濫用web字體。對于中文網站來說WebFonts可能很陌生,國外卻很流行。webfonts通常體積龐大,而且一些瀏
覽器在下載webfonts時會阻塞頁面渲染損傷性能。
可維護性、健壯性:
(1)將具有相同屬性的樣式抽離出來,整合并通過class在頁面中進行使用,提高css的可維護性。
(2)樣式與內容分離:將css代碼定義到外部css中。
詳細資料可以參考:《CSS 優化、提高性能的方法有哪些?》《CSS 優化,提高性能的方法》
樣式系統從關鍵選擇器開始匹配,然后左移查找規則選擇器的祖先元素。只要選擇器的子樹一直在工作,樣式系統就會持續左移,直
到和規則匹配,或者是因為不匹配而放棄該規則。
試想一下,如果采用從左至右的方式讀取CSS規則,那么大多數規則讀到最后(最右)才會發現是不匹配的,這樣做會費時耗能,
最后有很多都是無用的;而如果采取從右向左的方式,那么只要發現最右邊選擇器不匹配,就可以直接舍棄了,避免了許多無效匹配。
詳細資料可以參考:《探究 CSS 解析原理》
(1)偶數字號相對更容易和web設計的其他部分構成比例關系。比如:當我用了14px的正文字號,我可能會在一些地方用14
×0.5=7px的margin,在另一些地方用14×1.5=21px的標題字號。
(2)瀏覽器緣故,低版本的瀏覽器ie6會把奇數字體強制轉化為偶數,即13px渲染為14px。
(3)系統差別,早期的Windows里,中易宋體點陣只有12和14、15、16px,唯獨缺少13px。
詳細資料可以參考:《談談網頁中使用奇數字體和偶數字體》《現在網頁設計中的為什么少有人用 11px、13px、15px 等奇數的字體?》
margin是用來隔開元素與元素的間距;padding是用來隔開元素與內容的間隔。
margin用于布局分開元素使元素與元素互不相干。
padding用于元素與內容之間的間隔,讓內容(文字)與(包裹)元素之間有一段距離。
何時應當使用margin:
?需要在border外側添加空白時。
?空白處不需要背景(色)時。
?上下相連的兩個盒子之間的空白,需要相互抵消時。如15px+20px的margin,將得到20px的空白。
何時應當時用padding:
?需要在border內測添加空白時。
?空白處需要背景(色)時。
?上下相連的兩個盒子之間的空白,希望等于兩者之和時。如15px+20px的padding,將得到35px的空白。
我的理解是把常用的css樣式單獨做成css文件……通用的和業務相關的分離出來,通用的做成樣式模塊兒共享,業務相關的,放
進業務相關的庫里面做成對應功能的模塊兒。
詳細資料可以參考:《CSS 規范-分類方法》
all屬性實際上是所有CSS屬性的縮寫,表示,所有的CSS屬性都怎樣怎樣,但是,不包括unicode-bidi和direction
這兩個CSS屬性。支持三個CSS通用屬性值,initial,inherit,unset。
initial是初始值的意思,也就是該元素元素都除了unicode-bidi和direction以外的CSS屬性都使用屬性的默認初始
值。
inherit是繼承的意思,也就是該元素除了unicode-bidi和direction以外的CSS屬性都繼承父元素的屬性值。
unset是取消設置的意思,也就是當前元素瀏覽器或用戶設置的CSS忽略,然后如果是具有繼承特性的CSS,如color,則
使用繼承值;如果是沒有繼承特性的CSS屬性,如background-color,則使用初始值。
詳細資料可以參考:《簡單了解 CSS3 的 all 屬性》
采用*{pading:0;margin:0;}這樣的寫法好處是寫起來很簡單,但是是通配符,需要把所有的標簽都遍歷一遍,當網站較大時,
樣式比較多,這樣寫就大大的加強了網站運行的負載,會使網站加載的時候需要很長一段時間,因此一般大型的網站都有分層次的一
套初始化樣式。
出于性能的考慮,并不是所有標簽都會有padding和margin,因此對常見的具有默認padding和margin的元素初始化即
可,并不需使用通配符*來初始化。
(1)內聯元素也可以作為“包含塊”所在的元素;
(2)“包含塊”所在的元素不是父塊級元素,而是最近的position不為static的祖先元素或根元素;
(3)邊界是paddingbox而不是contentbox。
hasLayout是IE特有的一個屬性。很多的IE下的cssbug都與其息息相關。在IE中,一個元素要么自己對自身的內容進
行計算大小和組織,要么依賴于父元素來計算尺寸和組織內容。當一個元素的hasLayout屬性值為true時,它負責對自己和可
能的子孫元素進行尺寸計算和定位。雖然這意味著這個元素需要花更多的代價來維護自身和里面的內容,而不是依賴于祖先元素來完
成這些工作。
詳細資料可以參考:《CSS 基礎篇--CSS 中 IE 瀏覽器的 hasLayout,IE 低版本的 bug 根源》《CSS 魔法堂:hasLayout 原來是這樣的!》
如果是height的話,是相對于包含塊的高度。
如果是padding或者margin豎直方向的屬性則是相對于包含塊的寬度。
原理:有點類似于輪播,整體的元素一直排列下去,假設有5個需要展示的全屏頁面,那么高度是500%,只是展示100%,容器及容
器內的頁面取當前可視區高度,同時容器的父級元素overflow屬性值設為hidden,通過更改容器可視區的位置來實現全
屏滾動效果。主要是響應鼠標事件,頁面通過CSS的動畫效果,進行移動。
overflow:hidden;transition:all1000msease;
詳細資料可以參考:《js 實現網頁全屏切換(平滑過渡),鼠標滾動切換》《用 ES6 寫全屏滾動插件》
響應式網站設計是一個網站能夠兼容多個終端,而不是為每一個終端做一個特定的版本。基本原理是通過媒體查詢檢測不同的設備屏
幕尺寸做處理。頁面頭部必須有meta聲明的viewport。
詳細資料可以參考:《響應式布局原理》《響應式布局的實現方法和原理》
視差滾動是指多層背景以不同的速度移動,形成立體的運動效果,帶來非常出色的視覺體驗。
詳細資料可以參考:《如何實現視差滾動效果的網頁?》
chrome表單自動填充后,input文本框的背景會變成黃色的,通過審查元素可以看到這是由于chrome會默認給自動填充的in
put表單加上input:-webkit-autofill私有屬性,然后對其賦予以下樣式:
{
background-color:rgb(250,255,189)!important;
background-image:none!important;
color:rgb(0,0,0)!important;
}
對chrome默認定義的background-color,background-image,color使用important是不能提高其優先級的,但是
其他屬性可使用。
使用足夠大的純色內陰影來覆蓋input輸入框的黃色背景,處理如下
input:-webkit-autofill,textarea:-webkit-autofill,select:-webkit-autofill{
-webkit-box-shadow:000px1000pxwhiteinset;
border:1pxsolid#CCC!important;
}
詳細資料可以參考:《去掉 chrome 記住密碼后的默認填充樣式》《修改谷歌瀏覽器 chrome 記住密碼后自動填充表單的黃色背景》
在谷歌下css設置字體大小為12px及以下時,顯示都是一樣大小,都是默認12px。
解決辦法:
(1)可以使用Webkit的內核的-webkit-text-size-adjust的私有CSS屬性來解決,只要加了-webkit-text-size
-adjust:none;字體大小就不受限制了。但是chrome更新到27版本之后就不可以用了。所以高版本chrome谷歌瀏覽器
已經不再支持-webkit-text-size-adjust樣式,所以要使用時候慎用。
(2)還可以使用css3的transform縮放屬性-webkit-transform:scale(0.5);注意-webkit-transform:scale(0.
75);收縮的是整個元素的大小,這時候,如果是內聯元素,必須要將內聯元素轉換成塊元素,可以使用display:block/
inline-block/...;
(3)使用圖片:如果是內容固定不變情況下,使用將小于12px文字內容切出做圖片,這樣不影響兼容也不影響美觀。
詳細資料可以參考:《谷歌瀏覽器不支持 CSS 設置小于 12px 的文字怎么辦?》
webkit內核的私有屬性:-webkit-font-smoothing,用于字體抗鋸齒,使用后字體看起來會更清晰舒服。
在MacOS測試環境下面設置-webkit-font-smoothing:antialiased;但是這個屬性僅僅是面向MacOS,其他操作系統設
置后無效。
詳細資料可以參考:《讓字體變的更清晰 CSS 中-webkit-font-smoothing》
italic和oblique這兩個關鍵字都表示“斜體”的意思。
它們的區別在于,italic是使用當前字體的斜體字體,而oblique只是單純地讓文字傾斜。如果當前字體沒有對應的斜體字體,
則退而求其次,解析為oblique,也就是單純形狀傾斜。
設備像素指的是物理像素,一般手機的分辨率指的就是設備像素,一個設備的設備像素是不可變的。
css像素和設備獨立像素是等價的,不管在何種分辨率的設備上,css像素的大小應該是一致的,css像素是一個相對單位,它是相
對于設備像素的,一個css像素的大小取決于頁面縮放程度和dpr的大小。
dpr指的是設備像素和設備獨立像素的比值,一般的pc屏幕,dpr=1。在iphone4時,蘋果推出了retina屏幕,它的dpr
為2。屏幕的縮放會改變dpr的值。
ppi指的是每英寸的物理像素的密度,ppi越大,屏幕的分辨率越大。
詳細資料可以參考:《什么是物理像素、虛擬像素、邏輯像素、設備像素,什么又是 PPI,DPI,DPR 和 DIP》《前端工程師需要明白的「像素」》《CSS 像素、物理像素、邏輯像素、設備像素比、PPI、Viewport》《前端開發中像素的概念》
相關知識點:
如果把移動設備上瀏覽器的可視區域設為viewport的話,某些網站就會因為viewport太窄而顯示錯亂,所以這些瀏覽器就決定
默認情況下把viewport設為一個較寬的值,比如980px,這樣的話即使是那些為桌面設計的網站也能在移動瀏覽器上正常顯示了。
ppk把這個瀏覽器默認的viewport叫做layoutviewport。
layoutviewport的寬度是大于瀏覽器可視區域的寬度的,所以我們還需要一個viewport來代表瀏覽器可視區域的大小,ppk把
這個viewport叫做visualviewport。
idealviewport是最適合移動設備的viewport,idealviewport的寬度等于移動設備的屏幕寬度,只要在css中把某一元
素的寬度設為idealviewport的寬度(單位用px),那么這個元素的寬度就是設備屏幕的寬度了,也就是寬度為100%的效果。i
dealviewport的意義在于,無論在何種分辨率的屏幕下,那些針對idealviewport而設計的網站,不需要用戶手動縮放,也
不需要出現橫向滾動條,都可以完美的呈現給用戶。
回答:
移動端一共需要理解三個viewport的概念的理解。
第一個視口是布局視口,在移動端顯示網頁時,由于移動端的屏幕尺寸比較小,如果網頁使用移動端的屏幕尺寸進行布局的話,那么整
個頁面的布局都會顯示錯亂。所以移動端瀏覽器提供了一個layoutviewport布局視口的概念,使用這個視口來對頁面進行布局展
示,一般layoutviewport的大小為980px,因此頁面布局不會有太大的變化,我們可以通過拖動和縮放來查看到這個頁面。
第二個視口指的是視覺視口,visualviewport指的是移動設備上我們可見的區域的視口大小,一般為屏幕的分辨率的大小。visu
alviewport和layoutviewport的關系,就像是我們通過窗戶看外面的風景,視覺視口就是窗戶,而外面的風景就是布局視口
中的網頁內容。
第三個視口是理想視口,由于layoutviewport一般比visualviewport要大,所以想要看到整個頁面必須通過拖動和縮放才
能實現。所以又提出了idealviewport的概念,idealviewport下用戶不用縮放和滾動條就能夠查看到整個頁面,并且頁面在
不同分辨率下顯示的內容大小相同。idealviewport其實就是通過修改layoutviewport的大小,讓它等于設備的寬度,這個
寬度可以理解為是設備獨立像素,因此根據idealviewport設計的頁面,在不同分辨率的屏幕下,顯示應該相同。
詳細資料可以參考:《移動前端開發之 viewport 的深入理解》《說說移動前端中 viewport(視口)》《移動端適配知識你到底知多少》
因為移動端瀏覽器默認的viewport叫做layoutviewport。在移動端顯示時,因為layoutviewport的寬度大于移動端屏幕
的寬度,所以頁面會出現滾動條左右移動,fixed的元素是相對layoutviewport來固定位置的,而不是移動端屏幕來固定位置的
,所以會出現感覺fixed無效的情況。
如果想實現fixed相對于屏幕的固定效果,我們需要改變的是viewport的大小為idealviewport,可以如下設置:
<metaname="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-sca
le=1.0,user-scalable=no"/>
多數顯示器默認頻率是60Hz,即1秒刷新60次,所以理論上最小間隔為1/60*1000ms=16.7ms
移除空格、使用margin負值、使用font-size:0、letter-spacing、word-spacing
詳細資料可以參考:《去除 inline-block 元素間間距的 N 種方法》
以下代碼可解決這種卡頓的問題:-webkit-overflow-scrolling:touch;是因為這行代碼啟用了硬件加速特性,所以滑動很流
暢。
詳細資料可以參考:《解決頁面使用 overflow:scroll 在 iOS 上滑動卡頓的問題》
(1)外層div使用position:relative;高度要求自適應的div使用position:absolute;top:100px;bottom:0;
left:0;right:0;
(2)使用flex布局,設置主軸為豎軸,第二個div的flex-grow為1。
詳細資料可以參考:《有一個高度自適應的 div,里面有兩個 div,一個高度 100px,希望另一個填滿剩下的高度(三種方案)》
相關知識點:
(1)BMP,是無損的、既支持索引色也支持直接色的、點陣圖。這種圖片格式幾乎沒有對數據進行壓縮,所以BMP格式的圖片通常
具有較大的文件大小。
(2)GIF是無損的、采用索引色的、點陣圖。采用LZW壓縮算法進行編碼。文件小,是GIF格式的優點,同時,GIF格式還具
有支持動畫以及透明的優點。但,GIF格式僅支持8bit的索引色,所以GIF格式適用于對色彩要求不高同時需要文件體積
較小的場景。
(3)JPEG是有損的、采用直接色的、點陣圖。JPEG的圖片的優點,是采用了直接色,得益于更豐富的色彩,JPEG非常適合用來
存儲照片,與GIF相比,JPEG不適合用來存儲企業Logo、線框類的圖。因為有損壓縮會導致圖片模糊,而直接色的選用,
又會導致圖片文件較GIF更大。
(4)PNG-8是無損的、使用索引色的、點陣圖。PNG是一種比較新的圖片格式,PNG-8是非常好的GIF格式替代者,在可能的
情況下,應該盡可能的使用PNG-8而不是GIF,因為在相同的圖片效果下,PNG-8具有更小的文件體積。除此之外,PNG-8
還支持透明度的調節,而GIF并不支持。現在,除非需要動畫的支持,否則我們沒有理由使用GIF而不是PNG-8。
(5)PNG-24是無損的、使用直接色的、點陣圖。PNG-24的優點在于,它壓縮了圖片的數據,使得同樣效果的圖片,PNG-24格
式的文件大小要比BMP小得多。當然,PNG24的圖片還是要比JPEG、GIF、PNG-8大得多。
(6)SVG是無損的、矢量圖。SVG是矢量圖。這意味著SVG圖片由直線和曲線以及繪制它們的方法組成。當你放大一個SVG圖
片的時候,你看到的還是線和曲線,而不會出現像素點。這意味著SVG圖片在放大時,不會失真,所以它非常適合用來繪制企
業Logo、Icon等。
(7)WebP是谷歌開發的一種新圖片格式,WebP是同時支持有損和無損壓縮的、使用直接色的、點陣圖。從名字就可以看出來它是
為Web而生的,什么叫為Web而生呢?就是說相同質量的圖片,WebP具有更小的文件體積。現在網站上充滿了大量的圖片,
如果能夠降低每一個圖片的文件大小,那么將大大減少瀏覽器和服務器之間的數據傳輸量,進而降低訪問延遲,提升訪問體驗。
?在無損壓縮的情況下,相同質量的WebP圖片,文件大小要比PNG小26%;
?在有損壓縮的情況下,具有相同圖片精度的WebP圖片,文件大小要比JPEG小25%~34%;
?WebP圖片格式支持圖片透明度,一個無損壓縮的WebP圖片,如果要支持透明度只需要22%的格外文件大小。
但是目前只有Chrome瀏覽器和Opera瀏覽器支持WebP格式,兼容性不太好。
回答:
我了解到的一共有七種常見的圖片的格式。
(1)第一種是BMP格式,它是無損壓縮的,支持索引色和直接色的點陣圖。由于它基本上沒有進行壓縮,因此它的文件體積一般比
較大。
(2)第二種是GIF格式,它是無損壓縮的使用索引色的點陣圖。由于使用了LZW壓縮方法,因此文件的體積很小。并且GIF還
支持動畫和透明度。但因為它使用的是索引色,所以它適用于一些對顏色要求不高且需要文件體積小的場景。
(3)第三種是JPEG格式,它是有損壓縮的使用直接色的點陣圖。由于使用了直接色,色彩較為豐富,一般適用于來存儲照片。但
由于使用的是直接色,可能文件的體積相對于GIF格式來說更大。
(4)第四種是PNG-8格式,它是無損壓縮的使用索引色的點陣圖。它是GIF的一種很好的替代格式,它也支持透明度的調整,并
且文件的體積相對于GIF格式更小。一般來說如果不是需要動畫的情況,我們都可以使用PNG-8格式代替GIF格式。
(5)第五種是PNG-24格式,它是無損壓縮的使用直接色的點陣圖。PNG-24的優點是它使用了壓縮算法,所以它的體積比BMP
格式的文件要小得多,但是相對于其他的幾種格式,還是要大一些。
(6)第六種格式是svg格式,它是矢量圖,它記錄的圖片的繪制方式,因此對矢量圖進行放大和縮小不會產生鋸齒和失真。它一般
適合于用來制作一些網站logo或者圖標之類的圖片。
(7)第七種格式是webp格式,它是支持有損和無損兩種壓縮方式的使用直接色的點陣圖。使用webp格式的最大的優點是,在相
同質量的文件下,它擁有更小的文件體積。因此它非常適合于網絡圖片的傳輸,因為圖片體積的減少,意味著請求時間的減小,
這樣會提高用戶的體驗。這是谷歌開發的一種新的圖片格式,目前在兼容性上還不是太好。
詳細資料可以參考:《圖片格式那么多,哪種更適合你?》
(1)寬高判斷法。通過創建image對象,將其src屬性設置為webp格式的圖片,然后在onload事件中獲取圖片的寬高,如
果能夠獲取,則說明瀏覽器支持webp格式圖片。如果不能獲取或者觸發了onerror函數,那么就說明瀏覽器不支持webp格
式的圖片。
(2)canvas判斷方法。我們可以動態的創建一個canvas對象,通過canvas的toDataURL將設置為webp格式,然后判斷
返回值中是否含有image/webp字段,如果包含則說明支持WebP,反之則不支持。
詳細資料可以參考:《判斷瀏覽器是否支持 WebP 圖片》《toDataURL()》
網站向服務器請求的時候,會自動帶上cookie這樣增加表頭信息量,使請求變慢。
如果靜態文件都放在主域名下,那靜態文件請求的時候都帶有的cookie的數據提交給server的,非常浪費流量,所以不如隔離開
,靜態資源放CDN。
因為cookie有域的限制,因此不能跨域提交請求,故使用非主要域名的時候,請求頭中就不會帶有cookie數據,這樣可以降低請
求頭的大小,降低請求時間,從而達到降低整體請求延時的目的。
同時這種方式不會將cookie傳入WebServer,也減少了WebServer對cookie的處理分析環節,提高了webserver的
http請求的解析速度。
詳細資料可以參考:《CDN 是什么?使用 CDN 有什么優勢?》
頁面加載自上而下當然是先加載樣式。寫在body標簽后由于瀏覽器以逐行方式對HTML文檔進行解析,當解析到寫在尾部的樣式
表(外聯或寫在style標簽)會導致瀏覽器停止之前的渲染,等待加載且解析樣式表完成之后重新渲染,在windows的IE下可
能會出現FOUC現象(即樣式失效導致的頁面閃爍問題)
CSS預處理器定義了一種新的語言,其基本思想是,用一種專門的編程語言,為CSS增加了一些編程的特性,將CSS作為目標生成
文件,然后開發者就只要使用這種語言進行編碼工作。通俗的說,CSS預處理器用一種專門的編程語言,進行Web頁面樣式設計,然
后再編譯成正常的CSS文件。
預處理器例如:LESS、Sass、Stylus,用來預編譯Sass或lesscsssprite,增強了css代碼的復用性,還有層級、mixin、
變量、循環、函數等,具有很方便的UI組件模塊化開發能力,極大的提高工作效率。
CSS后處理器是對CSS進行處理,并最終生成CSS的預處理器,它屬于廣義上的CSS預處理器。我們很久以前就在用CSS后
處理器了,最典型的例子是CSS壓縮工具(如clean-css),只不過以前沒單獨拿出來說過。還有最近比較火的Autoprefixer,
以CanIUse上的瀏覽器支持數據為基礎,自動處理兼容性問題。
后處理器例如:PostCSS,通常被視為在完成的樣式表中根據CSS規范處理CSS,讓其更有效;目前最常做的是給CSS屬性添加瀏
覽器私有前綴,實現跨瀏覽器兼容性的問題。
詳細資料可以參考:《CSS 預處理器和后處理器》
將一個頁面涉及到的所有圖片都包含到一張大圖中去,然后利用CSS的background-image,background-repeat,background
-position的組合進行背景定位。利用CSSSprites能很好地減少網頁的http請求,從而很好的提高頁面的性能;CSSSprites
能減少圖片的字節。
優點:
減少HTTP請求數,極大地提高頁面加載速度
增加圖片信息重復度,提高壓縮比,減少圖片大小
更換風格方便,只需在一張或幾張圖片上修改顏色或樣式即可實現
缺點:
圖片合并麻煩
維護麻煩,修改一個圖片可能需要重新布局整個圖片,樣式
優點:
在屏幕分辨率千差萬別的時代,只要將rem與屏幕分辨率關聯起來就可以實現頁面的整體縮放,使得在設備上的展現都統一起來了。
而且現在瀏覽器基本都已經支持rem了,兼容性也非常的好。
缺點:
(1)在奇葩的dpr設備上表現效果不太好,比如一些華為的高端機型用rem布局會出現錯亂。
(2)使用iframe引用也會出現問題。
(3)rem在多屏幕尺寸適配上與當前兩大平臺的設計哲學不一致。即大屏的出現到底是為了看得又大又清楚,還是為了看的更多的問
題。
詳細資料可以參考:《css3 的字體大小單位 rem 到底好在哪?》《VW:是時候放棄 REM 布局了》《為什么設計稿是 750px》《使用 Flexible 實現手淘 H5 頁面的終端適配》
采用metaviewport的方式
采用border-image的方式
采用transform:scale()的方式
詳細資料可以參考:《怎么畫一條 0.5px 的邊(更新)》
transition關注的是CSSproperty的變化,property值和時間的關系是一個三次貝塞爾曲線。
animation作用于元素本身而不是樣式屬性,可以使用關鍵幀的概念,應該說可以實現更自由的動畫效果。
5個JavaScript技巧讓你成為更好的開發者
Vue知識點,面試必備(基礎到進階,覆蓋vue3.0,持續更新整理)
前端開發,一份關于vue-cli3項目常用項配置
React實戰之React+Redux實現一個天氣預報小項目
前端開發,用英雄聯盟的方式講解JavaScript設計模式(二)
出處:segmentfault
鏈接:104道 CSS 面試題,助你查漏補缺
文由微信公眾號“科研圈”(ID: keyanquan) 授權轉載
轉載請先聯系keyanquan@huanqiukexue.com
圖片來源:Pixabay
來源 PLoS One
作者 Nicolas P. Rougier, Michael Droettboom, Philip E. Bourne
翻譯 LYM
審校 戚譯引
科學可視化通常被定義為以圖片方式顯示科學數據的過程,然而這個過程并不是直接或者是自動的。相同的數據可以采取很多不同的方法來展現,比如散點圖、線形圖、條形圖和餅狀圖。此外,同樣的數據使用相同類型的圖來表示,在不同的人看來效果是非常不同的。對于科學可視化更準確的定義,是人與數據之間的圖形交互界面。在這篇短文中,我們不會解釋關于這個交互界面的所有內容,相關的介紹性工作請參見文獻 [1]、[2]。我們的目標是提供一套改進圖片設計的基本規則,并解釋一些常見的誤區。
1. 了解你的受眾
根據上述對科學可視化的定義,當視覺信息的接收方與內容傳遞一方的意圖有顯著差異時,問題就產生了。因此,在設計過程中盡早地確認圖像的受眾和信息是很重要的。視覺上的圖形設計應該以此為依據。
如果你正在為自己和直接合作者制作一張圖片,那么你可以跳過設計過程中的許多步驟,因為每個人都知道圖片是關于什么的。然而,如果你打算在科學期刊上發表一張圖片,那么你應該確保圖片內容是正確的,并且把所有相關的信息傳達給更廣泛的讀者。學生讀者需要特別加以關注,因為在這種情況下,你的目標是解釋一個概念。此時你可能需要添加額外的信息,以確保他們可以完全理解這個概念。最后,公眾可能是更難理解圖片內容的讀者了,你需要設計一張簡單的圖片,可能只能表達近似的意義,只展示你研究中最突出的部分(圖 1)。事實證明,這是一個困難的練習(詳見參考文獻 [3])。
圖 1:https://doi.org/10.1371/journal.pcbi.1003833.g001
這張圖片根據 2007 年在《紐約時報》(New York Times)上發布的一張圖片重新制作。新圖片使用了近似數據,用 matplotlib 繪制。數據由四個類別(男性死亡/病例,女性死亡/病例)組成并可以使用經典的雙欄(死亡/病例)條形圖表示。這里使用的布局比原圖片更適合目標受眾。這里他們利用了這樣一個事實,即新的病例數總是大于相應的死亡人數,所以可以將兩組數據對應的圖像重疊起來。此外,他們還利用了閱讀方向上的優勢(《紐約時報》使用英語,閱讀方向是從左到右),以便于男女之間的比較,同時圖片中間的標簽醒目展示了圖片上的主要信息,即不同的癌癥。
這張圖片包含了理解它所需要的全部內容,清楚地傳達了關于癌癥死亡數量的信息。然而圖片并不準確,圖片所選擇的布局使得讀者實際上很難估計腎癌的死亡人數,因為它被標示在圖片底部,而刻度標示在圖片頂部。雖然這對于面向公眾的出版物是可接受的,但如果在文章的其他地方沒有給出實際數值,那么這在科學出版物中是不能接受的。
2. 明確圖片要傳達的信息
無論是在一篇文章還是一個時間有限的口頭報告中,如果一個事實或者結論很難或不可能用簡短的文字來表達,那么圖片就派上了用場。在這種情況下,很重要的一點是要清楚地意識到圖片所扮演的角色——圖片隱含了怎樣的信息,以及如何最好地呈現該信息。一旦明確了這點,這個信息將成為圖片設計的有力指南,如圖 2 所示。只有在明確了圖片需要傳達的信息后,才值得花時間改進你的圖片,就像你在寫文章時只有明確了要點之后才能遣詞造句一樣。如果你的圖片能夠讓人一眼就能看到重要的信息,那么你的文章就有可能吸引更多的關注。
圖 2:https://doi.org/10.1371/journal.pcbi.1003833.g002
上丘(superior colliculus, SC)是位于多功能通路交叉點的腦干結構。有神經生理學研究表明,上丘中的活躍神經元群將視覺目標的位置編碼,從而誘發眼球運動。從視網膜表面(左側)到瞳孔表面(右側)的投影基于一個標準的定量模型,其中一個對數映射函數描述了從視網膜坐標到瞳孔坐標的投影關系。這種對數映射在眼跳(saccade)的決策中起著重要作用。為了更好地說明這個作用,研究人員使用了人工棋盤圖案,即使在實驗中沒有使用這種圖案。這個棋盤圖案清楚地顯示了中央凹注視區域的極端放大,這就是圖形的主要信息。
3. 使圖片適應支持媒介
圖片可以在各種媒體上展示,例如海報、計算機顯示器、投影屏幕(如做口頭報告時)或簡單的紙張(如印刷品中)。每一種媒介都要求圖片有不同的物理尺寸,而且更重要的是,每一種媒介都暗示著觀看者和與圖片交互的不同方式。例如,在做口頭報告的時候,圖片展示的時間比較有限。因此,觀眾必須快速理解圖片內容及其含義,同時還要傾聽你的解釋。在這種情況下,圖片必須保持簡單,必須在視覺上突出信息,以便引起注意,如圖 3 所示。同樣重要的是,在口頭報告中,圖片將被視頻投影并從遠處看到,因此圖片中的元素必須加粗(線條)或放大(點、文本),顏色應具有強烈的對比度,并且應避免垂直文本等。
而對于期刊文章,情況就截然不同,因為讀者想看多久就能看多久,直到看懂圖片為止。這意味著你可以在圖片中添加很多細節,并且在圖注里進行補充解釋。考慮到現在越來越多的人在電腦屏幕上閱讀文章,他們也有可能放大和拖動這個圖片。
在理想情況下,每種類型的支持媒介都需要一張不同的圖片。可千萬別可從論文里復制一張圖片到處貼,比如貼到口頭報告的 PPT 里。
圖 3:https://doi.org/10.1371/journal.pcbi.1003833.g003
這兩幅圖片代表了對雙粒子系統軌跡的相同模擬,其中兩顆粒子之間存在相互作用:
系統可能以三種不同的狀態結束,取決于不同的初始條件。左圖是為期刊文章準備的,讀者可以自由查看每個細節。紅色一直用于表示初始條件(放大區域中的紅點)和軌跡(紅線)。為了突出軌跡重疊的區域(高色密度),增加了線條透明度。右圖是口頭報告準備的圖片,因為圖片的展示時間有限,觀眾無法仔細查看每一個圖片細節,所以許多細節已被刪除(軌跡數量減少,沒有重疊的軌跡,刻度數減少,軸線加粗,刻度標簽減少,沒有標題,線條加粗)。此外,由于圖片將在口頭報告期間介紹,因此圖片的一些部分已被修改,使它們更容易被口頭描述(例如黃色框和紅色虛線)。
4. 圖注是必要的
無論是描述一個實驗設置,引入一個新的模型,還是展示新的結果,你都不能解釋圖片本身中的所有內容——圖片應該帶有圖注。圖注解釋了如何閱讀圖片,并為無法用圖片表示的內容提供額外的準確信息。你可以認為它是你在口頭陳述或活動海報前給出的解釋,只是你必須提前考慮人們會問的問題。
例如,如果你有一張條形圖,不要期望讀者僅僅通過查看和測量圖上的相對高度來猜測不同條形圖的值。如果數值很重要,那么它們必須在文章的其他地方提供,或者在圖上寫得非常清楚。同樣,如果圖片中有一個令人感興趣的點(關鍵域、特定點等),確保它在視覺上是清晰的,而且不要猶豫,在圖注中再次指出。
5. 不要相信默認設置
所有的繪圖庫或者軟件都帶有默認設置。當用戶沒有指定任何設置時,這些默認設置就決定了圖片的尺寸、字體、顏色、樣式、刻度、標記等(圖 4)。幾乎所有的設置都是可以調整的,不過你通常可以一眼認出不同軟件包(比如Matlab,Excel,Keynote 等)或者庫(LaTeX,matplotlib,gnuplot 等)的特殊樣式,這要歸功于這些默認設置的選擇。由于這些設置幾乎可用于任何類型的繪圖,因此它們并沒有針對特定類型的繪圖進行微調。換句話說,這些工具能畫出任何類型的“足夠好”的圖片,但它們畫出的圖都不是最好的。
無論是為了讓一張精確的圖片更容易被廣大讀者看懂,還是為了根據數據本身性質來選擇最佳的顏色圖,所有圖片都需要對不同設置進行一些手動調整,以便更好地表達信息。圖 4 就展示了如何對一張使用 matplotlib 默認設置的圖片進行調整,呈現更好的視覺效果。
圖 4:https://doi.org/10.1371/journal.pcbi.1003833.g004
左圖為采用 matplotlib 默認設置繪制的正弦和余弦函數圖像。雖然圖片足夠清晰,但是你還可以通過調整各種設置來進行改進,如右圖所示。
6. 有效地使用顏色
顏色是人類視覺的一個重要維度,因此在科學圖片的設計中也同樣重要。然而,正如 Edward Tufte 所言,顏色可能是你最好的盟友,但如果使用不當也會變成你最大的敵人[1] 。如果你決定使用顏色,你應該考慮使用哪種顏色,以及在哪里使用它。例如,要想突出顯示圖片中的某些元素,你可以對該元素使用顏色,同時保持其他元素為灰色或黑色,這提供了增強效果。然而,如果你沒有這樣的需要,那就該問問自己:“這張圖表是藍色而不是黑色,這樣做有什么理由嗎?“如果你不知道答案,那么就讓它保持黑色。對于彩色圖片也是如此。不要使用默認的色圖設置(例如墨黑色或彩虹色),除非有明確的理由這樣做(參見圖 5 和文獻 [5])。
圖 5:https://doi.org/10.1371/journal.pcbi.1003833.g005
這幅圖使用三種不同的顏色設置表現了相同的信號,其中頻率從左向右逐漸增加,強度從上到下逐漸增強。彩虹色圖(rainbow colormap,定性)和地震色圖(seismic colormap,發散)都不適合展示這樣的信號,因為它們會隱藏高頻區域(右下角)的細節信息。如果使用連續色圖,比如最右紫色的色圖,我們就更容易看到高頻區域的細節。圖片改編自文獻 [5]。
色圖傳統上分為三大類:
漸變(sequential):使用單一顏色的變化展示從低到高的定量數據;
分裂(diverging):從一種顏色到另一種顏色的變化,用于突出顯示與中位數的偏差;
定性(qualitative):顏色的快速變化,主要用于離散或分類數據。
使用和你的數據最相關的色圖。最后,避免使用過多相似的顏色,因為色盲人士可能在辨認某些顏色方面存在困難。
7. 不要誤導讀者
科學圖片與其它圖片藝術品的區別在于數據的體現,數據需要盡可能客觀地展示出來。根據定義,科學圖片與數據(無論是實驗設置、模型還是某些結果)相關聯,如果你忽略了這種聯系,可能會無意中表達出與預期不同的信息。
客觀地表示結果并不簡單。例如,你所使用的庫或軟件所做的一些隱式選擇在大多數情況下都是準確的,但在某些情況下也可能誤導讀者。如果軟件自動對數值進行縮放處理,你可能會獲得數據的客觀表示(因為標題、標簽和刻度清楚地表明實際顯示的內容),但是這些數據在視覺上具有誤導性(請參見圖 6 中的條形圖);你無意中誤導了你的讀者,使他們在視覺上相信你的數據中不存在的東西。
你還可能在設計上做出明確的錯誤選擇,例如使用餅狀圖或三維圖表來比較數量。這兩種形式的圖片會導致對數量的錯誤感知,你需要具備一些專業知識才能正確使用它們。根據經驗,請務必始終使用最簡單的繪圖類型來傳達你的信息,并確保使用相關的標簽、刻度、標題和完整的數值范圍。最后,不要猶豫,多多詢問同事們如何理解你的圖片吧。
圖 6:https://doi.org/10.1371/journal.pcbi.1003833.g006
在圖的左側,我們展示了四個值:30、20、15、10。在左上角,我們使用圓盤面積來表示數值,而左下方圖片使用圓盤半徑來表示。結果在視覺上非常不同。在后一種情況下(紅色圓盤),最后一個值(10)與第一個值(30)相比顯得非常小,然而這兩個值之間的比率僅為 3∶1。這種情況在文獻中實際上非常常見,因為用于生成圓或散點圖(具有不同大小的點)的命令(或界面)使用半徑作為默認值來指定圓盤大小。因此,使用半徑長度表示一個數值看起來是合乎邏輯的,但這會產生誤導。
在圖的右側,我們采用不同方法顯示一個集合中的 10 個數值,對于頂部數值我們使用坐標的全范圍(y 軸從 0 到 100),底部數值使用坐標的部分范圍(y 軸從 80 到 100),并且我們沒有明確地標記 y 軸,以增強混淆。這兩組圖形的視覺感受完全不同。對于右上方(黑色柱狀圖),我們傾向于將數值解釋為非常相似的值;而在右下方,我們傾向于認為數值之間存在顯著差異。即使我們使用標簽來指明數值的實際范圍,圖片依舊會造成這樣的效果,因為條形的長度就是圖片中最顯著的信息。
8. 避免“圖表垃圾”
圖表垃圾(chartjunk)指圖片中所有不必要或混亂的視覺元素,這些元素不會改善信息的表示(在最好情況下),還可能增加混淆(在最壞情況下)。圖表垃圾可能包括使用過多的顏色、過多的標簽、毫無意義的彩色背景、無用的網格線等(參見圖 7 的左側部分)。Edward Tufte 在文獻 [1] 中首次創造了這個術語,他認為任何不能為讀者提供新信息的裝飾都應該被禁止:“不管原因是什么,那些裝飾中要么沒有數據,要么包含冗余數據,而且通常是圖表垃圾。”因此,為了避免產生圖表垃圾,努力節約一點墨水,或者在計算機時代節約一點電力吧。在文獻 [7] 中,Stephen Few 提醒我們在理想的情況下,圖片應該“表示所有需要被查看和理解其意義的數據”。
不過,在一張圖片中被視為圖表垃圾的元素在另一張圖片中可能是合理的。例如,在常規繪圖中使用背景色通常是一個壞主意,因為它不會帶來有用的信息;然而在圖 7 的右側,如標題中所述我們使用灰色背景框來表示 [?1,+1] 的研究范圍。如果你有疑問,可以參考 Kaiser Fung 的博客 [8],上面有許多案例分析,清楚地解釋了圖表垃圾的概念。
圖 7:https://doi.org/10.1371/journal.pcbi.1003833.g007
我們有同等重要的七個樣本,為了直觀地比較它們,我們想把它們全部展示出來(確切的信號值應該在別處給出)。左圖展示了什么是最糟糕的設計:所有的曲線互相重疊,不同的顏色(軟件自動作出了糟糕的選擇)對區分它們并沒有幫助。圖例框蓋住了部分圖形,因此無法檢查重疊區域中是否有任何有用的信息。此外還有很多問題:x 軸的坐標相互重疊,難以閱讀,而且到小數點后三位的精確度似乎也不攜帶任何重要的信息。最后,圖片中的網格并沒有幫助,因為它沒有與信號對齊,考慮到采樣點的數量很少,可以認為數據是離散的。
而右圖在同樣面積的紙張上采用了完全不同的布局。這一系列數據被分為七個小圖表,每一個表示一類數據,而其他數據組則利用淡色繪制于主要數據后面。數據的標簽被放置在數據的左側,這樣避免了使用顏色和圖例框。x 軸的坐標數值減少到 3 個,并用細線在所有的圖表中表示出這三個數值。最后,y 軸的刻度被完全去除,并利用灰色背景框的高度表示 [-1, +1] 的數據范圍(這點也要在圖片標題中說明,就像圖片要被用在文章里那樣)。
9. 信息重于顏值
在制作圖片方面,每個科學領域都有自己的一套最佳實踐方法。了解這些標準很重要,因為它們有助于將模型、研究或實驗進行更直接的比較。更重要的是,它們可以幫助你在結果中發現明顯的錯誤。不過,大多數時候你可能需要設計一張全新的圖片,因為在描述研究結果這方面并沒有標準的方法。在這種情況下,瀏覽科學文獻是一個很好的起點。如果某篇文章展示了一張驚人的圖片,介紹與你的結果相似的信息,你可以參考它對自己的圖片進行調整(請注意,我們沒有說“復制”,請尊重圖片版權)。
如果你轉向網絡,你必須非常小心,因為數據可視化、信息圖形、設計和藝術之間的界限正在變得越來越模糊 [9]。網上存在著無數的圖片,其中美學是第一標準,內容是第二標準。即使這些圖片中有很多可能大家認為是美觀的,它們中的大多數都不符合科學框架。記住,在科學中,圖片的信息和可讀性是最重要的方面,而美觀只是一個選項,如圖 8 所示。
圖 8:https://doi.org/10.1371/journal.pcbi.1003833.g008
這張圖片是一個極端的案例,在這種情況下,即使圖片的美感值得懷疑,其中的信息仍然非常清晰。恐怖谷理論是機器人技術領域的一個眾所周知的假設,它將我們的舒適度與機器人與人類的相似程度聯系起來。為了表示這個理論假設,研究人員使用了一個假設的數據來描述:
圖片采用了一種手繪風格(類似對 matplotlib 的圖片使用 xkcd “濾鏡”),并配合卡通字體,以增強整體效果。橫坐標也被移除,因為整體曲線的形狀才是最重要的信息。使用手繪風格能向讀者傳達出這樣的信息:圖中數據僅為近似值,并且重要的是更高層次的整體概念,而不是低層次的細節。
10. 使用正確的工具
在繪制圖片時,有許多工具可以讓你更輕松,并且了解其中的一些可以為你節省大量時間。針對每個不同的圖片類型,通常有一個專用工具可以完成你想要實現的目標。而至關重要的是,要了解你用于制作可視化圖片的工具(軟件或庫)可能與你用于研究和/或分析數據的工具不同。你可以導出繪圖工具中的數據,以便在其他工具中使用它。無論是繪制圖表、設計實驗示意圖還是用數據作圖,都有適合你的開源工具。它們只是等待著被發現和使用。下面是一小部分開源工具的介紹。
Matplotlib是一個 python 繪圖庫,主要用于二維作圖,但也支持一些三維作圖,可以生成具有出版級品質的各種可拷貝格式和跨平臺交互式環境的圖片。 它還附帶了一個大型圖庫,涵蓋幾乎所有科學領域:http://matplotlib.org/gallery.html
R 語言是關于統計計算和圖形的語言環境。R 語言提供各種統計功能(線性和非線性建模,經典統計測試,時間序列分析,分類,聚類等)和圖形技術,并且具有高度可擴展性。
Inkscape 是一個專業的矢量圖片編輯器。它允許設計復雜的圖形,例如它可以用于改進腳本生成的圖片或讀取 PDF 文件,以便讓你用各種方式提取圖形和進行轉換。
TikZ 和PGF是用于以編程方式創建圖形的 TeX 包。 TikZ 建立在 PGF 之上,允許你以相當直觀和簡單的方式創建復雜的圖形,如 Tikz 圖庫所示:http://www.texample.net/tikz/examples/all/
GIMP 是 GNU 圖像處理程序。它適用于照片修飾、圖像合成和圖像創作等任務。如果需要快速修飾圖像或添加一些圖例、標簽,GIMP 就是完美的工具。
ImageMagick 是一個軟件套件,用于從命令行創建,編輯,編寫或轉換位圖圖像。 它可用于快速將圖像轉換為另一種格式,Fred Weinhaus 的巨大腳本庫還將提供你要實現的幾乎任何效果:
D3.js 簡稱 D3,即數據驅動文檔(Data-Driven Documents)。這是一個 JavaScript 庫,它提供了一種簡單的方法來創建和控制在 Web 瀏覽器中運行的基于數據的交互式圖形表單:
Cytoscape 是一個軟件平臺,用于可視化復雜網絡,并將其與任何類型的屬性數據(attribute data)進行整合。如果你的數據或結果非常復雜,Cytoscape 可能會幫助你減輕這種復雜性。
Circos 最初的設計方向是用于可視化基因組數據,但它也可以根據任何領域的數據創建圖片。如果你的數據在一個或多個尺度上描述了描述一個或多個比例的關系或多層注釋的數據,那么 Circos 就非常有用。
注:文章中的所有圖片均由 matplotlib 繪制而成,圖片腳本可在https://github.com/rougier/ten-rules獲得。
參考文獻
1. Tufte EG (1983) The Visual Display of Quantitative Information. Cheshire, Connecticut: Graphics Press.
2. Doumont JL (2009) Trees, maps, and theorems. Brussels: Principiae.
3. Kosara R, Mackinlay J (2013) Storytelling: The next step for visualization. IEEE Comput 46: 44–50. 文章鏈接
4. Rougier NP (2012) Scientific visualization and matplotlib tutorial. Euroscipy 2012 & 2013. Available: http://www.loria.fr/~rougier/teaching/matplotlib/matplotlib.html. Accessed 12 August 2014.
5.Borland D, Taylor RM (2007) Rainbow color map (still) considered harmful. IEEE Comput Graph Appl 27: 14–17. 文章鏈接
6. Okabe M, Ito K (2008). Color universal design (cud) - how to make figures and presentations that are friendly to colorblind people. Available: http://jfly.iam.u-tokyo.ac.jp/color/. Accessed 12 August 2014.
7. Few S (2011) The chartjunk debate, a close examination of recent findings. Visual Business Intelligence Newsletter. Available: http://www.perceptualedge.com/articles/visual_business_intelligence/the_chartjunk_debate.pdf. Accessed 12 August 2014.
8. Fung K (2005). Junk charts: Recycling chartjunk as junk art. Available: http://junkcharts.typepad.com. Accessed 12 August 2014.
9. Borkin MA, Vo AA, Bylinskii Z, Isola P, Sunkavalli S, et al. (2013) What makes a visualization memorable? IEEE Trans Vis Comput Graph 19: 2306–2315. 文章鏈接
10. Schumann J, Strothotte T, Raab A, Laser S (1996) Assessing the effect of non-photorealistic rendered images in cad. In: Proceedings of the SIGCHI Conference on Human Factors in Computing Systems; 13–18 April 1996; New York, New York, United States. CHI 96. New York: Association for Computing Machinery. pp.35–41.
原標題:科研作圖十條秘籍,靈魂畫手也能掌握
編輯:Cloudiiink
近期熱門文章Top10
↓ 點擊標題即可查看 ↓
模型
說下盒模型?
有兩種盒模型,W3C盒模型和IE盒模型。通常說的“IE盒子模型”指的是IE5.5,IE6及其以后,盒模型都為 content-box。當瀏覽器未設置<!doctype>聲明時,盒模型都為 border-box。
通過 css3 的box-sizing屬性,可以更改元素的盒子模型。標準 W3C 盒子模型的范圍包括 margin、border、padding、content,并且 content 部分不包含其他部分。
標準盒模型 box-sizing: content-box
IE 盒子模型的范圍也包括 margin、border、padding、content,和標準 W3C 盒子模型不同的是:IE 盒子模型的 content 部分包含了 border 和 pading。IE盒模型 box-sizing: border-box
標準的CSS的盒子模型?
標準盒子模型:寬度=內容的寬度(content)+ border + padding + margin
與低版本IE的盒子模型有什么不同的?
低版本IE盒子模型:寬度=內容寬度(content+border+padding)+ margin
box-sizing屬性?
用來控制元素的盒子模型的解析模式,默認為content-box
context-box:W3C的標準盒子模型,設置元素的 height/width 屬性指的是content部分的高/寬
border-box:IE傳統盒子模型。設置元素的height/width屬性指的是border + padding + content部分的高/寬
盒子模型在不同瀏覽器上的區別
盒子模型是CSS中一個重要的概念,理解了盒子模型才能更好的排版。盒子模型有兩種,分別是IE盒子模型和標準W3C盒子模型。它們對盒子模型的解釋各不相同,先看看我們熟知的標準盒子模型:
標準的w3c盒子模型的范圍包括margin、border、padding、content,并且content部分不包含其他部分。
在來看下IE盒子模型:
IE盒子模型的范圍也包括margin、border、padding、content,和標準w3c盒子模型不同的是:ie盒子模型的content部分包含了border和padding。
例如:
一個盒子的margin為20px,border為1px,padding為10px,content的寬為200px、高為50px,加入用標準盒子模型解釋,那么這個盒子需要占據的位置為:
寬:20*2 + 1 * 2 + 10* 2 + 200 = 262px, 高:20 * 2 + 1 * 2 + 10 * 2 + 50 = 112px。
盒子的實際大小為:寬1*2 + 10 * 2 + 200 = 222px,高1* 2 + 10 * 2 + 50 = 72px。
假如用IE盒子模型,那么盒子需要占據的位置為:
寬:20 * 2 + 200 = 240px,高:20 * 2 + 50 = 70px。
盒子的實際大小:寬200px,高50px。
一般推薦使用W3C盒子模型,怎樣才算是選擇了標準W3C盒子模型呢?就是在網頁上加DOCKTYPE申明。如果不加,那么各個瀏覽器會根據自己的行為去理解網頁。
CSS3增加了box-sizing屬性,值包括content-box|border-box|inherit。
在我們的重置樣式文件中一般也會重置這個屬性,把box-sizing設置成border-box方便于排版。
水平垂直居中
不定寬高水平垂直居中?
1.通過display:flex;justify-content:center; align-items:center;就可以讓子元素不定寬高水平垂直居中
2.也可以父display:flex;,子設置一個margin:auto;
3.通過css3,給父元素設置相對定位,給子元素設置絕對定位,left:50% top:50% 通過transform:translate(-50%,-50%)拉回自身的寬和高的一半。
4.通過給父元素設置display:table-cell; vertical-align:middle text-align:center 給子元素設置vertical-align:middle text-align:center。就可以讓子元素不定寬高水平垂直居中了。
文字在垂直和水平方向重疊的兩個屬性分別是什么?
垂直方向:line-height。設置成比字體高度還小就可以讓兩行重疊
水平方向:letter-spacing。設置為負值即可實現重疊。
如何居中div
-水平居中1:給 div 設置一個寬度,然后添加 margin:0 auto; 屬性
div{
width: 200px;
margin: 0 auto;
}
-水平居中2:利用 text-align:center 實現
.container{
background: rgba(0, 0, 0, .5);
text-align: center:
font-size: 0;
}
.box{
display: inline-block;
width: 500px;
height: 400px;
background-color: pink;
}
-讓絕對定位的div居中
div{
positionn: absolute;
width: 300px;
height: 300px;
margin: auto;
top: 0;
left: 0;
bottom: 0;
right: 0;
background-color: pink; /* 方便看效果 */
}
-水平垂直居中1
/* 確定容器的寬高,寬500高300 */
div{
position: absolute;
width:500px;
height: 300px;
top: 50%;
left: 50%;
margin: -150px 0 0 -250px;
background-color: pink;
}
-水平垂直居中2
/* 未知容器寬高,利用 transform 屬性 */
div{
position: absolute;
width: 500px;
height: 300px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: pink;
}
-水平垂直居中3
/* 利用 flex 布局實際使用時應考慮兼容性 */
.container{
display: flex;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
}
.container div{
width: 100px;
height: 100px;
background-color: pink;
}
為什么margin: 0 auto會讓div居中
margin 可以有4個值,分別對應影響的方向是上,右,下,左, 2個值的時候,對應第一個值是 控制上下距離,第二個值是控制左右, 所以magrgin:0 auto, 就是上下距離為0,auto是自適應,這里指的是左右兩個方向的距離一樣,也就是說,不論你的寬度怎么變化,都是兩個方向距離一樣,形成居中。
要給居中元素一個寬度,否則無效
該元素不可以浮動,否則無效
BFC
什么是BFC?
BFC是W3C CSS2.1規范中的一個概念,在CSS3.0規范中已被修改為flow root。它是頁面中的一塊渲染區域,并且有一套渲染規則,它決定了其子元素將如何定位,以及和其他元素的關系和相互作用。BFC(block formatting context),中文為“塊級格式化上下文”
對BFC的理解?
BFC規定了內部的Block Box如何布局。
定位方案:
內部的Box會在垂直方向上一個接一個放置。
Box垂直方向的距離由margin決定,屬于同一個BFC的兩個相鄰Box的margin會發生重疊。
每個元素的margin box 的左邊,與包含塊border box的左邊相接觸。
BFC的區域不會與float box重疊。
BFC是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。
計算BFC的高度時,浮動元素也會參與計算。
float屬性不為none 【會影響上級元素】
position為absolute或fixed 【會影響上機元素】
display為inline-block, table-cell, table-caption, flex, inline-flex
overflow不為visible, 【建議使用auto/hidden】
<html>根元素
如何觸發BFC?
BFC解決了什么問題?
解決自適應兩欄布局問題:利用BFC的區域不會與float box重疊的規則。
解決浮動后塌陷問題:利用計算BFC的高度時,浮動元素也參與計算規則。
解決垂直margin重疊問題:利用Box垂直方向的距離由margin決定。
屬于同一個BFC(同一個標記)的兩個相鄰Box的margin會發生重疊規則,在一個box外包裹一個容器,讓他生成不同的BFC,這樣就不會margin重疊了。
為什么overflow:hidden能觸發bfc?
塊級格式化上下文 (Block Formatting Context):
盒子在容器(包含塊)內從上到下一個接一個地放置
兩個兄弟盒之間的豎直距離由 margin 屬性決定
同一個 BFC 內垂直 margin 會合并
盒子的左外邊緣挨著容器(包含塊)的左邊
塊級格式化上下文(BFC) 的特性
BFC 內的浮動不會影響到BFC外部的元素
BFC 的高度會包含其內的浮動元素
BFC 不會和浮動元素重疊
BFC 可以通過 overflow:hidden 等方法創建
所有要處理 margin 折疊,就需要讓兩個元素處于不同的BFC,overflow: hidden正好可以觸發BFC
Position
Position定位值有哪些?
static(默認):按照正常文檔流進行排列;
relative:相對定位 一般給父元素設置
absolute:絕對定位 一般給子元素設置 相對父元素或祖先帶定位樣式的元素定位
fixed :固定在某個位置,相對瀏覽器窗口固定在一個位置
Inherit:繼承父元素的position值。
absolute的containing block計算方式跟正常流有什么不同?
無論屬于哪種,都要先找到其祖先元素中最近的 position 值不為 static 的元素,然后再判斷:
若此元素為 inline 元素,則 containing block 為能夠包含這個元素生成的第一個和最后一個 inline box 的 padding box (除 margin, border 外的區域) 的最小矩形;
否則,則由這個祖先元素的 padding box 構成。
如果都找不到,則為 initial containing block。
補充:
static(默認的)/relative:簡單說就是它的父元素的內容框(即去掉padding的部分)
absolute: 向上找最近的定位為absolute/relative的元素
fixed: 它的containing block一律為根元素(html/body)
display
display有哪些值?說明他們的作用?
inline(默認)–內聯
none–隱藏
block–塊顯示
table–表格顯示
list-item–項目列表
inline-block
display:none與visibility:hidden的區別?
display:none 不顯示對應的元素,在文檔布局中不再分配空間(回流+重繪)
visibility:hidden 隱藏對應元素,在文檔布局中仍保留原來的空間(重繪)
即是,使用CSS display:none屬性后,HTML元素(對象)的寬度、高度等各種屬性都將“丟失”;而使用visibility:hidden屬性后,HTML元素(對象)僅僅是在視覺上看不見(完全透明),而它所占據的空間位置任然存在。
display:inline-block 什么時候會顯示間隙?
有空格時候會有間隙 解決:移除空格
margin正值的時候 解決:margin使用負值
使用font-size時候 解決:font-size:0、letter-spacing、word-spacing
overflow屬性定義溢出元素內容區的內容會如何處理?
參數是scroll時候,必會出現滾動條。
參數是auto時候,子元素內容大于父元素時出現滾動條。
參數是visible時候,溢出的內容出現在父元素之外。
參數是hidden時候,溢出隱藏。
visibility屬性有個collapse屬性值?在不同瀏覽器下以后什么區別?
當一個元素的visibility屬性被設置成collapse值后,對于一般的元素,它的表現跟hidden是一樣的。
chrome中,使用collapse值和使用hidden沒有區別。
firefox,opera和IE,使用collapse值和使用display:none沒有什么區別。
position跟display、overflow、float這些特性相互疊加后會怎么樣?
display屬性規定元素應該生成的框的類型;position屬性規定元素的定位類型;float屬性是一種布局方式,定義元素在哪個方向浮動。
類似于優先級機制:position:absolute/fixed優先級最高,有他們在時,float不起作用,display值需要調整。float 或者absolute定位的元素,只能是塊元素或表格。
float浮動
為什么會出現浮動和什么時候需要清除浮動?清除浮動的方式?
浮動元素碰到包含它的邊框或者浮動元素的邊框停留。由于浮動元素不在文檔流中,所以文檔流的塊框表現得就像浮動框不存在一樣。浮動元素會漂浮在文檔流的塊框上。
浮動帶來的問題:
父元素的高度無法被撐開,影響與父元素同級的元素
與浮動元素同級的非浮動元素(內聯元素)會跟隨其后
若非第一個元素浮動,則該元素之前的元素也需要浮動,否則會影響頁面顯示的結構。
清除浮動的方式:
父級div定義height
最后一個浮動元素后加空div標簽 并添加樣式clear:both。
包含浮動元素的父標簽添加樣式overflow為hidden或auto。
父級div定義zoom
設置元素浮動后,該元素的display值是多少?
自動變成display:block
margin和padding分別適合什么場景使用?
何時使用margin:
需要在border外側添加空白
空白處不需要背景色
上下相連的兩個盒子之間的空白,需要相互抵消時。
需要在border內側添加空白
空白處需要背景顏色
上下相連的兩個盒子的空白,希望為兩者之和。
何時使用padding:
兼容性的問題:在IE5 IE6中,為float的盒子指定margin時,左側的margin可能會變成兩倍的寬度。通過改變padding或者指定盒子的display:inline解決。
選擇器
CSS常用選擇器
標簽選擇器
ID選擇器
類選擇器
組選擇器
通配符選擇器
后代選擇器
子元素選擇器
偽類選擇器
哪些屬性可以繼承?
可繼承的屬性:font-size, font-family, color
不可繼承的樣式:border, padding, margin, width, height
優先級(就近原則):!important > [ id > class > tag ]
!important 比內聯優先級高
CSS優先級算法如何計算?
元素選擇符: 1
class選擇符: 10
id選擇符:100
元素標簽:1000
!important聲明的樣式優先級最高,如果沖突再進行計算。
如果優先級相同,則選擇最后出現的樣式。
繼承得到的樣式的優先級最低。
CSS3新增偽類有那些?
p:first-of-type 選擇屬于其父元素的首個元素
p:last-of-type 選擇屬于其父元素的最后元素
p:only-of-type 選擇屬于其父元素唯一的元素
p:only-child 選擇屬于其父元素的唯一子元素
p:nth-child(2) 選擇屬于其父元素的第二個子元素
:enabled :disabled 表單控件的禁用狀態。
:checked 單選框或復選框被選中。
::before 和 :after 中雙冒號和單冒號的區別?這2個偽元素的作用?
·在 CSS3 中 : 表示偽類, :: 表示偽元素
·想讓插入的內容出現在其他內容前,使用::befroe。否則,使用::after
Flex布局
常見父項的屬性:
●flex-direction :設置主軸的方向
Row 默認值從左到右
row-reverse 從右到左
column 從上到下
column-reverse 從下到上
●justify-content :設置主軸上的子元素排列方式
flex-start 默認值從頭部開始 如果主軸是x軸,則從左到右
flex-end 從尾部開始排列(但元素的順序還是從左到右)
center 在主軸居中對齊(如果主軸是x軸則水平居中)
space- around 平分剩余空間
space – between 先兩邊貼邊再平分剩余空間(重要)
●flex-wrap :設置子元素是否換行
默認情況下,項目都排在一條線(又稱”軸線”) 上。flex-wrap屬性定義 , flex布局中默認是不換行的。
nowrap 默認值,不換行
wrap 換行
●align-content :設置側軸上的子元素的排列方式(多行)
設置子項在側軸.上的排列方式并且只能用于子項出現換行的情況(多行) , 在單行下是沒有效果的。
flex-start 默認值在側軸的頭部開始排列
flex- end 在側軸的尾部開始排列
center 在側軸中間顯示
space-around 子項在側軸平分剩余空間
space- between 子項在側軸先分布在兩頭,再平分剩余空間
stretch 設置子項元素高度平分父元素高度
●align-items :設置側軸上的子元素排列方式(單行)
該屬性是控制子項在側軸(默認是y軸).上的排列方式在子項為單項(單行)的時候使用
flex-start 從上到下
flex- end 從下到上
center 擠在一起居中(垂直居中)
stretch 拉伸(默認值但是子盒子如果給高度就不會生效)
●flex-flow :復合屬性,相當于同時設置了flex-direction和flex-wrap
flex-dicection: column;
flex-wrap: wrap;
它倆的簡寫可以寫成:
flex-flow: column wrap;
常見子項的屬性:
●flex子項目占的份數
flex屬性定義子項目分配剩余空間,用flex來表示占多少份數。
●align-self控制子項自己在側軸的排列方式
align-self屬性允許單個項目有與其他項目不-樣的對齊方式,可覆蓋align-items屬性。
默認值為auto ,表示繼承父元素的align-items屬性,如果沒有父元素,則等同于stretch。
span:nth-child(2){
/*設置自己在側軸的排列方式*/
align-self:flex-end;
}
●order屬性定義子項的排列順序(前后順序)
數值越小,排列越靠前,默認為0。(這個是左右的形式)
注意:和z-index不-樣。(index是疊羅漢的形式)
flex屬性flex:1到底是什么?
flex屬性 是 flex-grow、flex-shrink、flex-basis三個屬性的縮寫。
推薦使用此簡寫屬性,而不是單獨寫這三個屬性。
flex-grow:定義項目的的放大比例;
默認為0,即使存在剩余空間,也不會放大;
所有項目的flex-grow為1:等分剩余空間(自動放大占位);
flex-grow為n的項目,占據的空間(放大的比例)是flex-grow為1的n倍。
flex-shrink:定義項目的縮小比例;
默認為1,即 如果空間不足,該項目將縮小;
所有項目的flex-shrink為1:當空間不足時,縮小的比例相同;
flex-shrink為0:空間不足時,該項目不會縮小;
flex-shrink為n的項目,空間不足時縮小的比例是flex-shrink為1的n倍。
flex-basis: 定義在分配多余空間之前,項目占據的主軸空間(main size),瀏覽器根據此屬性計算主軸是否有多余空間,
默認值為auto,即 項目原本大小;
設置后項目將占據固定空間。
所以flex屬性的默認值為:0 1 auto (不放大會縮小)
flex為none:0 0 auto (不放大也不縮小)
flex為auto:1 1 auto (放大且縮小)
flex為一個非負數字n:該數字為flex-grow的值,
flex:n ;= flex-grow:n;
flex-shrink:1;
flex-basis:0%;
flex為兩個非負數字n1,n2: 分別為flex-grow和flex-shrink的值。
flex:n1 n2;= flex-grow:n1;
flex-shrink:n2;
flex-basis:0%;
flex為一個長度或百分比L:視為flex-basis的值,
flex:L;= flex-grow:1;
flex-shrink:1;
flex-basis:L;
flex為一個非負數字n和一個長度或百分比L:分別為flex-grow和flex-basis的值,
flex:n L;= flex-grow:n;
flex-shrink:1;
flex-basis:L;
可以發現,flex-grow和flex-shrink在flex屬性中不規定值則為1,flex-basis為0%。
flex:1即為flex-grow:1,經常用作自適應布局,將父容器的display:flex,側邊欄大小固定后,將內容區flex:1,內容區則會自動放大占滿剩余空間。
請解釋一下flexbox(彈性盒布局模型),以及適用場景?
該布局模型的目的是提供一種更加高效的方式來對容器中的條目進行布局、對齊和分配空間。在傳統的布局方式中,block 布局是把塊在垂直方向從上到下依次排列的;而 inline 布局則是在水平方向來排列。彈性盒布局并沒有這樣內在的方向限制,可以由開發人員自由操作。
試用場景:彈性布局適合于移動前端開發,在Android和ios上也完美支持。
如何讓DOM元素不顯示在瀏覽器的可視范圍內?
最基本的:
設置display屬性為none,或者設置visiblity為hidden
技巧性:
設置高度為0, 設置透明度為0,設置z-index位置在-1000
一個滿屏品字布局如何設計?
第一種真正的品字:
三塊高寬是確定的;
上面那塊用margin: 0 auto;居中;
下面兩塊用float或者inline-block不換行;
用margin調整位置使他們居中。
第二種全屏的品字布局:
上面的div設置成100%,下面的div分別寬50%,然后使用float或者inline使其不換行。
兼容
常見的兼容性問題?
不同瀏覽器的標簽默認的margin和padding不一樣。*{margin:0;padding:0;}
IE6雙邊距bug:塊屬性標簽float后,又有橫行的margin情況下,在IE6顯示margin比設置的大。hack:display:inline;將其轉化為行內屬性。
漸進識別的方式,從總體中逐漸排除局部。首先,巧妙的使用“9”這一標記,將IE瀏覽器從所有情況中分離出來。接著,再次使用“+”將IE8和IE7、IE6分離開來,這樣IE8已經獨立識別。
{
background-color: #f1ee18;/*所有識別*/
. background-color: #00deff; /*IE6、7、8識別*/
+background-color:#a200ff;/*IE6、7識別*/
_background-color:#1e0bd1;/*IE6識別*/
}
設置較小高度標簽(一般小于10px),在IE6,IE7中高度超出自己設置高度。hack:給超出高度的標簽設置overflow:hidden;或者設置行高line-height 小于你設置的高度。
IE下,可以使用獲取常規屬性的方法來獲取自定義屬性,也可以使用getAttribute()獲取自定義屬性;Firefox下,只能使用getAttribute()獲取自定義屬性。解決方法:統一通過getAttribute()獲取自定義屬性。
Chrome 中文界面下默認會將小于 12px 的文本強制按照 12px 顯示,可通過加入 CSS 屬性 -webkit-text-size-adjust: none; 解決。
超鏈接訪問過后hover樣式就不出現了,被點擊訪問過的超鏈接樣式不再具有hover和active了。解決方法是改變CSS屬性的排列順序:L-V-H-A ( love hate ): a:link {} a:visited {} a:hover {} a:active {}
瀏覽器兼容性有哪些
1. 瀏覽器默認的 margin 和 padding 不同
解決:加一個全局 *{ margin: 0; padding: 0; }來統一
2. 谷歌中文界面下默認會將小于12px 的文本強制按照12px顯示
解決:使用-webkit-transform:scale(.75);收縮的是整個span盒子大小,這時候,必須將span準換成塊元素。
3.超鏈接訪問過后hover樣式就不會出現了,被點擊訪問過的超鏈接樣式不再具有hover 和active 了
解決:改變css 屬性的排列順序L-V-H-A
CSS 預處理器
Less sass
Sass、Less是什么?為什么要使用?
他們是CSS預處理器。他是CSS上的一種抽象層。它們是一種特殊的語法、語言編譯成CSS。
例如Less是一種動態樣式語言。將CSS賦予了動態語言的特性,如變量,繼承,運算,函數。Less即可以在客戶端上運行(支持IE6+,Webkit,Firefox),也可以在服務端運行(借助Node.js)。
Sass變量必須是$開始,而Less變量必須使用@符號開始。
為什么要使用它們?
結構清晰,便于擴展。
可以方便地屏蔽瀏覽器私有語法差異。這個不用多說,封裝對瀏覽器語法差異的重復處理,減少無異議的機械勞動。
可以輕松實現多重繼承。
完全兼容CSS代碼,可以方便地應用到老項目中。Less只是在CSS語法上做了擴展,所以老的CSS代碼也可以與Less代碼一同編譯。
CSS 3的新增特性?
ie9開始支持
1.選擇器增加;
2.樣式增加:常用
比如:圓角。陰影,漸變背景,半透明,圖片邊框等;
3.新增的背景樣式:
背景圖片的顯示范圍,和起點,縮放。
4.引入了flex彈性 盒模型; 常用
5.陰影效果;文本及盒子陰影。 常用
6.顏色與透明;
新增了HSL/HSLA/RGBA幾種顏色模式;
7.web字體和web圖標 常用
@font-face{
font-family: myFont;
src: url('')
}
div{
font-family: myFont
}
8.和容器的變形; 常用
transform: translate(50px,100px);平移
transform: rotate(30deg);旋轉
transform: scale(2,4);縮放
transform: skew(30deg,20deg);翻轉
9.過度動畫和交互; 常用
transition過度和animation動畫
10.word-wrap(對長的不可分割單詞換行)word-wrap:break-word
11.媒體查詢:定義兩套css,當瀏覽器的尺寸變化時會采用不同的屬性
CSS 創建一個三角形
把上、左、右三條邊隱藏掉(顏色設為 transparent)
#demo {
width: 0;
height: 0;
border-width: 20px;
border-style: solid;
border-color: transparent transparent red transparent;
}
CSS 初始化樣式是為什么?
因為瀏覽器的兼容問題,不同瀏覽器對有些標簽的默認值是不同的,如果沒對CSS初始化往往會出現瀏覽器之間的頁面顯示差異。
CSS 優化 提高性能的方法有哪些?
答案一:
避免過度約束
避免后代選擇符
避免鏈式選擇符
使用緊湊的語法
避免不必要的命名空間
避免不必要的重復
最好使用表示語義的名字。一個好的類名應該是描述他是什么而不是像什么
避免!important,可以選擇其他選擇器
盡可能的精簡規則,你可以合并不同類里的重復規則
答案二:
加載性能:
① CSS 壓縮:將寫好的CSS 進行打包壓縮,可以減少很多的體積。
② CSS單一樣式:當需要下邊距和左邊距的時候,很多時候選擇:margin: top 0 bottom 0;
但margin-top: top;margin-bottom: bottom;執行的效率更高。
選擇器性能:
① 關鍵選擇器。選擇器的最后面的部分為關鍵選擇器(即用來匹配目標元素的部分)
CSS 選擇器是怎樣被瀏覽器解析的?
CSS選擇器的解析是從右向左解析的。若從左向右的匹配,發現不符合規則,需要進行回溯,會損失很多性能。若從右向左匹配,先找到所有的最右節點,對于每一個節點,向上尋找其父節點直到找到根元素或滿足條件的匹配規則,則結束這個分支的遍歷。兩種匹配規則的性能差別很大,是因為從右向左的匹配在第一步就篩選掉了大量的不符合條件的最右節點(葉子節點),而從左向右的匹配規則的性能都浪費在了失敗的查找上面。
而在 CSS 解析完畢后,需要將解析的結果與 DOM Tree 的內容一起進行分析建立一棵 Render Tree,最終用來進行繪圖。在建立 Render Tree 時(WebKit 中的「Attachment」過程),瀏覽器就要為每個 DOM Tree 中的元素根據 CSS 的解析結果(Style Rules)來確定生成怎樣的 Render Tree。
CSS Sprites
將一個頁面涉及到的所有圖片都包含到一張大圖中去,然后利用CSS的 background-image,background- repeat,background-position 的組合進行背景定位。利用CSS Sprites能很好地減少網頁的http請求,從而大大的提高頁面的性能;CSS Sprites能減少圖片的字節。
CSS Hack是什么?ie6,7,8的hack分別是什么?
針對不同的瀏覽器寫不同的CSS Code的過程,就是CSS Hack。實例如下:
#test{
width: 300px;
height: 300px;
background-color: blue;
background-color: red; /* all ie */
background-color: yellow>background-color: yellow\0; /* ie8 */<; /* ie8 */
+background-color: pink; /* ie7 */
_background-color: orange; /* ie6 */
:root #test{
background: purple; /* ie9 */
}
@media all and {min-width: 0px} #test{background-color: black>@media all and {min-width: 0px} #test{background-color: black\0;} /* opera */<;} /* opera */
@media screen and {-webkit-min-device-pixel-ratio: 0 } {#test {background-color: gray}} /* chrome and safari */
}
@media可以針對不同的媒體類型定義不同的樣式。特別是如果你需要設計響應式的頁面,@media是非常有用的。當你重置瀏覽器大小的過程中,頁面也會根據瀏覽器寬度和高度重新渲染頁面。
CSS 引入方式?
外部樣式表。引入一個外部CSS文件;
內部樣式表。將CSS代碼放在<head>標簽內部;
內聯樣式,將CSS樣式直接定義在HTML元素內部;
移動端的布局用過媒體查詢嗎?
通過媒體查詢可以為不同大小和尺寸的媒體定義不同的css,適應相應的設備的顯示。
<head>里邊<link rel=”stylesheet” type=”text/css” href=”xxx.css” media=”only screen and (max-device-width:480px)”>
CSS : @media only screen and (max-device-width:480px) {/css樣式/}
在網頁中的應該使用奇數還是偶數的字體?為什么呢?
使用偶數字體。偶數字號相對更容易和 web 設計的其他部分構成比例關系。Windows 自帶的點陣宋體(中易宋體)從 Vista 開始只提供 12、14、16 px 這三個大小的點陣,而 13、15、17 px時用的是小一號的點。(即每個字占的空間大了 1 px,但點陣沒變),于是略顯稀疏。
元素豎向的百分比設定是相對于容器的高度嗎?
當按百分比設定一個元素的寬度時,它是相對于父容器的寬度計算的,但是,對于一些表示豎向距離的屬性,例如 padding-top , padding-bottom , margin-top , margin-bottom 等,當按百分比設定它們時,依據的也是父容器的寬度,而不是高度。
全屏滾動的原理是什么?用到了CSS的哪些屬性?
原理:有點類似于輪播,整體的元素一直排列下去,假設有5個需要展示的全屏頁面,那么高度是500%,只是展示100%,剩下的可以通過transform進行y軸定位,也可以通過margin-top實現
overflow:hidden;transition:all 1000ms ease;
什么是響應式設計?響應式設計的基本原理是什么?如何兼容低版本的IE?
響應式網站設計(Responsive Web design)是一個網站能夠兼容多個終端,而不是為每一個終端做一個特定的版本。
基本原理是通過媒體查詢檢測不同的設備屏幕尺寸做處理。
頁面頭部必須有meta聲明的viewport。
視差滾動效果?
視差滾動(Parallax Scrolling)通過在網頁向下滾動的時候,控制背景的移動速度比前景的移動速度慢來創建出令人驚嘆的3D效果。
CSS3實現
優點:開發時間短、性能和開發效率比較好,缺點是不能兼容到低版本的瀏覽器
jQuery實現
通過控制不同層滾動速度,計算每一層的時間,控制滾動效果。
優點:能兼容到各個版本的,效果可控性好
缺點:開發起來對制作者要求高
插件實現方式
例如:parallax-scrolling,兼容性十分好
line-height的理解?
行高是指一行文字的高度,具體說是兩行文字間基線的距離。CSS中起高度作用的是height和line-height,沒有定義height屬性,最終其表現作用一定是line-height。
單行文本垂直居中:把line-height值設置為height一樣大小的值可以實現單行文字的垂直居中,其實也可以把height刪除。
多行文本垂直居中:需要設置display屬性為inline-block。
讓頁面里的字體變清晰,變細用CSS怎么做?
-webkit-font-smoothing在window系統下沒有起作用,但是在IOS設備上起作用-webkit-font-smoothing:antialiased是最佳的,灰度平滑。
如果需要手動寫動畫,你認為最小時間間隔是多久,為什么?
多數顯示器默認頻率是60Hz,即1秒刷新60次,所以理論上最小間隔為1/60*1000ms = 16.7ms。
li與li之間不可見空白間隔引起原因?解決辦法?
行框的排列會受到中間空白(回車空格)等的影響,因為空格也屬于字符,這些空白也會被應用樣式,占據空間,所以會有間隔,把字符大小設為0,就沒有空格了。
解決方法:
可以將<li>代碼全部寫在一排
浮動li中float:left
在ul中用font-size:0(谷歌不支持);可以使用letter-space:-3px
width: auto 和 width: 100% 的區別
width: 100% 會使元素box的寬度等于父元素的contentbox的寬度
width: auto 會時元素撐滿整個父元素,margin, border, padding, content 區域會自動分配水平空間
有一個高度自適應的div,里面有兩個div,一個高度100px,希望另一個填滿剩下的高度
外層div使用position:relative;高度要求自適應的div使用position: absolute; top: 100px; bottom: 0; left: 0
png、jpg、gif 這些圖片格式解釋一下,分別什么時候用。有沒有了解過webp?
png是便攜式網絡圖片(Portable Network Graphics)是一種無損數據壓縮位圖文件格式.優點是:壓縮比高,色彩好。 大多數地方都可以用。
jpg是一種針對相片使用的一種失真壓縮方法,是一種破壞性的壓縮,在色調及顏色平滑變化做的不錯。在www上,被用來儲存和傳輸照片的格式。
gif是一種位圖文件格式,以8位色重現真色彩的圖像。可以實現動畫效果.
webp格式是谷歌在2010年推出的圖片格式,壓縮率只有jpg的2/3,大小比png小了45%。缺點是壓縮的時間更久了,兼容性不好,目前谷歌和opera支持。
style標簽寫在body后與body前有什么區別?
頁面加載自上而下 當然是先加載樣式。
寫在body標簽后由于瀏覽器以逐行方式對HTML文檔進行解析,當解析到寫在尾部的樣式表(外聯或寫在style標簽)會導致瀏覽器停止之前的渲染,等待加載且解析樣式表完成之后重新渲染,在windows的IE下可能會出現FOUC現象(即樣式失效導致的頁面閃爍問題)
使用 base64 編碼的優缺點
base64編碼是一種圖片處理格式,通過特定的算法將圖片編碼成一長串字符串,
在頁面上顯示時可用該字符串來代替圖片的url屬性
使用base64的優點:
① 減少一個圖片的 HTTP 請求
使用base64的缺點:
① 根據base64的編碼原理,編碼后的大小會比源文件大小大1/3,如果把大圖片編碼到html/css中,
不僅會造成文件體積增加,影響文件的加載速度,還會增加瀏覽器對html或css文件解析渲染的時間。
② 使用base64無法直接緩存,要緩存只能緩存包含base64的文件,比如HTML 或CSS,
這相比于直接緩存圖片的效果要差很多。
③ ie8以前的瀏覽器不支持
一般一些網站的小圖標可以使用base64圖片引入
超鏈接訪問過后hover樣式就不出現的問題時什么?如何解決?
被點擊訪問過的超鏈接樣式不再具有hover和active了,解決方式是改變CSS屬性的排列順序:L-V-H-A(linked, visited, hover, active)。
rgba()和opacity的透明效果有什么區別?
rgba()和opacity都能實現透明效果,但最大的不同是opacity作用于元素,以及元素內的所有內容的透明度,而rgba()只作用于元素的顏色或起背景色。設置rgba透明的元素的子元素不會繼承透明效果。
px和em的區別
px和em都是長度單位,區別是,px的值是固定的,指定是多少就是多少,計算比較容易。em的值不是固定的,并且em會繼承父級元素的字體大小。
瀏覽器的默認字體高度都是16px。所以未經調整的瀏覽器都符合:1em=16px。那么12px=0.75em, 10px = 0.625em。
描述一個“reset”的css文件并如何使用它。知道normalize.css嗎?你了解他們的不同之處嗎?
重置樣式非常多,凡是一個前端開發人員肯定會有一個常用的重置css文件并知道如何使用它們。他們是盲目的在做還是知道為什么這么做呢?原因是不同的瀏覽器對一些元素有不同的的默認樣式,如果你不處理,在不同瀏覽器下回存在必要的風險,或者更有戲劇性發生。
你可能會用Normalize來代替你的重置樣式文件。它沒有重置所有的樣式風格,但僅提供一套合理的默認樣式值。既能夠讓眾多瀏覽器達到一致和合理,但不擾亂其他的東西(如粗體的標題)。
content有什么用?有什么應用?
CSS的content屬性專門應用在before/after偽元素上,用來插入生成內容。
最常見的應用是利用偽類清除浮動:
CSS Code復制內容到剪貼板
//一種常見利用偽類清除浮動的代碼
.clearfix:after {
content:"."; //這里利用到了content屬性
display:block;
height:0;
visibility:hidden;
clear:both; }
.clearfix {
*zoom:1;
}
after偽元素通過content在元素的后面生成一個點的塊級元素,再利用clear: both清除浮動。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。