您好,登錄后才能下訂單哦!
本篇內容介紹了“CSS問題有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
第一問:當margin的值為百分比形式時,為什么瀏覽器會根據父容器寬度得出計算值?
在我之前一篇博客檢驗你的前端基礎——Sit the test中, 聊到了margin值為<percentage>時的計算方法。假如有一個父容器寬度400px,高度600px,其子元素設置 margin:20% 20%后的計算值應該為“margin:120px 80px”還是“margin:80px 80px”呢?按照那篇博客中的理論,第二個是正確答案。但是在今天這篇文章中,我給出的答案是***個肯定錯,第二個也不一定對。一個符合W3C標準的瀏 覽器會根據父容器的寬度進行計算,但是這個僅限于書寫模式為橫向的時候。因為在橫向排版時,寬度“有跡可循”,可以把瀏覽器寬度作為參考,但是高度是不固 定的,所以margin百分比值在計算時會參考父容器的寬度。當書寫模式改為縱向,其計算參考便會變為父容器的高度了。戳我查看DEMO(請在webkit內核或IE下查看)。
/*修改書寫模式*/ .demo{ -webkit-writing-mode: vertical-rl; /* for browsers of webkit engine */ writing-mode: tb-rl; /* for ie */ }
第二問:margin:auto為什么只能實現水平居中,不能垂直居中?
當一個常規流中塊級元素的margin屬性左右值設為關鍵字auto,且它擁有固定寬度時,它便會平分剩余的水平空間,居中顯示。然而如果設置上下值為auto,瀏覽器得到的計算值為0,并不起任何的效果。那么問題來了,為什么垂直方向的auto不生效?
與上一問類似,這與布局相關。網頁排版時,常規流的塊級元素水平方向總是鋪滿瀏覽器窗口,垂直方向各塊級元素按照先后順序從上往下排列,當頁面內容過多時網頁會出現縱向滾動條,因此原理上縱向是可以***擴展的,計算時找不到一個固定的參考值,所以縱向的auto無法生效。
同樣,margin:auto會受書寫模式的影響。當書寫模式為縱向時,margin:auto垂直方向是可以居中的,水平方向仍然可以居中。不 信?請自己寫個demo試試吧。其實受到書寫模式影響的屬性除了這些外,還有margin折疊、padding百分比值的計算等。
第三問:可以讓一個position:fixed的元素相對于一個容器定位而非瀏覽器視口嗎?
提到position:fixed,很多人都會說這是一個定位屬性,與absolute的區別是它針對瀏覽器視口定位。我的博客導航欄就是利用 “position:fixed”屬性,讓其始終保持在窗口的最上方。不過還是不要忘記“世事無絕對”,CSS實現了一個position:fixed的 元素相對于一個容器定位,請在FireFox下查看此DEMO。
當一個元素應用了CSS3的transform屬性后,它的后代元素的fixed都將失效。http://www.w3.org/TR/css3-transforms/#issue-ca2c412c。因此可以利用這個Bug模擬出一個相對于某個包含塊fixed的效果。
關于transform更多的影響可以在張鑫旭的博客中看到:CSS3 transform對普通元素的N多渲染影響。
第四問:可以用CSS實現面板的隱藏和顯示嗎?
現在要實現這樣一個功能,通過CSS切換某個面板的顯示或隱藏。當提到CSS,我們自然而然想到了控制某個單一元素的樣式,一旦涉及到多個元素交 互,我們往往使用JavaScript操作Dom。事實上這個需求不但可以用CSS來實現,甚至實現方式不止一種,請狂戳DEMO:三種CSS方式實現面板隱藏和顯示。
***種利用了label和checkbox,使控制方和被控制方不需要有特定的HTML結構關系,但是需要額外的HTML標簽來支持。第二種方式利 用了hover和子元素選擇器,第三種方式利用了focus和兄弟元素選擇器,后兩種都受限于特定的HTML結構。三種方法都只使用CSS實現了面板的隱 藏顯示。
第五問:可以用CSS做出一個圖標嗎?比如一個三角形?一個小房子?
一個標簽,放在HTML中,只能代表一種語義。然而一個標簽加CSS,則可以創造出***的可能。請看DEMO:CSS實現三角形,小房子圖案。
利用border互相覆蓋呈現出的斜線,可以模擬出多種多樣的幾何狀。在CSS3中,每個元素都有::before和::after兩個偽元素,對同一個標簽,由CSS可以操控的單位由一個變為三個,再加上絕對定位的輔佐,各種各樣的形狀被創造了出來。
你能想象嗎?這些圖標都是用CSS畫出來的。要想了解更多的CSS3圖標,可以訪問這個網站:http://www.uiplayground.in/css3-icons/
第六問:我想寫針對IE6,7的hack,該怎么寫呢?
你可能會這么回答:使用 “>”,“_”,“*”等各種各樣的符號來寫hack。是的,這樣做沒錯,但是需要記住每個符號分別被哪些瀏覽器識別,并且如果寫的太亂將造成代碼 閱讀起來十分困難。學習CSS必須抱有一種質疑精神,有沒有一種hack方法可以不寫這些亂七八糟的符號,并且代碼易維護易讀呢?我們可以看看好搜首頁是 怎么做的:在頁面頂端有這樣一句話:
<!DOCTYPE html> <!--[if lt IE 7 ]><html class="ie6"><![endif]--> <!--[if IE 7 ]><html class="ie7"><![endif]--> <!--[if IE 8 ]><html class="ie8"><![endif]--> <!--[if IE 9 ]><html class="ie9"><![endif]--> <!--[if (gt IE 9)|!(IE)]><!--><html class="w3c"><!--<![endif]--> <head>
在頁面的CSS中,會看到這樣的規則:
.ie7 #hd_usernav:before, .ie8 #hd_usernav:before { display: none } .ie6 .skin_no #hd_nav li, .ie7 .skin_no #hd_nav li, .ie8 .skin_no #hd_nav li { border-right-color: #c5c5c5 } .ie6 .skin_no #hd_nav a, .ie7 .skin_no #hd_nav a, .ie8 .skin_no #hd_nav a { color: #c5c5c5 } ……
這樣做的優點就是克服了使用特殊符號hack的那些缺點,缺點是需要寫更多的代碼,使頁面增大。
一個前端er對上面這些問題知道與否,并不影響他是否可以完成一個項目,建設一個網站。但是如果沒有好奇心,不想追究內在原因,僅抱著“我不想知道這么多東西,反正我會用就行”這樣一種態度,那么他充其量算是一個“程序員”,而非一位“工程師”。
就是要刨根問底!
第七問:行內級元素可以設置寬高嗎?
不會為自身內容形成新的塊,而讓內容分布在多行中的元素叫做行內級元素。此類元素可以與其它行內級元素在同一行中顯示而不會另起一行,例如span,strong。在面試時,當被問到行內級元素可否設置寬高時,根據我們的經驗往往會回答不能。但是這樣往往著了面試官的道,因為有一些特殊的行內元素,比如img,input,select等等,是可以被設置寬高的。一個內容
不受CSS視覺格式化模型控制,CSS渲染模型并不考慮對此內容的渲染,且元素本身一般擁有固有尺寸(寬度,高度,寬高比)的元素,被稱之為置換元素。比如img是一個置換元素,當不對它設置寬高時,它會按照本身的寬高進行顯示。所以這個問題的正確答案應該是置換元素可以,非置換元素不可以。
第八問:CSS規則根據優先級生效,低優先級的規則會被瀏覽器忽略還是覆蓋?
在我的之前一篇博客中,提到了瀏覽器中CSS優先級的使用規則:多個優先級的樣式都會被渲染,只不過高優先級會覆蓋住低優先級,元素呈現為高優先級 的樣式。現在請考慮這樣一個問題,在一個div應用了兩條background-image規則,照之前的理論來看,兩條規則都會渲染,那么請問瀏覽器會 請求被覆蓋規則的背景圖片嗎?
真實情況是瀏覽器會聰明到只請求當前應用的背景圖片。簡單理解的話,瀏覽器只會為生效的CSS規則中的圖片資源發出http請求。如果深究的話,就必須談談瀏覽器的工作原理了。本人目前水平不夠,以下紅色字體為個人理解,請選擇性閱讀。
在現代瀏覽器中,一個頁面從請求到呈現,大致需要經過解析-構建DOM樹-構建呈現樹(框架樹)-布局(重排)-繪制等幾個步驟。一個頁面的展現并不是一蹴而就的,而是分步驟有條不紊的進行。眾所周知的樣式表層疊順序和特異性計算發 生在構造呈現樹的過程中,就是為了解決規則不止一個時的問題。以上面提到的背景圖案為例,瀏覽器計算完優先級后,只有后定義的背景圖案規則被構建到呈現樹 上。接下來瀏覽器會進行重排和繪制,瀏覽器在繪制時才會請求背景圖片規則用到的圖片文件。這就是為什么只發出一個HTTP請求的原因。
了解瀏覽器的工作原理不僅可以認清CSS解析和渲染過程,還可以體會到重排和重繪發生的時機,這對我們寫出高效的CSS規則和JavaScript Dom操作有著非常深刻的指導意義。這個話題太大,目前我的水平也不足以涉獵到此,等學有所成后我會再發一篇文章詳細談談。這里有一篇經典的文章,感興趣 的可以看看:瀏覽器的工作原理:新式網絡瀏覽器幕后揭秘。如果無法訪問,查看此國內地址:w3ctech:瀏覽器的工作原理。
第九問:使用margin可以做出圓角按鈕的原理是什么?
當不能使用border-radius時,如何制造一個圓角按鈕?現在有一個制造1px圓角的小技巧:button中嵌套span,設置span的margin為:“margin:1px -1px”。戳我查看DEMO。
知道這個小tip的人不在少數,那么是什么原理導致這種現象呢?學習CSS就需要刨根問底,一張圖可以把這個問題說明白。
圖中紅色框為span標簽,藍色框為a標簽。當設置span的左右margin為-1px時,其便會在左右各突出1px,造成一種1px圓角的視覺效果。同樣的道理,在實現一些古老瀏覽器下的圓角與底色漸變的按鈕時,通常也會利用到多層元素層疊制造視覺誤差的原理。
第十問:清除浮動有N種方式,他們間有什么共同點嗎?
所謂清除浮動,一般是為了解決子元素浮動導致父容器高度坍塌。目前有多種方式來解決這個問題,最常見的有after偽元素,父元素設置“overflow:hidden”等等,請看DEMO:七種清除浮動的方法。
其實按照原理,這幾種方法可以歸納為兩種:clear:both法和構造BFC法。
方法 | 分類 |
浮動末尾添加新標簽,設置樣式為clear:both | clear:both |
浮動末尾添加<br />標簽 | clear:both |
使用::after偽元素 | clear:both |
父元素設置display:table | 構造BFC |
父元素設置overflow:auto | 構造BFC |
父元素設置overflow:hidden | 構造BFC |
讓父元素也浮動 | 構造BFC |
使用“clear:both”來清除浮動自然不必多說,那么什么是構造BFC法呢?
Block formatting contexts(BFC),塊級格式化上下文是在CSS2.1中提出的一個概念,在布局中,BFC自成體系,對自己內部的元素負責,不會與浮動元素重 疊,相鄰BFC上下margin也不會重疊。所以我們會通過構造一個BFC來防止margin重疊,清除浮動或者實現一個雙欄布局。
那么如何構造一個BFC呢?1.float設置為非none值;2.overflow設置為非visible;3.display設置為 table-cell,table-caption,inline-block;4.position設置為absolute或fixed。這些方法剛好 與上面提到構造BFC來清除浮動的方法相呼應。
需要特別注意的是,在IE6,7下沒有BFC這個概念,但是有一個與BFC性質相似的概念:layout。在IE6,7中遇到的很多bug都可以通過讓元素has layout來解決,比如浮動margin雙邊距,躲貓貓,3像素間距等等。
有些元素例如table,input本身就has layout,那么如何讓一個普通元素has layout呢?包括但不限于以下幾種方法:1.position:absolute;2.float不為 none;3.display:inline-block;4.height:除auto外任意值;5.width:除auto外任意值;6.zoom: 除normal外任意值;7.overflow非visible(僅限IE7)。
這也是為什么我們會在IEhack中經常看到“height:1%”、“zoom:1”、“display:inline-block”、“overflow:hidden”這些字眼的主要原因,其實就是為了讓元素has layout嘛!
所以在IE6-7下,清除浮動除了可以使用clear:both外(::after偽元素無法使用),另一種方法就是讓父元素has layout。
“CSS問題有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。