下面全部的內容都來至張鑫旭所著的《css世界》。css
《css世界》這是一本專門寫css的書,書中並無涉及css3的知識,可是它所展示的東西不少都是我從未知道或之前未重視的。這是一本可以開闊視野的書,我把這本書推薦全部從事前端的人。html
下面都是我在看這本書所記錄的一些新奇但實用的佈局技巧。前端
p {
width: 200px !important;
max-width: 150px;
}
複製代碼
min-width
與max-width
大小有衝突的時候會採用最大原則,即誰大取誰的值。以下代碼最後的寬度是1400px.container {
min-width: 1400px;
max-width: 1200px;
}
複製代碼
max-height
的方式。咱們不須要給以具體高度值就能夠實現這個效果。固然這樣作會出現元素高度達到實際高度可是動畫還沒結束。會有動畫延遲的感受。.element {
max-height: 0;
overflow: hidden;
transition: max-height 0.25s;
}
.element.active {
max-height: 666px; /* 一個足夠大的最大高度值 */
}
複製代碼
相似於img
的 alt。css3
.icon:before {
content: attr(data-title);
}
複製代碼
這種三道扛的效果咱們常常要遇到,咱們能夠藉助 background-clip
與padding
實現這種效果。不須要任何圖片。瀏覽器
.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;
}
複製代碼
margin-right
而後去掉最後一個的
margin-right
。實現這種效果須要藉助css3的新增選擇器,有時候還須要js,或者直接用
flex
佈局。但咱們利用給父級
margin
負值就能夠輕鬆實現。
ul {
margin-right: -20px;
}
ul > li {
float: left;
width: 100px;
margin-right: 20px;
}
複製代碼
.box {
width: 150px;
height: 150px;
/* 超出區域隱藏,只顯示一個圓 */
overflow: hidden;
}
.dotted {
width: 100%;
height: 100%;
border: 149px dotted #cd0000;
}
複製代碼
注意:邊框也是css標準的上右下左的設置順序,須要上面方向的三角形就給它相反的方向設置想要的顏色,其餘方向都設爲透明色。佈局
div {
width: 0;
border: 10px solid;
border-color: #f30 transparent transparent;
}
複製代碼
ex是一個被忽略的距離單位,它表示一個小寫字母x(x、y、z的x)的高度。是一個相對單位,它和父元素的字號有關係。 字體
這種圖標和字垂直居中的佈局咱們常常見到,只要這樣設置就能夠簡單實現,並且還不會受字號,頁面高度的影響。.icon-arrow {
display: inline-block;
width: 20px;
height: 1ex;
background: url(xxx.png) no-repeat center;
}
複製代碼
能夠利用 vertical-align 實現水平垂直居中,這種定位方法不用知道居中元素的寬高度,兼容ie6flex
下面模擬的是一個全屏的對話框。這種居中方法核心是父元素的text-aglin:center
,在寫一個居中元素的兄弟元素給與display: inline-block;height: 100%;vertical-align: middle;
三個屬性,自身設置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;
}
複製代碼
之前就知道overflow:hidden
一種觸發BFC的方法,其實如下都能出發BFC。ui
<html>
根元素;滾動條是html
所產生的全部想要頁面禁止出現滾動條不必拉着body
一塊兒設置overflow:hidden
,
當頁面加載很是慢的時候會出現頁面向左偏移的狀況,由於滾動條佔據了body的寬度致使body偏移。下述代碼是讓body
佔據整個 window 的寬度。這樣不會出現頁面加載慢時致使居中元素偏移的問題。(如今用戶寬帶大幅度提高基本上不會有這種狀況了)
html {
overflow-y: scroll; /* for IE8 */
}
:root {
overflow-y: auto;
overflow-x: hidden;
}
:root body {
position: absolute;
}
body {
width: 100vw;
overflow: hidden;
}
複製代碼
當我使用絕對定位的時候,總會老老實實的子決父相。可是無依賴的絕對定位效果會更好。
無依賴的佈局,即不使用傳統的子決父相的方式。不使用left
和top
控制,用 margin 或者 transform 來控制位置。
.icon-warn {
position: absolute;
margin-left: -20px;
width: 20px;
height: 20px;
background: url(warn.png) no-repeat center;
}
複製代碼
<p > <img src="1.jpg" > </p >
複製代碼
p {
text-align: center;
}
img {
position: absolute;
margin-left: ...;
}
複製代碼
雖然本示例中圖片位置確實受 text-align 屬性影響,可是並非 text-align 和 absolute 元素直接發生關係,absolute 元素的 display 計算值是塊狀的,text-align是不會有做用的。這裏之因此產生了位置變化,本質上是「幽靈空白節點」和「無依賴絕對定位」共同做用的結果
「幽靈空白節點」是內聯盒模型中很是重要的一個概念,具體指的是:在 HTML5 文檔聲明 中,內聯元素的全部解析和渲染表現就如同每一個行框盒子的前面有一個「空白節點」同樣。這 個「空白節點」永遠透明,不佔據任何寬度,看不見也沒法經過腳本獲取,就好像幽靈同樣, 但又確確實實地存在,表現如同文本節點同樣,所以,我稱之爲「幽靈空白節點」。
固然咱們是須要知道內聯元素的寬度的。margin-left
的值與負的通常寬度。與父元素position:relative
而後定位元素設置left:50%
的方法相似。但不會有層級問題。
overflow 不是定位元素,同時絕對定位元素和 overflow 容器之間也沒有定位元素 若是 ,則overflow 沒法對 absolute 元素進行剪裁。
根據上述所言。無依賴的absolute
不會被父級的overflow
所裁剪。
注意:因爲 transform 在各個瀏覽器對overflow
的支持不同因此當元素仍是被裁剪的話,試着找找是否是transform
的緣由
當一個絕對定位元素的相對方向都有定位的時候該元素就會擁有一種和文檔流類似的流體特性如
.box {
position: absolute;
left: 0; right: 0;
}
複製代碼
當一個絕對定位元素有以下的設置就能覆蓋整個瀏覽器。注意它的寬度高度是一種"格式化寬度/高度",於width:100%
徹底不一樣。給與margin
也不會出現超出屏幕。
.box {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
複製代碼
根據上面所說可使用margin:auto
實現水平居中的效果,若是有沒有left: 0; right: 0;
這種可以激發流體特性的屬性就不會有這種居中效果。固然想要用margin:auto auto
實現垂直水平居中是不能的。畢竟在標準文檔流也沒有這種效果。
代碼以下
.element {
width: 300px;
height: 200px;
position: absolute;
left: 0;
right: 0;
margin: auto;
}
複製代碼
fixed也能夠用無依賴佈局,以下實現一個在元素內部的固定定位
<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
等定位屬性。
以下代碼能夠獲取滾動條寬度,避免了禁用滾動條以後的頁面偏移現象。
//顯示
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
在css2 中只對定位元素有用可是在 css3 中加入了對flex
的支持
vertical-align
和
font-size
實現。
p {
font-size: 16px;
line-height: 1.5;
}
p > img {
vertical-align: -25%;
vertical-align: 0.6ex;;
}
複製代碼
子元素vertical-align
使用百分比能夠實現圖標與文字居中的問題並且不受字體大小的影響,可是會受到行高的影響。若是是 ex 不只能夠實現並且不會受到行高的影響。
在中文下text-decoration
有可能與下一行的字出現重疊這時候咱們用邊框來做爲下劃線,邊框不要設置顏色,它會默認的和字體一個顏色。
利用visibility
和絕對定位來實現隱藏並且不佔位置。或者透明度加絕對定位
.hidden {
position: absolute;
visibility: hidden;
}
.opacity {
position: absolute;
opacity: 0;
filter: Alpha(opacity=0);
}
複製代碼
visibility 與 display 的小區別
visibility
的子元素會被隱藏可是若是設置了visibility:visible
就會顯現出來,可是display:none
的元素就沒有這樣的效果。
引用: 《css世界》