主要爲讀書筆記,也有一些技巧。喜歡點個贊喲,謝謝。css
分離css和html的關注點:html負責標籤,css負責樣式html
關注html語義化,便於閱讀,便於爬蟲(seo)前端
// 清除浮動函數
.cf:before, .cf:after { content: " "; display: table; }
.cf:after { clear: both; }
.cf { *zoom: 1; }
複製代碼
漸進加強:瀏覽器遇到沒法識別的屬性時候會自動丟掉css3
<input type="email" />
,若是瀏覽器不支持email類型,則自動回退到默認值textbackground: #000; background: rgba(0,0,0,1)
,若是瀏覽器不支持rgba,則會自動丟棄rgba樣式私有屬性:先私有後標準git
webkit-box-shadow: 0px 5px 15px #EFEFEF;
box-shadow: 0px 5px 15px #EFEFEF;
複製代碼
@supports(display: grid){
若是支持grid,則下述css講做用。
}
複製代碼
link引用CSS,會並行下載;@import引入,會依次下載github
div{}
#app{}
.banner{}
*{}
p > span{}
,li + li{}
p span{}
html,body{}
input[type="radio"]{}
div::after{clear: both}
a:hover{}
補充說明下,選擇器的妙用:web
nth-child(-n + 3)
只選中前3個元素,更多案例required、focus、valid、invalid、checked、target、placeholder、read-only
<p style="color: red;"></p> >>> style/link
p{color: red;} <<< p{color: yellow;}
.app .banner{color: red} <<< .banner{color: yellow !important;}
// 有繼承性的屬性
一、font字體,color、font-size等。
二、文本系列屬性:text-indent、text-align、line-height、word-spacing、letter-spacing、text-transform、direction、color等。
三、表格屬性:caption-side、border-spacing、border-collapse。
四、列表屬性:list-style等。
五、全部元素可繼承:visibility、cursor等。
// 無繼承性的屬性
一、display、width、padding、margin、float、position、max-height、overflow、z-index等等。
二、文本屬性:vertical-align、text-decoration、text-shadow、white-space等。
三、背景屬性:background等
四、輪廓樣式:outline等。
五、清除浮動:clear等。
六、內容:content等。
複製代碼
文檔流、盒模型,控制着元素的排布。算法
以下面demo,定義了padding: 20px; width:33.3%
,默認狀況下會發生換行,若是設置box-sizing:border-box;
,則width = border + padding + 內容的寬度
瀏覽器
元素在排布時,margin會發生疊加現象,具體說來:兄弟外邊距疊加,父子外邊距疊加。sass
外邊距疊加有利於文本排版,可是有時候咱們不想要這個效果,怎麼辦呢?
不發生外邊距疊加的條件:浮動元素不與其餘元素疊加,bfc不與子元素疊加,inline-block不與任何元素疊加
浮動元素會脫離文檔流,爲兼容ie9及如下瀏覽器,業務中常常須要使用浮動佈局方案。
浮動效果,塊元素和行內元素效果以下:
清除浮動是很是常見的需求,最佳清除浮動代碼:
.cf:before, .cf:after { content: " "; display: table; }
.cf:after { clear: both; }
.cf { *zoom: 1; }
複製代碼
若某元素position:absolute; left: 50px;
,他的定位基準是誰?若某元素width:100%
,它的計算基準元素是誰?
這裏引出了一個重要概念---包含塊。包含塊也會影響元素的佈局,它決定了如何解釋各類屬性(如何計算值,及定位依據)?
transform: translate(10px, 0)
參照元素自身Border-boxposition: relative
定位元素,其left/top參照自身,其他以父元素Content-box爲基準position: absolute
定位元素,以父元素Padding-box爲基準左側圖片的高度未知,你有辦法讓右側p標籤與img同高嗎?(禁用flex、grid、table)查看demo
<div class="box">
<img class="left" src="xxx.jpg"/>
<p class="right">hello world!</p>
</div>
複製代碼
層疊上下文是三維概念,設想元素在垂直屏幕的Z軸上。
如何建立層疊上下文?
根元素(html)、z-index不爲auto的絕對/相對定位、z-index不爲auto的flex子元素、opacity小於1的元素、transform不爲nonde的元素、filter不爲nonde的元素、will-change元素
等等
在層疊上下文中,其元素依據z-index的值進行排布,排布的規則以下:
層疊上下文能夠包含在其餘層疊上下文中,以下面的demo,C元素在B的層疊上下文中排布,B元素同A、D元素依據層疊順序進行排布。
更詳細的層疊上下文和層疊順序推薦閱讀:深刻理解CSS中的層疊上下文和層疊順序
格式上下文也是很是重要的概念,影響着元素佈局的效果。
根元素(html)、浮動元素、absolute/fixed
定位元素、inline-block
元素、overflow不爲visible
元素、flex的直接子元素、grid的直接子元素、table-cell/table-caption/table-row/..
等
BFC有以下特性:
BFC規則的應用很是多,下面是基於BFC規則實現的浮動兩欄佈局:
僅包含內聯級別元素時會建立一個IFC(lineBox),IFC的高度基於line-height和vertical-align進行計算(不受pading/margin影響),其寬度由浮動狀況和它的包含塊決定,當寬度很大時會發生跨行(拆散爲多個ifc)
基於IFC規則實現的幽靈元素居中:
.user::before
的定義是ifc的高度等於300px,經過設定vertical-align:middle
使得居中對齊。另外,請關注span {width: 190px;}
,若是未設定寬度是什麼效果?爲何會這樣?
<div class="user">
<span>hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world! hello world!</span>
</div>
.user{
position: relative;
height: 300px;
width: 300px;
border: 1px solid #000;
text-align: center;
}
.user::before {
content: " ";
display: inline-block;
height: 100%;
width: 0;
vertical-align: middle;
}
span{
display: inline-block;
vertical-align: middle;
width: 190px;
}
複製代碼
若是未給span設定寬度,span元素將沒法居中!猜想緣由以下:1.文本建立了一個ifc,若span未設置寬度,則其寬度由文本內容的寬度決定;2.未設定190px屬性,則寬度佔滿父元素的300px,發生換行顯示。
IFC的對齊方式有時候可能比較難以理解,推薦文章:christopheraue.net/design/vert…
設置display:gird
的元素將會生成網格容器,讓佈局從一維變成二維。
設置display:flex
的元素將會生成自適應容器,容器的每個子元素都是一個伸縮項目。在FFC中,對子元素設置vertical-align、float
是無效的,容器元素同時設置column
也是無效的。
經常使用的文本排版屬性:
color、font-family、font-size、line-height、vertical-align、font-weight、font-style、text-transform、word-spacing、letter-spacing
文本排版的技巧:
max-width: 36em; margin: 0 auto;
p+p{text-indent: 1.25em}
text-align,left/right/center/justify/start/end
hyphens:auto
columns
指定列數單詞不換行超出demo,設定了寬度怎麼文字還超出了?
自定義字體在圖標上應用至關普遍,經常使用的圖標字體網站iconfont。
自定義字體的最佳兼容方案:
@font-face {
font-family: 'MyWebFont';
src: url('webfont.eot'); /* IE9 Compat Modes */
src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('webfont.woff') format('woff'), /* Modern Browsers */
url('webfont.ttf') format('truetype'), /* Safari, Android, iOS */
url('webfont.svg#svgFontName') format('svg'); /* Legacy iOS */
}
複製代碼
若是某天UI要求文本使用非默認字體,你可能須要有必定的心理準備。字體文件通常都至關的大,下載很是耗時,常見的解決方案:
使用text-shadow
能夠設置很是漂亮的陰影效果,經過逗號能夠同時設置多道陰影,以下面demo:
更加牛逼的藝術字體,直接看別人的教程吧:practice.typekit.com/lesson/usin…
針對CSS沒法實現的效果,可使用JS實現:
#000、rgb(0,0,0)、rgba(0,0,0,0.5)、hsl()
repeat、no-repeat、space、round
,新增background-repeat-x
url(...)、linear-gradient(45deg, #cfdfee, #4164aa)
,支持路徑圖片,支持base64圖片、支持漸變local、scroll、fixed
,背景圖片在視口內固定或者隨着區塊滾動
contain、cover
,背景圖片尺寸background使用技巧:
background-image和img有什麼區別?如何選取?
background支持多圖背景
漸變紋理圖片,lea.verou.me/css3pattern…
border技巧:
水平佈局和垂直佈局是最多見的需求,實現方案很是多,咱們一塊兒探討下
舉一個常見例子,如今須要實現用戶樣式,左側是用戶圖片,右側是用戶姓名,要求垂直居中顯示,現給定以下代碼:
<div class="user">
<img class="user-avatar" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1567271267460&di=8e74e290191f83e701da4561dc99d2f7&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F01acc45607d5826ac7251df87e05b8.jpg%401280w_1l_2o_100sh.png" width="50"/>
<p class="user-name">xiaoming</p>
</div>
複製代碼
.user{
clear: both
}
.user-avatar{
float: left
}
.user-name{
float: left;
margin-top: 12px;
}
複製代碼
.user{
}
.user-avatar{
display: inline-block;
vertical-align: middle;
}
.user-name{
display: inline-block;
}
複製代碼
.user{
display: table;
}
.user-avatar{
display: table-cell;
}
.user-name{
display: table-cell;
vertical-align: middle;
}
複製代碼
.user{
display: flex;
align-items: center;
}
複製代碼
.user{
display: grid;
grid-template-columns: 50px 50px;
}
複製代碼
在上述方案中,inline-block佈局須要注意元素之間的間隙,能夠在父元素設置font-size:0
進行消除。table佈局很容易實現元素居中效果,以下面demo:
待補充案例
能夠控制:元素尺寸(基於自身和有效剩餘空間);佈局方向;對其方式,順序
兼容至ie10,可是須要考慮私有屬性(打包工具autoprefix自動補充前綴)
主軸和交叉軸。margin-auto的妙用
flex-basis/base-grow/base-shrink,basis定義空間從而計算剩餘空間量,grow定義對於剩餘空間的分配比例(剩餘空間按比例分配)。而shrink定義縮小規則(計算縮小尺寸公式:((500 × 1) / ((800 × 1) + (500 × 1))) * 300 = 115.4 )。
縮寫形式:flex: 1 0 0%;, grow-shrink-basis
flex一樣支持多行佈局
flex有bug?github.com/philipwalto…
待補充
經常使用於響應式設計,如知名庫Bootstrap
先構思,避免陷入麻煩。模塊化和組件化開發,佈局頁面?
總體佈局思路:柵格佈局?grid佈局?
固定佈局、流體佈局、彈性佈局:
建立柵格的2種方式:col-1of4: 25%; 或者 row-quartet > * {25%}
頁面總體佈局和組件分離(佈局和內容分離)
水槽寬度計算,能夠設定百分比或者一個固定值。margin百分比相對於父元素寬度計算,em相對父元素字體計算
row容器使用margin:0 -1%,負邊距 消除 容器子元素左右2個變速的邊距。
使用padding計算排水溝,效果更簡單。
225,使用inline-block和flex加強佈局?
傳統方法基本都是從左到右進行佈局,如何進行2d維度佈局,grid
業務中使用表單很是多,咱們可能常常須要自定義表單控件,如radio/checkbox等等
經常使用表單表單樣式清除代碼:appearance: none; outline:none;border:none;
瀏覽器還沒有提供自定義修改checkbox的屬性,下面是配合label實現的demo:
input[type="checkbox"]{
position: absolute;
overflow: hidden;
width: 1px;
height: 1px;
clip: rect(0 0 0 0);
}
input[type="checkbox"] + label{}
input[type="checkbox"]:checked + label{}
input[type="checkbox"]:focus + label{}
input[type="checkbox"]:focus:checked + label{}
複製代碼
自定義radio實現原理同上,故在此不單獨說明。
優秀的自定義checkbox案例:tympanus.net/Development…
select樣式很難修改,傳統方案是使用div+span模擬實現,可是移動設備必須使用原生select標籤!
若是想要自定義select,能夠看看下面的兩種實現:
transform支持2d和3d變化。transform會建立新的layer,配合css動畫,性能卓越(but會消耗compose性能)
transition定義過分動畫,即屬性變化動畫
在設置高度動畫時,height必須設置Number。若是高度是動態的,則推薦使用max-height
屬性設置動畫,下面爲動態高度動畫:
animation定義幀動畫,經過關鍵幀能夠實現很是複雜的動畫
理解還不夠深入,此處就不粘貼了。可是很是值得一看!
transfrom: translateZ(0);
會建立新的Layer,避免重繪重排重繪是性能的基礎,能夠在這個網站查詢哪些屬性會影響重排重繪,網站:csstriggers.com/
推薦閱讀這篇文章,做者講述的更加全面深入:H5動畫60fps之路
響應式設計並不只侷限於改變佈局,經過媒體查詢能夠至關精確地對頁面進行重構,如:小屏幕擴大選擇區,元素的顯示隱藏,改變字體大小和行距等,從而提升閱讀體驗
@media all (max-width: 320x)
)早期蘋果爲了手機可以顯示pc頁面,引入視口概念。視口影響着頁面的顯示效果,可使用viewport對視口進行控制,width=device-width設定佈局視口等於理想視口。
若是設定以下:<meta name="viewport" content="width=device-width, initial-scale=1.0">
,則可視視圖爲320
若是設定以下:<meta name="viewport" content="initial-scale=2.0">
,則可視視圖爲160,出現橫向滾動條,字體被放大2倍
@media all and (min-width:800px) and (orientation:landscape) {}
@media not (all and ())
// 邏輯操做符:and or not only(only主要兼容舊瀏覽器!最好帶上!!!)
// width/height 視口寬高
// device-width 屏幕寬高
// orientation 橫向豎向
// aspect-ratio 視口寬高比
// device-aspect-ratio 平補的寬高比
// color 每種顏色?
// resolution 打印機分辨率
// 視口:佈局視口(頁面原有大小)/可視視口(手機上的可視視口,即屏幕寬度)/理想視口(使用可視視口布局?),在手機端能夠縮放網頁/滑動位置;
// <meta name="viewport" content="device-width" />開啓手機理想視口。手機的佈局視口依賴網頁設定?仍是手機本身設定?
複製代碼
根據設備大小加載不一樣尺寸的圖片,經常使用的實現方式:
根據設備大小,設置字體的尺寸,經常使用的實現方式
em相對父元素,rem相對根元素(html),vw相對視口單位,若不考慮兼容性則推薦使用font-size:5vw
。
max-width
,避免超出PostCSS 這個術語能夠指代兩件事:一是 PostCSS 核心工具,二是基於 PostCSS 建立的插件系統。PostCSS 核心工具並不能直接用於處理樣式,只有配合它的插件,才能完成相關的編譯工做。
<link href="assets/css/global.css" rel="stylesheet" type="text/css"/>
<link href="assets/css/index.css" rel="stylesheet" type="text/css"/>
<link href="assets/css/skin.css" rel="stylesheet" type="text/css"/>
複製代碼
1. Eric Meyer’s 「Reset CSS」 2.0
2. Normalize.css
複製代碼
補充說明:
根據屬性的重要性按順序書寫,先寫定位佈局屬性,後寫盒模型等自身屬性,最後是文本類及修飾類屬性
若是屬性間存在關聯性,則不要隔開寫,如:
height: 18px;
line-height: 18px;
複製代碼
BEM的命名規則: 塊名__元素--修飾符
BEM的抽象理解:
BEM的優點:
.sidebar conent-title__reversed
)h2{color: white !important;}
,則上面的demo最終顯示什麼?)BEM定義類名的原則:
rol、col
關注佈局,media-block
關注組件樣式:BEM是一個優秀的模塊化方案,可是可能存在一些問題:
list-marginTop30 form-marginTop30
所以沒必要拘泥於BEM方案,技術最終服務於產品。
若是你正在開發企業後臺,對於樣式沒要求很是精準,推薦使用函數式css方案,它可以有效的減小css代碼重複量!
函數式CSS開源庫有不少,筆者在業務中基於tachyons進行了修改,打造本身的函數式css庫,如定義width的幾種方式:
/*
針對寬度,定製經常使用的css類名
.w-120 width: 120px
.w20 width: 20%
.w--auto width: auto
*/
.w-80{width: 80px;}
.w20{ width: 20%; }
.w--auto{ width: auto; }
.w--third { width: 33.333333%; }
複製代碼
table-layout屬性定義了用於佈局表格單元格、行和列的算法。
table{
table-layout: fixed;
}
複製代碼
tableLayot-fixed:超出顯示省略號DEMO
蟬原則,使用質數做爲循環週期來增長「天然隨機性」的策略(模擬天然的隨機效果)。如質數五、7的最小公倍數爲35。
// 隨機背景條紋
.stripes {
background-color: #026873;
background-image: linear-gradient(90deg, rgba(255,255,255,.07) 50%, transparent 50%),
linear-gradient(90deg, rgba(255,255,255,.13) 50%, transparent 50%),
linear-gradient(90deg, transparent 50%, rgba(255,255,255,.17) 50%),
linear-gradient(90deg, transparent 50%, rgba(255,255,255,.19) 50%);
background-size: 13px, 29px, 37px, 53px;
}
// 隨機圓角效果,最小公倍數-質數相乘2310
.list:nth-child(2n + 1) {}
.list:nth-child(3n + 2) {}
.list:nth-child(5n + 3) {}
.list:nth-child(7n + 4) {}
.list:nth-child(11n + 5) {}
// 隨機動畫效果
animation: 1s spin, .7s radius, 1.1s color, 1.3s width;
複製代碼
隨機背景條紋效果圖:
蟬原則案例:隨機顏色方塊DEMO
若是業務要求開發web播放器,必須保證播放器按等比例進行縮放,如何實現?
利用pading百分比技術便可輕鬆實現。
學習Vue源碼系列:【Ts重構Vue】00-Ts重構Vue前言