摘要:和可以看作是同父異母的兄弟關系。例子如下結果如下而父元素設置屬性的方式則是利用了的特性下面將會詳細講解結界全稱為,中文為塊級格式化上下文。
上一篇:《CSS世界》筆記三:內聯元素與對齊
下一篇:《CSS世界》筆記五:CSS層疊規則及元素隱藏
原本博客名為“浮動與定位”,但是《CSS世界》第六章節的內容不僅有浮動定位,很大一部分篇幅都在講BFC和overflow。更吸引人的是,作者將float/absolute/relative形容為“魔界三兄弟”,將原本枯燥的理論知識硬生生變成了玄幻小說。
absolute和float可以看作是“同父異母”的兄弟關系。它們的父親是同一個人,是CSS世界的大魔王,屬于魔界;但母親不是一個人,absolute的母親來自魔界,而 float的母親來自人界一、浮動float與BFC 1.1 浮動如果說float和absolute是同父異母的兄弟關系,那么relative則是absolute的親大哥
當年魔界圣母position生了好幾個兒子,其中一個就是法力很強也很霸道的absolute,考慮到日后absolute會找float的麻煩而去正常流世界,以其個性和霸道的能力,一定會影響正常流世界的秩序,于是圣母position讓其性格敦實的大兒子relative直接在正常流世界生活,幫忙盯著absolute,不要讓absolute這個小魔鬼到處惹是生非
浮動本質:實現文字環繞效果
現階段使用浮動一般是用來實現盒子水平顯示(左右兩欄布局),但是往往會造成浮動元素父盒子的塌陷;那么應該如何清除浮動的影響呢?
網上隨意百度即可查詢到清除浮動的方法:
父元素設置overflow屬性來清除浮動
使用額外標簽法
偽元素清除
上面2、3兩種方法都是用clear進行清除,而clear清除浮動屬性本質:clear 屬性是讓自身不能和前面的浮動元素相鄰,從而做到了清除浮動的效果。例子如下:
/* ul>li*7 */ li { width: 20px; height: 20px; background-color: #ccc; margin: 5px; float: left; } li:nth-of-type(3) { clear: both; }
結果如下:
而“父元素設置overflow屬性”的方式則是利用了BFC的特性(下面將會詳細講解)
1.2 結界BFCBFC全稱為block formatting context,中文為“塊級格式化上下文”。相對應的還有IFC,也就是inline formatting context,中文為“內聯格式化上下”
BFC表現原則:如果一個元素具有 BFC,內部子元素再怎么翻江倒海、翻云覆雨,都不會影響外部的元素。所以,BFC 元素是不可能發生 margin 重疊的,因為 margin 重疊是會影響外面的元素的;BFC 元素也可以用來清除浮動的影響,因為如果不清除,子元素浮動則父元素高度塌陷,必然會影響后面元素布局和定位,這顯然有違 BFC 元素的子元素不會影響外部元素的設定
如何觸發BFC:
根元素
float 的值不為 none
overflow 的值為 auto、scroll 或 hidden
display 的值為 table-cell、table-caption 和 inline-block 中的任何一個
position 的值不為 relative 和 static
因此:只要滿足上面任何一條(觸發了BFC),元素就不會發生margin重疊和float帶來的“高度塌陷”問題
張大大布拉布拉用了大量的篇幅對比了實現BFC的各種方式,最后得出結論:overflow:hidden是觸發BFC最理想副作用最小的方式
1.3 float+BFC實現健壯的兩欄布局.father { max-width: 200px; border: 1px solid #444; } .father img { float:left; width: 60px; margin-right: 10px; } .bfc { overflow: hidden; }我是帥哥,好巧啊,我也是帥哥,原來看這篇博客的人都是帥哥~
展示如下:
原理:利用BFC的結界特性避免了文字環繞(浮動),實現左側固定,右側自適應的兩欄布局
二、overflow屬性再次聲明:overflow:hidden是觸發BFC的最佳結界
2.1 overflow與滾動條滾動條相關知識
移動端的屏幕尺寸本身就有限,滾動條一般都是懸浮模式,不會占據可用寬度,但是在PC端,尤其Windows操作系統下,幾乎所有瀏覽器的滾動欄都會占據寬度,而且這個寬度大小是固定的
如何獲取瀏覽器滾動欄寬度:
.box { width: 400px; overflow: scroll; } console.log(400 - document.getElementById("in").clientWidth);
自定義滾動條屬性:
整體部分,::-webkit-scrollbar;
兩端按鈕,::-webkit-scrollbar-button;
外層軌道,::-webkit-scrollbar-track;
內層軌道,::-webkit-scrollbar-track-piece;
滾動滑塊,::-webkit-scrollbar-thumb;
邊角,::-webkit-scrollbar-corner。
平時開發中比較常用的三個屬性:
::-webkit-scrollbar { /* 血槽寬度 */ width: 8px; height: 8px; } ::-webkit-scrollbar-thumb { /* 拖動條 */ background-color: rgba(0,0,0,.3); border-radius: 6px; } ::-webkit-scrollbar-track { /* 背景槽 */ background-color: #ffffd; border-radius: 6px; }
小技巧:處理頁面滾動條晃動問題(一般出現在加載數據后超過一屏)
html { overflow-y: scroll; /* for IE8 */ } :root { overflow-y: auto; overflow-x: hidden; } :root body { position: absolute; } body { width: 100vw; overflow: hidden; }2.2 overflow與文本溢出點點點
單行文本溢出:
.ell { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; }
多行文本溢出(此處為2行):
.ell-rows-2 { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }2.3 overflow與錨點定位
兩種情況可以觸發錨點定位行為的發生:
(1)URL地址中的錨鏈與錨點元素對應并有交互行為;
發展歷程>發展歷程
利用上面的結構,點擊a標簽,能夠使頁面滾動到h2處
(2)focus 錨點定位,可focus的錨點元素處于focus狀態
“focus 錨點定位”指的是類似鏈接或者按鈕、輸入框等可以被 focus 的元素在被 focus 時發生的頁面重定位現象。舉個很簡單的例子,在 PC 端,我們使用 Tab 快速定位可 focus 的元素的時候,如果我們的元素正好在屏幕之外,瀏覽器就會自動重定位,將這個屏幕之外的元素定位到屏幕之中
錨點定位的兩個小案例,以供參考:
錨點定位:返回頁面頂部
錨點定位:簡易tab切換
注意!注意!注意!元素設置了 overflow:hidden 聲明,里面內容高度溢出的時候,滾動依然存在,僅僅滾動條不存在!,所以我們能用錨點定位或者js控制滾動
三、絕對定位absolute 3.1 absolute的包含塊(1)塊級元素:相對于第一個position不為static的祖先元素,直到html
(2)行內元素:
單行:假設給內聯元素的前后各生成一個寬度為 0 的內聯盒子(inline box),則這兩個內聯盒子的 padding box 外面的包圍盒就是內聯元素的“包含塊”
多行:未定義行為,我們以chrome表現為主(由第一行開頭和最后一行結 尾的內聯盒子共同決定)
直接看概念一般是一頭霧水,上圖吧(紅色虛線區域為包含塊)
案例:基于行內元素定位的tips實現
.icon { margin: 50px 0 0 50px; display: inline-block; width: 20px; height: 20px; background: url(http://demo.cssworld.cn/images/6/delete.png) no-repeat center; } .tip { position: relative; &::before, &::after { position: absolute; transform: translateX(-50%); left: 50%; visibility: hidden; } &::before { content: attr(data-title); top: -33px; padding: 2px 10px 3px; line-height: 18px; border-radius: 2px; background-color: #333; text-align: left; color: #fff; font-size: 12px; /* 必須加,否則一柱擎天 */ white-space: nowrap; } &::after { content: ""; border: 6px solid transparent; border-top-color: #333; top: -10px; } &:hover::before, &:hover::after { transition: visibility .1s .1s; visibility: visible; } }
最終實現效果:
注意:absolute 是非常獨立的 CSS 屬性值,其樣式和行為表現不依賴其他任何 CSS 屬性就可以完成,正是基于這一點才有了無依賴定位的強大
首先思考一個問題:如果一個標準流元素后面接著一個absolute元素(未設置left等方位屬性),此時如何顯示?定位元素后又接著一個標準流元素,此時又該如何顯示?
哈哈,我在定位元素前面 吶!我還在定位元素后面呢.poa { position: absolute; width: 20px; height: 20px; background: rgba(255, 0, 0, .5); }
展示結果:
僅設置絕對定位時,定位元素仍會保持在html結構位置,且不占據空間。由此,我們可以使用margin相對于原始位置定位該元素以實現各種功能。下面是幾個案例:
(1)案例1:簡單圖標定位
.icon-hot { position: absolute; width: 28px; height: 11px; margin: -6px 0 0 2px; }
(2)案例2:校驗表單
/* 郵箱報錯小圖標 */ .icon-warn { position: absolute; margin-left: -18px; width: 16px; height: 20px; background: url(/images/6/warn.gif) no-repeat center; } /* 定位在盒子外部的紅色星號 */ .regist-star { position: absolute; margin-left: -1em; font-family: simsun; color: #f30; }
(3)案例3:input中的icon和下拉
/* 搜索按鈕的無依賴絕對定位 */ .search-btn { width: 20px; height: 20px; border: 9px solid #fff; background: #ffffd url(search.png) no-repeat center; position: absolute; margin: 1px 0 0 -40px; } /* 下拉列表的無依賴絕對定位 */ .search-datalist { position: absolute; width: 248px; border: 1px solid #e6e8e9; background-color: #fff; }3.3 absolute + text-align用法
text-align 居然可以改變 absolute 元素的位置
p { text-align: center; } img { position: absolute; }
原理:img前的“幽靈空白節點”受text-align:center;的影響居中,圖片的“無依賴絕對定位”在“幽靈空白節點”后面
案例:text-align實現的右外側定位
.constrcons { width: 80%; margin: auto; background-color: #f0f3f9; } .alignright { height: 0; text-align: right; overflow: hidden; } .alignright:before { content: "2002"; } .follow { position: fixed; bottom: 100px; z-index: 1; } .follow > img { display: block; margin: 10px; }
優勢:icon相對于主體內容定位,而不是相對于html
3.4 absolute + clip用法剪裁屬性 clip 要想起作用,元素必須是絕對定位或者固定定位,也就是 position 屬性值必須是 absolute 或者 fixed
最佳可訪問性隱藏
.clip { position: absolute; clip: rect(0 0 0 0); }
采用這種方法隱藏的元素原本的行為特性也很好用。例如,依然可以被 focus,而且非常難得的是就地剪裁,因為屬于“無依賴的絕對定位”3.5 absolute流體特性
當 absolute 遇到 left/top/right/bottom 屬性的時候,absolute 元素才真正變成絕對定位元素
absolute流體特性的條件是:對立方向同時發生定位的時候
如果設置left:0; right:0;表現為格式化寬度,水平方向保持流動性
如果設置top:0; bottom:0;表現為格式化高度,垂直方向保持流動性
絕對定位元素的margin:auto的填充規則和普通流體元素的一模一樣:
如果一側定值,一側 auto,auto 為剩余空間大小;
如果兩側均是 auto,則平分剩余空間。
案例:利用absolute的流體特性實現元素的水平垂直居中
.element { width: 300px; height: 200px; position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin: auto; }四、總結
浮動float以及clear屬性
BFC觸發條件及利用BFC實現更為健壯的布局
overflow屬性
內聯盒子絕對定位的包含塊
absolute無依賴定位
absolute裁剪及流體特性
上一篇:《CSS世界》筆記三:內聯元素與對齊
下一篇:《CSS世界》筆記五:CSS層疊規則及元素隱藏
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/113680.html
摘要:元素層疊順序補充說明位于最下面的特指層疊上下文元素后面會詳解的邊框和背景色。界中可能有其他的層疊結界,而自身也可能處于其他層疊結界中。 上一篇:《CSS世界》筆記四:流的保護與破壞 寫在前面 《CSS世界》這本書還剩六章,但是這本書的精華部分主要是前面的內容,這里僅把后面章節相對重要的內容以博客展示,想著了解更多的小伙伴還是去閱讀原文的好,畢竟三百多頁的一本書并不是小小幾篇博客能完全說...
摘要:上一篇世界筆記二盒模型四大家族下一篇世界筆記四流的保護與破壞寫在前面在頁面布局中,內聯元素的垂直對齊是比較常見和基礎的布局需求,但是我們往往會因為垂直對齊中的,而頭疼不已。 上一篇:《CSS世界》筆記二:盒模型四大家族下一篇:《CSS世界》筆記四:流的保護與破壞 寫在前面 在頁面布局中,內聯元素的垂直對齊是比較常見和基礎的布局需求,但是我們往往會因為垂直對齊中的1px,2px而頭疼不已...
摘要:張鑫旭的深入理解之學習筆記絕對定位的特性絕對定位與浮動相似,都有破壞性和包裹性。利用絕對定位元素脫離文檔流的特性,使用動畫可以避免大范圍的回流和重繪。絕對定位元素拉伸實現寬高自適應,可應用于大范圍的布局。 《張鑫旭的CSS深入理解之absolute》學習筆記 絕對定位的特性 絕對定位與浮動相似,都有破壞性和包裹性。浮動的一些應用場景中也可用絕對定位替代 絕對定位的行為表現 無依賴絕對...
摘要:而在文檔流中,如果浮動元素和跟隨元素都是元素,它們兩在默認情況下都將占據一行。而由于浮動元素脫離了文檔流,如果父元素沒有指定高度或者其他元素撐起,也就出現了所謂的浮動元素的父元素高度塌陷。 為什么要寫《重塑你的CSS世界觀》系列文章 由于從工作到現在,我的主要工作都是寫JavaScript,幾乎沒怎么碰CSS,通常都是別人寫好界面,然后我來開發JavaScript邏輯代碼,這導致了嚴重...
閱讀 3935·2021-11-16 11:50
閱讀 934·2021-11-11 16:55
閱讀 3662·2021-10-26 09:51
閱讀 866·2021-09-22 15:03
閱讀 3421·2019-08-30 15:54
閱讀 3265·2019-08-30 15:54
閱讀 2476·2019-08-30 14:04
閱讀 922·2019-08-30 13:53