絕對定位對元素寬度的影響

来源:http://www.cnblogs.com/sammiyu/archive/2016/10/19/my_tech1.html
-Advertisement-
Play Games

本文介紹了絕對定位元素其定位對其寬度的影響情況,並且根據絕對定位元素的內容類型不同進行探討,給出了自己總結的規律,以解決元素寬度顯示不對的問題。 ...


一、問題來源        自己編寫輪播圖切換的時候前一幅圖滑動時後邊出現空白直到前一幅圖全部滑出後第二幅圖才出現。剛開始出現問題到網上搜發現有的說定時器動畫可能會造成這種情況,於是我在代碼調試里註釋掉了定時器,讓圖片只走一步就停下來,發現後邊還是有空白,所以確定不是定時器的問題。於是我查看了一下盒模型,發現包裹img的容器寬度div#main並不是我理想中六張圖片寬度的總和,原來是我沒有顯式設置這個容器div#main的寬度。但是問題來了,沒有顯式地設置容器寬度,大家可能就會感性的認為容器的寬度不應該是被其內容填充而適應的麽?根據前面所述的現象,答案自然是否定的,也可以說不是所有情況均是如此,因為實際上定位對容器的寬度也是具有影響的。下麵討論一下絕對定位元素的大小與放置情況的聯繫。   二、包含塊        首先我們先回顧一下包含塊(定位上下文)的基本概念:   1.初始包含塊(根元素的包含塊)由用戶代理確定。 2.浮動元素包含塊定義為最近的塊級祖先元素。 3.相對定位或靜態定位元素包含塊由最近的塊級框、表單元格、或行內塊框祖先元素(任何類型)內容邊界構成。 4.絕對定位元素包含塊設置為最近的定位不是static的祖先元素(任何類型)的邊框界定(對塊級父元素)或內容邊界界定(對行內父元素)。   三、寬度與偏移        一般的,元素的大小和位置取決於其包含塊。定位就是元素各外邊距邊界相對於其包含塊相應邊(內邊界與邊框相鄰邊)進行偏移,影響的是元素的所有一切(外邊距、邊框、內邊距、內容)都會移動。故對於一個定位元素有如下等式(後邊的計算均基於該式):   left+margin-left+border-left-width+padding-left+width+padding-right+border-right-width+margin-right+right=包含塊的width    (式1-1)        據此,在未定義元素的寬度width和高度height時,其值大小都會受到定位影響。對於定位元素來說,是否需要設置其寬度高度應根據情況確定。考慮以下幾種情況其寬度高度各是多少的確定規則:   1.如果將偏移屬性top,left,bottom,right都進行了確定,而未設置外邊距,內邊距和邊框的時候,是否顯式設置寬度高度,其值都是由偏移屬性確定的;反之若設置了外邊距或內邊距(auto也算),邊框時,高度寬度就是其顯式設置值,未顯式設寬高的仍由偏移屬性確定。   2.對於非替換元素水平軸行為:   1)如果left,width,right都為auto,且沒有設置內外邊距,邊框,則經過計算元素左邊位於其靜態位置(從左往右讀),width“恰當收放”,根據上述等式right為餘下的水平距離; 2)當等式中所有值為固定值時,若元素“過度受限”則right會根據上式重置; 3)當上述等式中只有一個屬性值為auto時,元素“過度受限”時就會重置這一屬性值以滿足等式; 4)垂直軸規則類似,但要註意只有top可以取靜態位置,bottom做不到。   3.對於替換元素(註意這裡沒有“恰當收放”的概念,因為替換元素有固有寬高):   1)先看其width(height)是否顯式聲明,顯式聲明則為該值,否則由元素內容實際大小(寬高)決定; 2)再看left,top若為auto則替換為靜態位置; 3)再看如果left和bottom值如果還為auto,則令margin的auto都置0,若未被置0就設置為左右相等,上下相等; 4)在此之後如果只剩下一個auto值,則同非替換元素類似,根據等式重置該auto值。 5)當元素“過度受限”時,與非替換元素處理一樣,用戶代理會忽略right(從左向右讀)和bottom。        以上就是對一個絕對定位元素實際顯示的寬度高度的影響因素情況分析,當你發現界面顯示的效果與你預想的不一致時,可以考慮從上述角度分析一下看是否需要重新確定元素的寬度高度值,或以上其它屬性的值。   四、一種常見的情形分析        現在來結合一下我在項目中遇到的寬度高度問題實際例子分析。這裡討論的假定情形為:設置好寬高的最外層div#rel為相對定位,其子div#abs僅設置left為固定值而未設置寬度(沒有內外邊距邊框前提下),div#abs內部包含不同類型的元素。        1.先討論最內層包裹的是塊級元素的情況,代碼見下:  
<div id="rel1">
    <div id="abs1">
        <div id="box1"></div>
        <div id="box2"></div>
    </div>
</div> 
*{margin:0;padding: 0}
#rel1{position: relative;width: 120px;height: 50px;background-color: yellow;}
#abs1{position: absolute;top: 0;left: -15px}
#box1{width: 50px;height: 50px;background-color: red}
#box2{width: 50px;height: 50px;background-color: blue}
           由代碼可知,我們將絕對定位元素的margin,padding都置0,且無邊框,則上述式1-1簡化為:                                            絕對定位元素div#abs的 left+width+right = 包含塊div#rel的 width        由於絕對定位元素的left是定值,而未設width和right,所以後兩個都是初始值auto,根據非替換軸的水平行為1)可知,先將width恰當收放,也就是以絕對定位元素的子元素內容剛好放好為準,再自動計算right的值,使三個屬性之和剛好等於絕對定位的包含塊div#rel的寬度120px。因此,此時絕對定位的元素div#abs的寬度width的值由其內容決定,在如下圖兩種情形下(通過代碼改變子div#box1的寬度進行測試),絕對定位元素的width始終等於子div中寬度最大的那個值。且不受left值的影響,因為無論left值為多少,其right的值都會自動調整,從而不影響width的值。                                   2.再來看最內層包裹的是替換行內元素的情況,代碼及示意圖如下:  
<div id="rel2">
    <div id="abs2">
        <img src="images/pic1.jpeg" alt="" id="img1">
        <img src="images/pic2.jpeg" alt="" id="img2">
    </div>
</div>
*{margin:0;padding: 0}
#rel2{position: relative;width: 120px;height: 50px;background-color: yellow;}
#abs2{position: absolute;top: 0;}
img{float:left}
#img1{width: 50px;height: 50px}
#img2{width: 50px;height: 50px}
       其中,絕對定位元素的left將被設為定值,而width根據“恰當收放”的原則,它的最大值應該是行內子元素寬度之和,最小值應該是子元素中寬度最大者的寬度值,而right的值情況有一點複雜,因為預設情況下,塊級元素是垂直排列而行內元素都是一個挨著一個(中間的縫隙可以用:float:left清除)從左向右排列,且中間沒有換行符。所以行內元素放在絕對定位的塊級元素內作為元素內容寬度過寬時,會由於其行內元素的特點將內容撐開一直到其包含塊內容區右邊界(從左向右讀),因此當行內子元素(即絕對元素的內容)受限出現折行時right的值為0,式1-1便簡化為如下:                                              絕對定位元素div#abs的 left+width = 包含塊div#rel的 width        當然這種情況應該是在left設定值在一定範圍內的前提下(因為寬度沒有設置,是auto的),那麼如何確定這個範圍呢?當絕對定位元素的寬度剛好等於其最小值和最大值時,利用上面的公式求出left的範圍設置在(包含塊width-最大絕對定位元素width)~(包含塊width-最小絕對定位元素width)之間時,絕對定位元素的寬度是受left值影響的,可以通過上面的公式求出當left為某一特定值時的絕對定位元素的width。      當left的值設定在上面所說的範圍之外時,絕對定位元素的width已經達到了極值,就不會再受left變化而影響了,此時right就不再是0,而會自動進行計算以滿足下述公式:                                              絕對定位元素div#abs的 left+width+right = 包含塊div#rel的 width                                       3.總結來說,在前提假定的情形下:   1)如果絕對定位元素包裹塊級元素,則其width值始終等於子元素中寬度最大者的值。 2)如果絕對定位元素包裹的行內元素,則其width值最大為子元素寬度之和,最小為子元素寬度最大者的值;並需先求出影響width值的left區間,在用其包含塊的寬度-left值來求其寬度。  

五、總結

       兜兜轉轉說了這麼多,其實就是一個道理,如果你擔心絕對定位元素的寬度出現問題的話,最好顯式地給它設定一個width固定值,因為根據規則1,在沒有將四個偏移屬性全部設置的前提下,顯式的width值是管用噠~然而在實際環境中,設置寬度高度對定位元素來說不一定必要,所以理解寬度高度的影響因素將會對遇到的一些關於效果顯示的問題更有幫助。這是我第一次寫科技博文,首先我要向替我審校的本人優雅的攻城獅男友致以最真摯的謝意,同時感謝O’Reilly叢書《CSS權威指南第三版》的作者及其相關工作人員,本文大量內容均是參考該書並加以自己的理解所寫,初次發文如有問題,還請大家批評指正,非常感謝各位~
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <meta name=''> name:有如下6個值:application-name:文檔名或者應用名,整個文檔只能包含一個值。author:文檔作者description:文檔描述generator:生成文檔的程式。keywords:網頁關鍵字,用英文逗號分隔。 <table>標簽的屬性Bord ...
  • 1. Date函數 var now = new Date(); 獲取當前日期對象 now對象->Date.prototype->Object.prototype 將一個字元串轉換為Date對象的寫法: var str = "2012-12-12"; var date = new Date(str); ...
  • 1. 正則表達式 是一個描述字元模式的對象. 1.創建方式 1) 正則表達式直接量 var pattern = /s$/; 2) RegExp()構造函數 var pattern = new RegExp("s$"); 2. 直接量字元 正則表達式中所有字母和數字都是按照字面含義進行匹配的。 字元 ...
  • 用了這麼久的Javascript,該總結下了!溫故而知新! var 聲明變數: javascript 是弱類型語言,因此無需為聲明對象明確類型聲明。 如:var test="字元串"; var num=123; var bool=true; 等價:var test="字元串", num=123, b ...
  • CSS的簡介 1、CSS概述及作用 CSS:Cascading Style Sheets)是層疊樣式表用來定義網頁的顯示效果。可以解決html代碼對樣式定義的重覆,提高了後期樣式代碼的可維護性,並增強了網頁的顯示效果功能。 作用:CSS將網頁內容和顯示樣式進行分離,提高了顯示功能。 2、 CSS和H ...
  • 優先順序: 外部樣式 < 內部樣式表 < 內聯樣式表; 優先順序,即:同名的選擇器右邊的會覆蓋左邊 1.內部樣式表 2.使用link標簽,在文檔中聲明使用外接資源,最常用的一種方式。 css外部樣式表指定編碼的@CHARSET="utf-8"; 需要放在第一行。 3.@方式,引入css,註意這個是非同步加 ...
  • AJAX簡介 (1)AJAX = 非同步 JavaScript 和 XML。 (2)AJAX 是一種用於創建快速動態網頁的技術。 (3)通過在後臺與伺服器進行少量數據交換,AJAX 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。 (4)傳統的網頁(不使用 A ...
  • 在瀏覽器上輸入一個網址後,一個漂亮的頁面就呈現在我們眼前,中間發生了什麼了?對於一個普通用戶來講,也許不用思考這個問題,但要作為一個名前端開發人員或是想開發插件的同學來講,掌握瀏覽器的工作原理是非常有必要的! 瀏覽器主要功能 今天討論五種主流瀏覽器——IE、Firefox、Safari、Chrome ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...