下面所有的內(nèi)容都來至張鑫旭所著的《css世界》。
《css世界》這是一本專門寫css的書,書中并沒有涉及css3的知識,但是它所展現(xiàn)的東西很多都是我從未知道或以前未重視的。這是一本能夠開闊視野的書,我把這本書推薦所有從事前端的人。
下面都是我在看這本書所記錄的一些新奇但實(shí)用的布局技巧。
max-width
- max-系列的權(quán)重非常的高,甚至超越了!important。如下代碼p最后的寬度是150px
p {
width: 200px !important;
max-width: 150px;
}
- 當(dāng)
min-width與max-width大小有沖突的時(shí)候會采用最大原則,即誰大取誰的值。如下代碼最后的寬度是1400px
.container {
min-width: 1400px;
max-width: 1200px;
}
- 當(dāng)我們實(shí)現(xiàn)一個元素高度逐漸變大的效果,但是我們又不知道這個元素的具體高度,這個時(shí)候我們就可以用
max-height的方式。我們不需要給以具體高度值就可以實(shí)現(xiàn)這個效果。當(dāng)然這樣做會出現(xiàn)元素高度達(dá)到實(shí)際高度但是動畫還沒結(jié)束。會有動畫延遲的感覺。
.element {
max-height: 0;
overflow: hidden;
transition: max-height 0.25s;
}
.element.active {
max-height: 666px; /* 一個足夠大的最大高度值 */
}
content attr
類似于img的 alt。
.icon:before {
content: attr(data-title);
}
padding 與 margin
這種三道扛的效果我們經(jīng)常要遇到,我們可以借助 background-clip 與padding 實(shí)現(xiàn)這種效果。不需要任何圖片。
.icon-menu {
display: inline-block;
width: 140px;
height: 10px;
padding: 35px 0;
border-top: 10px solid;
border-bottom: 10px solid;
background-color: currentColor;
background-clip: content-box;
}
當(dāng)我們要實(shí)現(xiàn)這種兩端對齊的效果,我們給每一個列表都設(shè)置
margin-right然后去掉最后一個的margin-right。實(shí)現(xiàn)這種效果需要借助css3的新增選擇器,有時(shí)候還需要js,或者直接用flex布局。但我們利用給父級margin 負(fù)值就可以輕松實(shí)現(xiàn)。
ul {
margin-right: -20px;
}
ul > li {
float: left;
width: 100px;
margin-right: 20px;
}
border
- 因?yàn)?ie6 下 border 設(shè)置虛線顯示的是圓點(diǎn)。所以用這種方法可以在ie6下實(shí)現(xiàn)一個圓。
.box {
width: 150px;
height: 150px;
/* 超出區(qū)域隱藏,只顯示一個圓 */
overflow: hidden;
}
.dotted {
width: 100%;
height: 100%;
border: 149px dotted #cd0000;
}
利用邊框制作三角形其實(shí)是一個廣為人知的方法,還是寫一下吧。
注意:邊框也是css標(biāo)準(zhǔn)的上右下左的設(shè)置順序,需要上面方向的三角形就給它相反的方向設(shè)置想要的顏色,其他方向都設(shè)為透明色。
div {
width: 0;
border: 10px solid;
border-color: #f30 transparent transparent;
}
ex
ex是一個被忽略的距離單位,它表示一個小寫字母x(x、y、z的x)的高度。是一個相對單位,它和父元素的字號有關(guān)系。
這種圖標(biāo)和字垂直居中的布局我們經(jīng)常見到,只要這樣設(shè)置就可以簡單實(shí)現(xiàn),而且還不會受字號,頁面高度的影響。
.icon-arrow {
display: inline-block;
width: 20px;
height: 1ex;
background: url(xxx.png) no-repeat center;
}
vertical-align
可以利用 vertical-align 實(shí)現(xiàn)水平垂直居中,這種定位方法不用知道居中元素的寬高度,兼容ie6
下面模擬的是一個全屏的對話框。這種居中方法核心是父元素的text-aglin:center,在寫一個居中元素的兄弟元素給與display: inline-block;height: 100%;vertical-align: middle;三個屬性,自身設(shè)置display: inline-block; vertical-align: middle;
<div id="container">
<div id="dialog">....</div>//要居中的元素
<div id="assist"></div>
</div>
#container {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: rgba(0, 0, 0, 0.5), none;
text-align: center;
white-space: nowrap;
font-size: 0;
z-index: 99;
}
#dialog {
display: inline-block;
vertical-align: middle;
}
#assist {
display: inline-block;
height: 100%;
vertical-align: middle;
}
BFC
以前就知道overflow:hidden一種觸發(fā)BFC的方法,其實(shí)以下都能出發(fā)BFC。
-
<html>根元素; - float 的值不為 none;
- overflow 的值為 auto、scroll 或 hidden;
- display 的值為 table-cell、table-caption 和 inline-block 中的任何一個;
- position 的值不為 relative 和 static。
overflow
滾動條是
html所產(chǎn)生的所有想要頁面禁止出現(xiàn)滾動條沒必要拉著body一起設(shè)置overflow:hidden,當(dāng)頁面加載非常慢的時(shí)候會出現(xiàn)頁面向左偏移的情況,因?yàn)闈L動條占據(jù)了body的寬度導(dǎo)致body偏移。下述代碼是讓
body占據(jù)整個 window 的寬度。這樣不會出現(xiàn)頁面加載慢時(shí)導(dǎo)致居中元素偏移的問題。(現(xiàn)在用戶寬帶大幅度提升基本上不會有這種情況了)
html {
overflow-y: scroll; /* for IE8 */
}
:root {
overflow-y: auto;
overflow-x: hidden;
}
:root body {
position: absolute;
}
body {
width: 100vw;
overflow: hidden;
}
absolute
當(dāng)我使用絕對定位的時(shí)候,總會老老實(shí)實(shí)的子決父相。但是無依賴的絕對定位效果會更好。
無依賴的布局,即不使用傳統(tǒng)的子決父相的方式。不使用left和top控制,用 margin 或者 transform 來控制位置。
.icon-warn {
position: absolute;
margin-left: -20px;
width: 20px;
height: 20px;
background: url(warn.png) no-repeat center;
}
- absolute 與 text-align 相配合實(shí)現(xiàn)水平居中。
代碼如下
<p > <img src="1.jpg" > </p >
p {
text-align: center;
}
img {
position: absolute;
margin-left: ...;
}
雖然本示例中圖片位置確實(shí)受 text-align 屬性影響,但是并不是 text-align 和 absolute 元素直接發(fā)生關(guān)系,absolute 元素的 display 計(jì)算值是塊狀的,text-align是不會有作用的。這里之所以產(chǎn)生了位置變化,本質(zhì)上是“幽靈空白節(jié)點(diǎn)”和“無依賴絕對定位”共同作用的結(jié)果
“幽靈空白節(jié)點(diǎn)”是內(nèi)聯(lián)盒模型中非常重要的一個概念,具體指的是:在 HTML5 文檔聲明
中,內(nèi)聯(lián)元素的所有解析和渲染表現(xiàn)就如同每個行框盒子的前面有一個“空白節(jié)點(diǎn)”一樣。這
個“空白節(jié)點(diǎn)”永遠(yuǎn)透明,不占據(jù)任何寬度,看不見也無法通過腳本獲取,就好像幽靈一樣,
但又確確實(shí)實(shí)地存在,表現(xiàn)如同文本節(jié)點(diǎn)一樣,因此,我稱之為“幽靈空白節(jié)點(diǎn)”。
當(dāng)然我們是需要知道內(nèi)聯(lián)元素的寬度的。margin-left的值與負(fù)的一般寬度。與父元素position:relative 然后定位元素設(shè)置left:50%的方法類似。但不會有層級問題。
- absolute 與 overflow
關(guān)于絕對定位元素是否會受到overflow的影響有如下判斷
overflow 不是定位元素,同時(shí)絕對定位元素和 overflow 容器之間也沒有定位元素
如果 ,則overflow 無法對 absolute 元素進(jìn)行剪裁。
根據(jù)上述所言。無依賴的absolute不會被父級的overflow所裁剪。
注意:由于 transform 在各個瀏覽器對overflow的支持不一樣所以當(dāng)元素還是被裁剪的話,試著找找是不是transform的原因
- absolute 與流體自適應(yīng)
當(dāng)一個絕對定位元素的相對方向都有定位的時(shí)候該元素就會擁有一種和文檔流相似的流體特性如
.box {
position: absolute;
left: 0; right: 0;
}
當(dāng)一個絕對定位元素有如下的設(shè)置就能覆蓋整個瀏覽器。注意它的寬度高度是一種"格式化寬度/高度",于width:100%完全不同。給與margin也不會出現(xiàn)超出屏幕。
.box {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
根據(jù)上面所說可以使用margin:auto實(shí)現(xiàn)水平居中的效果,如果有沒有left: 0; right: 0;這種能夠激發(fā)流體特性的屬性就不會有這種居中效果。當(dāng)然想要用margin:auto auto實(shí)現(xiàn)垂直水平居中是不能的。畢竟在標(biāo)準(zhǔn)文檔流也沒有這種效果。
代碼如下
.element {
width: 300px;
height: 200px;
position: absolute;
left: 0;
right: 0;
margin: auto;
}
fixed
fixed也可以用無依賴布局,如下實(shí)現(xiàn)一個在元素內(nèi)部的固定定位
<div class="father" >
<div class="son" > </div >
</div >
.father {
width: 300px;
height: 200px;
position: relative;
}
.son {
width: 40px;
height: 40px;
position: fixed;
margin-left: -40px;
}
與絕對定位的無依賴一樣不能使用left等定位屬性。
獲取滾動條寬度
如下代碼可以獲取滾動條寬度,避免了禁用滾動條之后的頁面偏移現(xiàn)象。
//顯示
var widthBar = 17,
root = document.documentElement;
if (typeof window.innerWidth == "number") {
widthBar = window.innerWidth - root.clientWidth;
}
root.style.overflow = "hidden";
root.style.borderRight = widthBar + "px solid transparent";
//隱藏
var root = document.documentElement;
root.style.overflow = "";
root.style.borderRight = "";
z-index
z-index在css2 中只對定位元素有用但是在 css3 中加入了對flex的支持
font-size
這種效果也可以借助
vertical-align和font-size實(shí)現(xiàn)。
p {
font-size: 16px;
line-height: 1.5;
}
p > img {
vertical-align: -25%;
vertical-align: 0.6ex;;
}
子元素vertical-align使用百分比可以實(shí)現(xiàn)圖標(biāo)與文字居中的問題而且不受字體大小的影響,但是會受到行高的影響。如果是 ex 不僅可以實(shí)現(xiàn)而且不會受到行高的影響。
text-decoration
在中文下text-decoration有可能與下一行的字出現(xiàn)重疊這時(shí)候我們用邊框來作為下劃線,邊框不要設(shè)置顏色,它會默認(rèn)的和字體一個顏色。
顯示與隱藏
利用visibility和絕對定位來實(shí)現(xiàn)隱藏而且不占位置。或者透明度加絕對定位
.hidden {
position: absolute;
visibility: hidden;
}
.opacity {
position: absolute;
opacity: 0;
filter: Alpha(opacity=0);
}
visibility 與 display 的小區(qū)別
visibility的子元素會被隱藏但是如果設(shè)置了visibility:visible就會顯現(xiàn)出來,但是display:none的元素就沒有這樣的效果。
這些就是我閱讀《css世界》所學(xué)到的技巧,更多內(nèi)容請閱讀原書
引用: 《css世界》