前端開發必知必會:CSS Position 全解析

来源:http://www.cnblogs.com/shouce/archive/2016/03/10/5260471.html
-Advertisement-
Play Games

當人們剛接觸佈局的時候都比較傾向於使用定位的方式。因為定位的概念看起來好像比較容易掌握。錶面上你確切地指定了一個塊元素所處的位置那麼它就會坐落於那裡。可是定位比你剛看到的時候要稍微複雜一點。對於定位來說,有一些東西會絆倒新手,所以在它成為你的慣用技巧前你需要掌握它們。 一旦你更深入地瞭解了它是怎麼運


當人們剛接觸佈局的時候都比較傾向於使用定位的方式。因為定位的概念看起來好像比較容易掌握。錶面上你確切地指定了一個塊元素所處的位置那麼它就會坐落於那裡。可是定位比你剛看到的時候要稍微複雜一點。對於定位來說,有一些東西會絆倒新手,所以在它成為你的慣用技巧前你需要掌握它們。

  一旦你更深入地瞭解了它是怎麼運作的,你就能夠做出一些更棒的事情來。

  CSS盒模型和定位的類型

  為了搞清楚定位首先你得瞭解CSS盒模型。在上一句中的鏈接是我寫在InstantShift 中的一篇關於盒模型的文章。我在那篇文章做了詳細的講解並會在這篇文章中做一個快速的總結。

  在CSS中,每一個元素都由一個矩形盒子所包含。每一個盒子都會具有一個內容區,內容區被一個內邊距所包裹,內邊距外是盒子的邊框,並且在邊框之外會有一個外邊距用於與其他盒子分隔開來。這些你可以從下麵這張圖片看到。

  定位模式規定了一個盒子在總體的佈局上應該處於什麼位置以及對周圍的盒子會有什麼影響。定位模式包括了常規文檔流,浮動,和幾種類型的 position 定位的元素。

  CSS position 屬性可以取5種值:

  • position: absolute
  • position: relative
  • position: fixed
  • position: static
  • position: inherit

  我會在下麵對前三個值進行詳細的闡述並簡單地講解一下最後兩個值。

  static 是 position 預設的屬性值。任何應用了 position:static 的元素都處於常規文檔流中。它處於什麼位置以及它如何影響周邊的元素都是由盒模型所決定的。

  一個 static 定位的元素會忽略所有 top,right,bottom,left 以及 z-index 屬性所聲明的值。為了讓你的元素能使用任何的這些屬性,你需要先為它的 position 屬性應用這三個值的其中之一: absolute,relative,fixed

  position 值為 inherit 的元素和其他所有屬性的繼承值一樣,元素只是簡單地應用了與父元素一樣的 position 值。

  絕對定位(Absolute Positioning)

  絕對定位的元素會完全地從常規文檔流中脫離。對於包圍它的元素而言,它會將該絕對定位元素視為不存在。就好像 display 屬性被設為 none 一樣。如果你想要保持它所占有的位置而不被其他元素所填充,那麼你需要使用其他的定位方式。

  你可以通過 top, right, bottom, 和 left 四個屬性來設置絕對定位元素的位置。但你通常只會設置它們其中的兩個,top 或者 bottom,以及 left 或者 right。預設地它們的值都為 auto。

  弄明白絕對定位的關鍵是知道它的起點在哪裡。如果 top 被設置為20px那麼你要知道這20px是從哪裡開始計算的。

  一個絕對定位的元素的起點位置是相對於它的第一個 position 值不為 static 的父元素而言的。如果在它的父元素鏈上沒有滿足條件的父元素,那麼絕對定位元素則會相對於文檔視窗來進行定位。哈!

  關於“相對”這個概念你或許有點迷惑,尤其是還有一個叫相對定位的東西,這是我們還沒有講到的。

  當你在一個元素的樣式上設置 position:absolute 意味著需要考慮父元素,並且如果父元素的 position 值不為 static ,那麼絕對定位元素的起點為父元素的左上角位置。

  如果父元素沒有應用除了 static 以外的 position 定位,那麼它會檢查父元素的父元素是否有應用非 static 定位。如果該元素應用了定位,那麼它的左上角便會成為絕對元素的起點位置。如果沒有則會繼續向上遍歷DOM直到找到一個定位元素或者尋找失敗以到達最外層的瀏覽器視窗。

  相對定位(Relative Positioning)

  相對定位的元素也是根據 top, right, bottom, 和 left 四個屬性來決定自己的位置的。但只是相對於它們原來所處於的位置進行移動。在某種意義上來說,為元素設置相對定位和為元素添加 margin 有點相似,但也有一個重要的區別。區別就是在圍繞在相對定位元素附近的元素會忽略相對定位元素的移動。

  我們可以把它看做是一張圖片的重像從真實的圖片的位置開始進行了一點移動。它原始圖片所占據的位置仍然保留,但我們已經沒法再看到它,只能看到它的重像。這樣就讓元素之間可以進行位置的重疊,因為相對定位元素能夠移動到其他元素所占據的空間中。

  相對定位元素離開了正常文檔流,但仍然影響著圍繞著它的元素。那些元素表現地就好像這個相對定位元素仍然在正常文檔流當中。

  我們無需再追問這個相對的位置是在哪裡。因為這個相對位置很顯然是正常的文檔流。相對定位有點兒像為元素添加了 margin ,對相鄰元素來說卻像是什麼都沒發生過。但實際上並沒有增加任何的 margin 。

  固定定位(Fixed Positioning)

  固定定位的行為類似於絕對定位,但也有一些不同的地方。

  首先,固定定位總是相對於瀏覽器視窗來進行定位的,並且通過哪些屬性的 top, right, bottom, 和 left 屬性來決定其位置。它拋棄了它的父元素,它就是定位中表現地有點兒反叛。

  第二個不同點是其在名字上是繼承的。固定定位的元素是固定的。它們並不隨著頁面的滾動而移動。你可以告訴元素它所處的位置並永遠不再移動。噢~好像還挺乖巧的。

  在某種意義上說固定定位元素有點兒類似固定的背景圖片,只不過它的外層容器塊總是瀏覽器視窗罷了。如果你在 body 中設置一個背景圖片那麼它與一個固定定位的元素的行為時非常像的,只不過在位置上的精度會略少一些。

  背景圖片也不能改變其在第三個維度的大小,也因而帶來了 z-index 屬性。

  打破了平面的 Z-Index

  這個頁面是一個二維平面。它具有寬度和高度。我們活在一個用 z-index 作為其深度的三維的世界當中。這個額外的維度能夠穿越一個平面。

 

  由上圖可知,高的 z-index 位於低的 z-index 的上面並朝頁面的上方運動。相反地,一個低的 z-index 在高的 z-index 的下麵並朝頁面下方運動。

  沒有的 z-index 的話,定位元素會有點兒麻煩。因為 z-index 能讓一個定位元素位於另一個元素的上方或者下方,這或許能讓你做出點創造性的東西。所有的元素的預設的 z-index 值都為0,並且我們可以對 z-index 使用負值。

  z-index 實際上比我在這裡描述的要更加地複雜,但細節寫在了另一篇文章里。現在只需要記住這個額外維度的基本概念以及它的堆疊順序,另外還要記住只有定位元素才能應用 z-index屬性。

  定位的問題

  對於定位元素來說由幾個比較常見的問題,都值得我們好好瞭解。

  1.你不能在同一個屬性當中應用定位屬性和浮動。因為對使用什麼樣的定位方案來說兩者的指令時相衝突的。如果你把兩個屬性都添加到一個相同的元素上,那麼就期望在CSS中較後的那個屬性時你想要使用的吧

  2.Margin 不會在絕對元素上摺疊。假設你具有一個 margin-bottom 為20px的段落。在段落後面是一個具有30px的 margin-top 的圖片。那麼段落和圖片之間的空間不會是50px(20px+30px)而是30px(30px > 20px)。這就是所謂的 margin-collapse,兩個 margin 會合併(摺疊)成一個 margin。

  絕對定位元素不會像那樣進行 margin 的摺疊。這會使它們跟預期的不一樣。

  3.IE在 Z-index 上有一些BUG。在IE 6中 select 元素總是處於堆疊層級的最上方而不管它的 z-index 和其他元素的 z-index 是多少。

  IE 6和IE 7在堆疊層級上又有另外一個問題。IE 6由最外層的定位元素的層級來決定哪一組的元素處於層級的最上面,而不是每一個單獨的元素自身的層級決定。

1 2 3 4 <div style="z-index: ">    <p style="z-index: 1"></p> </div> <img style="z-index: " />

  對上面這段結構,你會預料段落元素處於堆疊層級的最上方。因為它具有最大的 z-index 值。但在IE 6和IE 7中,圖片為處於段落的上方。因為 img 具有比 div 更加高的 z-index 層級。因此它會位於所有 div 的子元素的上方。

  總結

  一個元素上所設置的位置屬性會根據其中的一種CSS定位模式來運作。你可以為定位元素設置 absolute, relative, fixed, static (預設), 和 inherit 中的其中一個值。

  定位模式和CSS定位元素,定義了一個盒子在佈局中應該處於什麼位置以及圍繞它的元素會受到定位元素帶來的影響。

  z-index 屬性只能被應用與定位元素上。它為頁面增加了第三個維度並設置了元素的層級上的順序。

  定位屬性看起來好像很好理解,但它的運作與它在錶面所看到的有點兒不一樣。你可能會覺得的是相對定位更加類似絕對定位。當在做佈局設計的時候你通常會想使用浮動併在指定的元素上應用定位來打破佈局。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現在大部分企業對瀏覽器相容要求是IE7+或者IE8+,要求IE6的很少,此處一併寫出。 IE6: _margin-top: 20px; IE6+IE7: *margin-top: 20px; +margin-top: 20px; IE6+: margin-top: 20px\9; IE8+: mar
  • hggroup通常放在標簽內部,不過不做強制要求! ​adress 通常用於作者的聯繫信息。比如名字,Email,電話,地址。標簽內字體顯示斜體。 ​ 與 標簽的比較:比div簡潔,更少的用到id或class。 ​新佈局的優點: 1.更註重於內容而不是形式;​ ​2.對人的友好,更加直觀,增加了代碼
  • 7個你可能不認識的CSS單位 眾所周知CSS技術我們雖然很熟悉,在使用的過程卻很容易被困住,這讓我們在新問題出現的時候變得很不利。隨著web繼續不斷地發展,對於新技術新解決方案的要求也會不斷增長。因此,作為網頁設計師和前端開發人員,我們別無選擇,必須熟悉我們手上的工具,做到知己知彼,這樣才能百戰不殆
  • Node.js //傳入請求HttpRequest function getClientIp(req) { return req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddres
  • 1、什麼是CSS hack? CSS hack是通過在CSS樣式中加入一些特殊的符號,讓不同的瀏覽器識別不同的符號(什麼樣的瀏覽器識別什麼樣的符號是有標準的,CSS hack就是讓你記住這個標準),以達到應用不同的CSS樣式的目的,比如.kwstu{width:300px;_width:200px;
  • 有一天,我想帶全家一起去旅游。我拿起手機,按了幾個鍵,說“查一下麗江的旅游路線”。頓時一幅巨大的圖畫,出現在面前的面前原來看上去平淡無奇的白牆上。我用手指點麗江地圖的一個個景點,秀麗山水的照片和視頻也隨之顯示在旁邊,就好像我們已經身臨其境一般。參考著Twitter的點評,我選擇了一條路線,以及住宿的
  • 一般來說我在需要寫一個遍歷的時候就先寫一個html測試頁面,用相同的結構來測試代碼。如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jQuery遍歷測試</t
  • 獲取類: 1)動態方法: charAt : 獲取字元串指定位置上的字元。(參數:一個,指定要獲取的字元位置) 1,不接受負數,如果為負數,會返回一個空字元串。 2,如果不給參數,預設是獲取第0位置上的字元。 3,只接收一個參數。 charCodeAt : 獲取字元串中指定位置上字元的Unicode編
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...