2021-10-01

盒模型

包括:外邊距(margin)嗤详、邊框(border)惑惶、內(nèi)邊距(padding)袄琳、實(shí)際內(nèi)容(content)四個(gè)屬性前翎。
CSS盒模型:標(biāo)準(zhǔn)模型 + IE模型
標(biāo)準(zhǔn)盒子模型:寬度=內(nèi)容的寬度(content)+ border + padding
低版本IE盒子模型:寬度=內(nèi)容寬度(content+border+padding)婶恼,如何設(shè)置成 IE 盒子模型:box-sizing: border-box;

position 屬性值

static:默認(rèn)定位桑阶,對(duì)象遵循正常文檔流。top勾邦,right蚣录,bottom,left等屬性不會(huì)被應(yīng)用眷篇。
relative:對(duì)象遵循正常文檔流萎河,但將依據(jù)top,right,bottom虐杯,left等屬性在正常文檔流中偏移位置玛歌。而其層疊通過z-index屬性定義。
absolute:對(duì)象脫離正常文檔流擎椰,使用top支子,right,bottom达舒,left等屬性進(jìn)行絕對(duì)定位值朋。而其層疊通過z-index屬性定義。
fixed:對(duì)象脫離正常文檔流巩搏,使用top昨登,right,bottom贯底,left等屬性以窗口為參考點(diǎn)進(jìn)行定位丰辣,當(dāng)出現(xiàn)滾動(dòng)條時(shí),對(duì)象不會(huì)隨著滾動(dòng)丈甸。而其層疊通過z-index屬性定義糯俗。
sticky:具體是類似 relative 和 fixed,在 viewport 視口滾動(dòng)到閾值之前應(yīng)用 relative睦擂,滾動(dòng)到閾值之后應(yīng)用 fixed 布局得湘,由 top 決定。

外邊距合并

兩個(gè)在普通文檔流中的“相鄰”元素外邊距相遇的時(shí)候發(fā)生合并的情況顿仇。這個(gè)“相鄰”可以是父子相鄰淘正,兄弟相鄰,如果一個(gè)元素內(nèi)部沒有東西臼闻,自身的上下邊距相遇時(shí)也會(huì)發(fā)生外邊距合并鸿吆。

合并的結(jié)果

兩個(gè)外邊距都是正數(shù)時(shí),取兩者之中的較大者述呐;兩個(gè)外邊距都是負(fù)數(shù)時(shí)惩淳,取兩者之間絕對(duì)值較大者;當(dāng)一正一負(fù)時(shí)乓搬,取兩者的和思犁。

  • 父元素和子元素:在正常的文檔流當(dāng)中,父元素沒有邊框或padding进肯,那么父子之間會(huì)發(fā)生外邊距合并激蹲。解決:給父元素加邊框/設(shè)置父元素的padding
  • 自身元素:加邊框/加padding/設(shè)置overflow:hidden(它內(nèi)部形成了一個(gè)空間,自身的margin被這個(gè)空間隔離開)江掩。

不產(chǎn)生外邊距合并

  • 浮動(dòng)元素不與任何元素產(chǎn)生外邊距合并
  • inline-block元素不合并
  • 使用絕對(duì)定位的元素学辱,不與任何元素發(fā)生外邊距合并
  • 子元素加了div包裹之后乘瓤,利用overflow:hidden外邊距不合并,可見創(chuàng)建BFC與子元素不發(fā)生合并策泣。在外層形成了BFC真正把兩者的外邊距隔離開來衙傀。

總的來說,外邊距合并不一定是兩個(gè)相鄰元素着降,不相鄰的也可能會(huì)發(fā)生外邊距合并差油。只要它們的外邊距會(huì)融合到一起,沒有分界線(可以是邊框任洞、padding,也可以是BFC形成的空間)隔開发侵,就
有可能發(fā)生外邊距合并交掏。

去除inline-block內(nèi)縫隙

兩個(gè)相鄰的inline-block 元素中間會(huì)有間隙

  • html內(nèi)標(biāo)簽不含空格
  • 標(biāo)簽可以換行,但是要保證標(biāo)簽相接的地方?jīng)]有空格
  • 利用負(fù)margin(一般-4px左右)(margin-top和margin-left移動(dòng)的是自己刃鳄,margin-right和margin-bottom移動(dòng)的是周圍的元素盅弛。因?yàn)閙argin的意思是要讓周圍的元素有多少距離,比如說10px叔锐。根據(jù)文檔流的順序挪鹏,當(dāng)前的元素距離下一個(gè)元素要有10px的位置。因此愉烙,如果設(shè)置的是right和bottom讨盒,自然就是下一個(gè)元素移動(dòng)。不然當(dāng)前的元素和它前面的元素margin就會(huì)受到影響步责。)
  • 利用浮動(dòng) (容器設(shè)置overflow:auto返顺,容器內(nèi)inline_block元素float:left)
  • 父元素font-size,在容器里面的元素需要把字體大小重置回來。

BFC

浮動(dòng)元素蔓肯、絕對(duì)定位元素遂鹊、非塊級(jí)元素的塊級(jí)容器(例如 inline-blocks, table-cells, 和 table-captions)以及overflow值不為“visiable”的塊級(jí)盒子,都會(huì)為他們的內(nèi)容創(chuàng)建新的塊級(jí)格式化上下文蔗包。簡單的來說秉扑,BFC就是一個(gè)獨(dú)立的空間,內(nèi)部的元素不受外部元素影響调限。

主要有以下一些用處

清除浮動(dòng)
防止外邊距合并
設(shè)計(jì)布局

形成 BFC 的條件

五種:
? 浮動(dòng)元素舟陆,float 除 none 以外的值
? 定位元素,position(absolute旧噪,fixed)
? display 為以下其中之一的值 inline-block吨娜,table-cell,table-caption
? overflow 除了 visible 以外的值(hidden淘钟,auto宦赠,scroll)
? HTML 就是一個(gè) BFC
BFC 的特性:
? 內(nèi)部的 Box 會(huì)在垂直方向上一個(gè)接一個(gè)的放置陪毡。
? 垂直方向上的距離由 margin 決定
? bfc 的區(qū)域不會(huì)與 float 的元素區(qū)域重疊。
? 計(jì)算 bfc 的高度時(shí)勾扭,浮動(dòng)元素也參與計(jì)算
? bfc 就是頁面上的一個(gè)獨(dú)立容器毡琉,容器里面的子元素不會(huì)影響外面元素。

父容器使用overflow: auto| hidden撐開高度的原理

當(dāng)元素設(shè)置浮動(dòng)時(shí)妙色,父元素感知不到元素的存在桅滋,造成高度塌陷。在父容器使用overflow屬性時(shí)形成一個(gè)BFC身辨,使其內(nèi)部元素不受外界的影響丐谋。
BFC有三個(gè)特性:
BFC會(huì)阻止垂直外邊距(margin-top、margin-bottom)折疊
BFC不會(huì)重疊浮動(dòng)元素
BFC可以包含浮動(dòng)
根據(jù)第三條特性就可以知道煌珊,父容器的高度可以被撐開号俐。

清除浮動(dòng)

.clearfix:after{ /* 在clearfix后面添加一個(gè)偽元素 /
content: ' '; /
偽元素的內(nèi)容為空白字符 /
display: block; /
因?yàn)閭卧厣傻哪J(rèn)為行內(nèi)又元素,而clear對(duì)象一定是塊級(jí)元素定庵,所以這里設(shè)置一下display屬性吏饿。 /
clear: both; /
不允許元素兩邊有浮動(dòng)元素 /
}
.clearfix{
zoom: 1; /
”號(hào)是IE68的一個(gè)bug,IE68看到以“”開頭的代碼蔬浙,會(huì)忽略星號(hào)猪落,執(zhí)行后面的代碼。而zoom的原意是放大畴博。它也會(huì)觸發(fā)BFC笨忌,在IE里面其實(shí)不叫BFC,叫hasLayout 绎晃。/
}
zoom是IE的特有屬性蜜唾,可以設(shè)置對(duì)象的縮放比例。后面可以接數(shù)字或者百分?jǐn)?shù)庶艾,也就是表示縮放的比例袁余。經(jīng)常用zoom: 1;來觸發(fā)IE的hasLayout、清除浮動(dòng)以及解決外邊距合并的問題咱揍。因?yàn)閭卧卦贗E8是部分支持颖榜,IE8以下不支持,所以上述的代碼在IE中也能達(dá)到清除浮動(dòng)的效果煤裙。
BFC是形成一個(gè)內(nèi)部的獨(dú)立小空間掩完,不受外部元素影響。而上述方法只是讓父元素感知到浮動(dòng)元素的存在硼砰,把內(nèi)容撐開且蓬,不會(huì)形成獨(dú)立的空間。

清除浮動(dòng)方法及原理

清除浮動(dòng)常用的四種方式:

  1. 父級(jí)div定義height
  2. 額外標(biāo)簽法: 在有浮動(dòng)的父級(jí)元素的末尾插入了一個(gè)沒有內(nèi)容的塊級(jí)元素div 并添加樣式clear:both题翰。
  3. 利用偽元素:父級(jí)div定義 偽類:after恶阴,我們可以寫一個(gè).clearfix 工具樣式诈胜,當(dāng)需要清除浮動(dòng)時(shí),就為其加上這個(gè)類 .clearfix:after { display: block; clear :both; content: '';}冯事。
  4. 父級(jí)添加overflow屬性: 包含浮動(dòng)元素的父標(biāo)簽添加樣式overflowhiddenauto焦匈,通過觸發(fā)BFC方式,實(shí)現(xiàn)清除浮動(dòng)

清除浮動(dòng)的四種方式及其原理理解

負(fù)邊距 /position: relative

負(fù)margin和position: relative在讓元素產(chǎn)生偏移時(shí)都沒有脫離文檔流昵仅。但是利用負(fù)margin讓元素產(chǎn)生偏移時(shí)缓熟,元素原來的位置會(huì)被占據(jù);而position: relative元素原來的位置不會(huì)被占據(jù)摔笤,仍然會(huì)被保留够滑。
使用 相對(duì)定位 時(shí),無論是否進(jìn)行移動(dòng)籍茧,元素仍然占據(jù)原來的空間版述。因此,移動(dòng)元素會(huì)導(dǎo)致它覆蓋其它框

負(fù)邊距

margin-top和margin-left是移動(dòng)自己(偏移后會(huì)對(duì)后面的元素有影響寞冯,比如設(shè)置margin-top:-10px,后面的元素也會(huì)跟著往下移),而margin-right和margin-bottom是讓周圍的元素移動(dòng)晚伙。
position: relative 的元素發(fā)生偏離后不會(huì)影響到其他的元素的偏移
利用負(fù)margin來擴(kuò)大面積:一個(gè)元素沒有設(shè)置 width吮龄,只有左右的負(fù)margin,那么它就會(huì)變寬

margin 百分比

屬性值為百分比時(shí)的邊距是基于父元素的寬度來計(jì)算的咆疗。默認(rèn)情況下writing-mode的值為 horizontal-tb漓帚,即水平書寫方式。當(dāng)把書寫模式修改為縱向的時(shí)候午磁,margin-top/bottom/left/right的百分比值都將會(huì)以包含元素(父元素)的高度為參照 https://blog.csdn.net/qq_40776187/article/details/87865123

兩欄布局

  • 左 float尝抖, + 右 margin-left(右邊自適應(yīng))
  • 右 float,margin-right
  • BFC + float
    .aside {
    width: 300px;
    float: left;
    }
    .main {
    overflow: hidden;
    }
  • float + 負(fù) margin
    .left {
    width: 100%;
    float: left;
    background: #f00;
    margin-right: -200px;
    }
    .right {
    float: left;
    width: 200px;
    background: #0f0;
    }
  • flex
    flex: flex-grow, flex-shrink 和 flex-basis的簡寫
    flex 的默認(rèn)值是 0 1 auto迅皇。
    .container {
    display: flex;
    }
    .left {
    flex: 0 0 200px;
    }
    .right {
    flex: 1;
    }
  • position + margin
    .container {
    position: relative;
    }
    .left {
    position: absolute;
    width: 200px;
    }
    .right {
    width: 100%; /* 基于包含塊的百分比/
    margin-left: 200px; /
    避免被前面的left 蓋住*/
    }

三欄布局

  • position + margin-left + margin-right
    .wrap {
    position: relative;
    }
    .left {
    position: absolute;
    left: 0;
    top: 0;
    width: 200px;
    }
    .right {
    position: absolute;
    right: 0;
    top: 0;
    width: 200px;
    }
    .middle {
    margin-left: 200px;
    margin-right: 200px;
    }

  • 圣杯布局
    代碼:https://www.yuque.com/tuture/interview/htok5l?viewer=lake#TjkAS
    left盒子負(fù)內(nèi)邊距-100%的解釋(https://segmentfault.com/a/1190000014546205)

    .container {
      padding: 0 300px 0 200px;
      border: 1px solid black;
    }
    
    .content {
      float: left;
      width: 100%;
      background: #f00;
    }
    
    .left {
      width: 200px;
      background: #0f0;
      float: left;
      margin-left: -100%;
      position: relative;
      left: -200px;
    }
    
    .right {
      width: 300px;
      background: #00f;
      float: left;
      margin-left: -300px;
      position: relative;
      right: -300px;
    }
    

    <div class="container">
    <div class="content">中間內(nèi)容</div>
    <div class="left">左側(cè)區(qū)域</div>
    <div class="right">右側(cè)區(qū)域</div>
    </div>

  • flex

    .wrapper {
      display: flex;
    }
    .content {
      flex: 1 1;
      order: 2;
      background: #f00;
    }
    .left {
      flex: 0 0 200px;
      order: 1;
      background: #0f0;
    }
    .right {
      flex: 0 0 300px;
      order: 3;
      background: #00f;
    }
    

圣杯布局和雙飛翼布局

  • 共同點(diǎn):三欄全部float浮動(dòng)昧辽,但左右兩欄加上負(fù)margin讓其跟中間欄div并排,以形成三欄布局登颓。負(fù)邊距是這兩種布局中的重中之重
  • 不同點(diǎn):解決“中間欄div內(nèi)容不被遮擋”的思路不同

圣杯布局

  • 1.三者都設(shè)置向左浮動(dòng)
  • 2.設(shè)置middle寬度為100%;
  • 3.設(shè)置負(fù)邊距搅荞, left設(shè)置負(fù)左邊距為100%, right設(shè)置負(fù)左邊距為負(fù)的自身寬度
  • 4.設(shè)置content的padding值給左右兩個(gè)子面板留出空間
  • 5.設(shè)置兩個(gè)子面板為相對(duì)定位,left面板的left值為負(fù)的left面板寬度框咙,right面板的right值為負(fù)的right面板的值

但是圣杯布局有個(gè)問題:當(dāng)面板的middle部分比兩邊的子面板寬度小的時(shí)候咕痛,布局就會(huì)亂掉。因此也就有了雙飛翼布局來克服這個(gè)問題喇嘱。如果不增加任何標(biāo)簽茉贡,想實(shí)現(xiàn)更完美的布局非常困難,因此雙飛翼布局在主面板上選擇了加一個(gè)標(biāo)簽

雙飛翼布局

  • 1.三者都設(shè)置向左浮動(dòng)者铜。
  • 2.設(shè)置middle寬度為100%腔丧。
  • 3.設(shè)置 負(fù)邊距放椰,left設(shè)置負(fù)左邊距為100%,right設(shè)置負(fù)左邊距為負(fù)的自身寬度
  • 4.設(shè)置middle-content的margin值給左右兩個(gè)子面板留出空間悔据。

對(duì)比兩者可以發(fā)現(xiàn)庄敛,雙飛翼布局與圣杯布局的主要差別在于:

  • 1.雙飛翼布局給主面板(中間元素)添加了一個(gè)父標(biāo)簽用來通過margin給子面板騰出空間
  • 2.圣杯布局采用的是padding,而雙飛翼布局采用的margin, 解決了圣杯布局的問題
  • 3.雙飛翼布局不用設(shè)置相對(duì)布局,以及對(duì)應(yīng)的left和right值

詳解查看 常見CSS布局的實(shí)現(xiàn)

http://www.reibang.com/p/be0094ace1c9

bfc

W3c定義:
Formatting context(格式化上下文) 是 CSS2.1 規(guī)范中的一個(gè)概念科汗。是頁面中的一塊渲染區(qū)域藻烤,并且有一套渲染規(guī)則,決定了子元素如何定位头滔,以及和其他元素的關(guān)系和相互作用怖亭。
BFC是一種布局方式,在這種布局方式下坤检,盒子們自所在的容器塊頂部一個(gè)接一個(gè)垂直排列兴猩,水平方向上撐滿整個(gè)寬度(普通流)。具有 BFC 特性的元素可以看作是隔離了的獨(dú)立容器早歇,容器里面的元素不會(huì)在布局上影響到外面的元素倾芝,并且 BFC 具有普通容器所沒有的一些特性。
浮動(dòng)元素和絕對(duì)定位元素箭跳,非塊級(jí)盒子的塊級(jí)容器(例如 inline-blocks, table-cells, 和 table-captions)晨另,以及overflow值不為“visiable”的塊級(jí)盒子,都會(huì)為他們的內(nèi)容創(chuàng)建新的BFC(塊級(jí)格式上下文)谱姓。
兩個(gè)相鄰的BFC之間的距離由margin決定借尿。在同一個(gè)BFC內(nèi)部,兩個(gè)垂直方向相鄰的塊級(jí)元素的margin會(huì)發(fā)生“塌陷”屉来。

觸發(fā)BFC:

float屬性不為none
overflow不為visible(可以是hidden路翻、scroll、auto)
position為absolute或fixed
display為inline-block茄靠、table-cell茂契、flex
body根元素
應(yīng)用:

  1. 同一個(gè) BFC 下垂直相鄰塊元素外邊距會(huì)發(fā)生折疊。要避免外邊距的重疊嘹黔,可以將其放在不同的 BFC 容器中账嚎。
  2. 清除內(nèi)部浮動(dòng)。觸發(fā)容器的 BFC儡蔓,那么容器將會(huì)包裹著浮動(dòng)元素overflow郭蕉。
  3. 創(chuàng)建自適應(yīng)兩欄布局。BFC 可以阻止元素被浮動(dòng)元素覆蓋

容器等寬

table-cell

.left, .middle, .right{
display: table-cell;
width: 3000px;
}

flex

.wrap {
width: 100%;
flex-direction: row;
display: flex;
}
.div {
//取值為一個(gè)非負(fù)數(shù)字喂江,為 flex-grow 值召锈,flex-shrink :1,flex-basis :0%
flex-grow: 1;
}

百分比

水平获询、垂直均相對(duì)于父元素居中

行內(nèi)元素水平居中

把行內(nèi)元素包裹在父元素(<div>涨岁、<li>拐袜、<p>等)中,并且在父元素設(shè)置

container{

text-align:center;

}
適用于文字梢薪,鏈接蹬铺,及其inline或者inline-block、inline-table和inline-flex秉撇。

塊狀元素的水平居中

設(shè)置左右margin為auto甜攀,元素設(shè)置:

center{

margin:0 auto;

}

多個(gè)塊狀元素水平居中

方法1: 將元素設(shè)置為display: inline-block,在父元素設(shè)置text-align: center琐馆。
方法2: 使用flexbox规阀。
flex布局默認(rèn)為塊級(jí)元素,要設(shè)置元素為flex布局瘦麸,只需在父元素上設(shè)置
display: flex;
justify-content: center;
若要設(shè)置行內(nèi)元素谁撼,同理設(shè)置父元素:display: inline-flex

已知高度寬度元素的水平垂直居中

絕對(duì)定位+負(fù)margin

.container{
position: relative;
}
.item{
width: 100px;
height: 100px;
position: absolute;
top: 50%;
left: 50%;
margin-top: -50px;
margin-left: -50px;
}

將填滿整個(gè)父容器

.container{
position: relative;
}
.center{
position:absolute;
margin:auto;
top:0;
bottom:0;
left:0;
right:0;
}

inline或者inline-block 元素垂直居中

設(shè)置父元素:
.container {
display: table-cell;
text-align: center;
vertical-align: middle;
}

css3的transform

translate是基于元素本身的寬高去計(jì)算百分比的,所以同樣適用于寬度和高度都不固定的情況
.container{
position:relative;
}
.center{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}

flex布局

.container{
display:flex;
justify-content:center;
align-items: center;
}

用js控制

父元素相對(duì)定位滋饲,子元素絕對(duì)定位厉碟;js動(dòng)態(tài)設(shè)置top,left
childDom.style.top = (parent.offsetHeight - childDom.offsetHeight) / 2 + "px";
childDom.style.left = (parent.offsetWidth - childDom.offsetWidth) / 2 + "px";

CSS 權(quán)重和優(yōu)先級(jí)

常用選擇器權(quán)重優(yōu)先級(jí):!important > id > class > tag
!important可以提升樣式優(yōu)先級(jí),但不建議使用屠缭。如果!important被用于一個(gè)簡寫的樣式屬性墨榄,那么這條簡寫的樣式屬性所代表的子屬性都會(huì)被應(yīng)用上!important。 例如:background: blue !important;

Flex 布局

● 彈性盒布局勿她,CSS3 的新屬性,用于方便布局阵翎,比如垂直居中
● flex屬性是 flex-grow逢并、flex-shrink 和 flex-basis 的簡寫
flex:1 非負(fù)數(shù)字,為 flex-grow 值郭卫,flex-shrink : 1砍聊,flex-basis :0%
flex:0 對(duì)應(yīng)的三個(gè)值分別為 0 1 0%
flex :一個(gè)長度或百分比,則為 flex-basis 值贰军,flex-grow : 1玻蝌,flex-shrink : 1,(0% 是一個(gè)百分比)
(https://www.ruanyifeng.com/blog/2015/07/flex-grammar.html)

畫一個(gè)大小為父元素寬度一半的正方形

子元素設(shè)置:width: 50%; padding-bottom: 50%;
padding:% 規(guī)定基于父元素的寬度的百分比的內(nèi)邊距词疼。

正方形

https://www.yuque.com/tuture/interview/htok5l#C5TDN
● width 設(shè)置百分比
● padding 撐高
● 如果只是要相對(duì)于 body 而言的話俯树,還可以使用 vw 和 vh
● 偽元素設(shè)置 margin-top: 100%撐高

固定寬高比

在div的width固定的情況下,設(shè)置height為0贰盗,使內(nèi)容自然溢出许饿,再通過設(shè)置padding-bottom使元素有一定高度。
.element {
/* 16:9寬高比舵盈,則設(shè)padding-bottom:56.25% /
/
height: 0px, 防止矩形被里面的內(nèi)容撐出多余的高度*/
width: 100vw;
height: 0px;
padding-bottom: 56.25%;
background: pink;
}
當(dāng)margin/padding取形式為百分比的值時(shí)陋率,無論是left/right球化,還是top/bottom,都是以父元素的width為參照物的瓦糟!

偽類和偽元素

css引入偽類和偽元素概念是為了格式化文檔樹以外的信息筒愚。偽類和偽元素是用來修飾不在文檔樹中的部分。

偽類
偽類 用于當(dāng)元素處于某個(gè)狀態(tài)時(shí)菩浙,為其添加對(duì)應(yīng)的樣式巢掺,這個(gè)狀態(tài)是根據(jù)用戶行為而動(dòng)態(tài)變化的伤为。比如說丰刊,用戶懸停在指定的元素時(shí)元践,我們可以通:hover來描述這個(gè)元素的狀態(tài)贬芥。雖然它和普通的css類類似场梆,可以為已有的元素添加樣式益眉,但是它只有處于dom樹無法描述的狀態(tài)下才能為元素添加樣式佳遣,所以將其稱為偽類奸鸯。


image.png

偽元素

偽元素 用于創(chuàng)建不在文檔樹中的元素坝初,并為其添加樣式浸剩,比如說,我們可以通過:before來在一個(gè)元素前添加一些文本鳄袍,并為這些文本添加樣式绢要。雖然用戶可以看到這些文本,但是這些文本實(shí)際上不在文檔樹中拗小。

image.png

css 選擇器

通用選擇器(*)
標(biāo)簽選擇器(div)
class選擇器(.wrap)
id選擇器(#wrap)
屬性選擇器(E[att], E[att=val], E[att~=val])
E[att]: 匹配所有具有att屬性的E元素重罪,不考慮它的值
E[att=val]:匹配所有att屬性等于"val"的E元素
E[att~=val]:匹配所有att屬性具有多個(gè)空格分隔的值、其中一個(gè)值等于"val"的E元素
相鄰選擇器(h1 + p)
子選擇器(ul > li)
后代選擇器(li a)
偽類選擇器:
E:first-child:匹配父元素的第一個(gè)子元素
E:link 匹配所有未被點(diǎn)擊的鏈接
E:focus 匹配獲得當(dāng)前焦點(diǎn)的E元素
E:not(s) 反選偽類哀九,匹配不符合當(dāng)前選擇器的任何元素

css解析規(guī)則

CSS選擇器是 從右向左解析 剿配。
兩種匹配規(guī)則的性能差別很大,是因?yàn)閺挠蚁蜃蟮钠ヅ湓诘谝徊骄秃Y選掉了大量的不符合條件的最右節(jié)點(diǎn)(葉子節(jié)點(diǎn))阅束,而從左向右的匹配規(guī)則的性能都浪費(fèi)在了失敗的查找上面呼胚。https://juejin.cn/post/6844904117819850765#heading-7

display: none和 visibility:hidden

是否占據(jù)空間
display: none 不占據(jù)空間
visibility:hidden 占據(jù)空間
是否渲染
display:none,會(huì)觸發(fā)reflow(回流)息裸,進(jìn)行渲染蝇更。
visibility:hidden,只會(huì)觸發(fā)repaint(重繪)呼盆,因?yàn)闆]有發(fā)現(xiàn)位置變化年扩,不進(jìn)行渲染。
是否是繼承屬性
display:none宿亡,display不是繼承屬性常遂,元素及其子元素都會(huì)消失。
visibility:hidden,visibility是繼承屬性克胳,若子元素使用了visibility:visible平绩,則不繼承,這個(gè)子孫元素又會(huì)顯現(xiàn)出來漠另。
opacity 會(huì)將元素設(shè)置為透明捏雌,但是其位置也在頁面文檔流中,不會(huì)被刪除笆搓,所以會(huì)觸發(fā)瀏覽器渲染引擎的重繪

em rem vh vw calc(), line-height 百分比

em

em: 相對(duì)父元素的font-size性湿,具有繼承的特點(diǎn)。如果字體大小是16px(瀏覽器的默認(rèn)值)满败,那么 1em = 16px

rem

rem:相對(duì)根節(jié)點(diǎn)html的字體大小來計(jì)算肤频,不會(huì)像em那樣,依賴于父元素的字體大小算墨,而造成混亂

vw 和vh

vw:viewpoint width宵荒,視窗寬度,1vw等于視窗寬度的1%净嘀。

vh:viewpoint height报咳,視窗高度,1vh等于視窗高度的1%挖藏。

vmin:取當(dāng)前vw和Vh中較小的那一個(gè)值暑刃, vmax:取當(dāng)前Vw和Vh中較大的那一個(gè)值

vw、vh 與 % 百分比的區(qū)別:

  • % 是相對(duì)于父元素的大小設(shè)定的比率膜眠,vw岩臣、vh 是視窗大小決定的。
  • vw宵膨、vh 優(yōu)勢在于能夠直接獲取高度婿脸,而用 % 在沒有設(shè)置 body 高度的情況下,是無法正確獲得可視區(qū)域的高度的柄驻,所以這是挺不錯(cuò)的優(yōu)勢。

calc()

calc(): CSS3中新增的一個(gè)函數(shù), 用于動(dòng)態(tài)計(jì)算寬/高焙压,使用數(shù)學(xué)表達(dá)式來表示

  • 使用“+”鸿脓、“-”、“*” 和 “/”四則運(yùn)算涯曲;
  • 可以使用百分比野哭、px、em幻件、rem等單位拨黔;
  • 可以混合使用各種單位進(jìn)行計(jì)算;
  • 表達(dá)式中有“+”和“-”時(shí)绰沥,其前后必須要有空格篱蝇,如"width: calc(12%+5em)"這種沒有空格的寫法是錯(cuò)誤的贺待;

vertical-align

用來指定行內(nèi)元素(inline)或表格單元格(table-cell)元素的垂直對(duì)齊方式。
可被用于兩種環(huán)境:

  • 使行內(nèi)元素盒模型與其行內(nèi)元素容器垂直對(duì)齊零截。
  • 垂直對(duì)齊表格單元內(nèi)容

line-height 百分比

可以直接查看MDN上的相關(guān)解釋:

line-height 屬性被指定為以下任何一個(gè):

  • 一個(gè) <數(shù)字>: 該屬性的應(yīng)用值是這個(gè)無單位數(shù)字<數(shù)字>乘以該元素的字體大小
  • 一個(gè) <百分比>:與元素自身的字體大小有關(guān)麸塞。計(jì)算值是給定的百分比值乘以元素計(jì)算出的字體大小
  • 一個(gè) <長度> :必須px, em等涧衙,詳細(xì)查看CSS長度
  • 關(guān)鍵詞 normal哪工。

rem 布局

實(shí)際開發(fā)過程中,可以使用 lib-flexible庫弧哎,但是如果每次寫的時(shí)候都要手動(dòng)去計(jì)算有點(diǎn)太過麻煩了雁比,我們可以通過在webpack中配置 px2rem-loader, 或者 pxrem-loader,主要原理就是需要自己配置 px轉(zhuǎn)rem的計(jì)算規(guī)則撤嫩,在編輯的時(shí)候直接計(jì)算轉(zhuǎn)成rem偎捎。所以在開發(fā)的時(shí)候直接按照設(shè)計(jì)稿的尺寸寫px,編譯后會(huì)直接轉(zhuǎn)化成rem非洲;
推薦:

postcss

postcss可以理解為CSS的”babel“鸭限,可以讓我們使用比較新的CSS語法

postcss 不是類似less的CSS預(yù)處理器, 而是一種允許用JS插件來轉(zhuǎn)變樣式的工具两踏。 postcss提供了一個(gè)解析器败京,它能夠?qū)SS解析成抽象語法樹(AST)。

postcss的常用插件

css modules

作用:

  • 避免css相互覆蓋的方法,CSS Modules 加入了局部作用域和模塊依賴

實(shí)現(xiàn)原理:

  • CSS的規(guī)則是全局的帕识,任何一個(gè)組件的樣式規(guī)則泛粹,對(duì)整個(gè)頁面有效;
  • 產(chǎn)生局部作用域的唯一方法肮疗,就是使用一個(gè)獨(dú)一無二的class名字晶姊,不會(huì)與其他選擇器重名,這就是CSS Modules的實(shí)現(xiàn)原理:將每個(gè)類名編譯成獨(dú)一無二的哈希值伪货;

CSS Modules 用法教程

css 預(yù)處理器

CSS 預(yù)處理器是一個(gè)能讓你通過預(yù)處理器自己獨(dú)有的語法來生成CSS的程序们衙。
絕大多數(shù)CSS預(yù)處理器會(huì)增加一些原生CSS不具備的特性,例如代碼混合碱呼,嵌套選擇器蒙挑,繼承選擇器等
最流行的CSS預(yù)處理器:
less
sass
stylus
postcss

CSS 動(dòng)畫

https://juejin.cn/post/6844903615920898056#heading-2

animation(動(dòng)畫)
用于設(shè)置動(dòng)畫屬性,是一個(gè)簡寫的屬性愚臀,包含6個(gè)屬性
transition(過渡)
用于設(shè)置元素的樣式過度忆蚀,和animation有著類似的效果,但細(xì)節(jié)上有很大的不同
transform(變形)
用于元素進(jìn)行旋轉(zhuǎn)、縮放馋袜、移動(dòng)(translate)或傾斜
translate(移動(dòng))
translate只是transform的一個(gè)屬性值男旗,即移動(dòng)。

transition 過渡

語法:transition: property duration timing-function delay;
transition-property
設(shè)置過渡效果的 CSS 屬性的名稱
transition-duration
完成過渡效果需要多少秒或毫秒
transition-timing-function
速度效果的速度曲線
transition-delay
定義過渡效果何時(shí)開始

.box {
  height: 100px;
  width: 100px;
  background: green;
  transition: transform 1s ease-in 1s;
}
.box:hover {
  transform: rotate(180deg) scale(.5, .5);
}

transition產(chǎn)生動(dòng)畫的條件是transition設(shè)置的property發(fā)生變化桃焕,這種動(dòng)畫的特點(diǎn)是需要“一個(gè)驅(qū)動(dòng)力去觸發(fā)”剑肯,有著以下幾個(gè)不足:

1.需要事件觸發(fā),所以沒法在網(wǎng)頁加載時(shí)自動(dòng)發(fā)生
2.是一次性的观堂,不能重復(fù)發(fā)生让网,除非一再觸發(fā)
3.只能定義開始狀態(tài)和結(jié)束狀態(tài),不能定義中間狀態(tài)师痕,也就是說只有兩個(gè)狀態(tài)
4.一條transition規(guī)則溃睹,只能定義一個(gè)屬性的變化,不能涉及多個(gè)屬性胰坟。

animation

這個(gè)屬性是transition屬性的擴(kuò)展因篇,彌補(bǔ)了transition的很多不足,我理解為animation是由多個(gè)transition的效果疊加笔横,并且可操作性更強(qiáng)竞滓,能夠做出復(fù)雜酷炫的效果
語法:animation: name duration timing-function delay iteration-count direction play-state fill-mode;
name
用來調(diào)用@keyframes定義好的動(dòng)畫,與@keyframes定義的動(dòng)畫名稱一致
duration
指定元素播放動(dòng)畫所持續(xù)的時(shí)間
timing-function
規(guī)定速度效果的速度曲線吹缔,是針對(duì)每一個(gè)小動(dòng)畫所在時(shí)間范圍的變換速率
delay
定義在瀏覽器開始執(zhí)行動(dòng)畫之前等待的時(shí)間商佑,值整個(gè)animation執(zhí)行之前等待的時(shí)間
iteration-count
定義動(dòng)畫的播放次數(shù),可選具體次數(shù)或者無限(infinite)
direction
設(shè)置動(dòng)畫播放方向:normal(按時(shí)間軸順序),reverse(時(shí)間軸反方向運(yùn)行),alternate(輪流厢塘,即來回往復(fù)進(jìn)行),alternate-reverse(動(dòng)畫先反運(yùn)行再正方向運(yùn)行茶没,并持續(xù)交替運(yùn)行)
play-state
控制元素動(dòng)畫的播放狀態(tài),通過此來控制動(dòng)畫的暫停和繼續(xù)晚碾,兩個(gè)值:running(繼續(xù))抓半,paused(暫停)
fill-mode
控制動(dòng)畫結(jié)束后,元素的樣式格嘁,有四個(gè)值:none(回到動(dòng)畫沒開始時(shí)的狀態(tài))笛求,forwards(動(dòng)畫結(jié)束后動(dòng)畫停留在結(jié)束狀態(tài)),backwords(動(dòng)畫回到第一幀的狀態(tài))糕簿,both(根據(jù)animation-direction輪流應(yīng)用forwards和backwards規(guī)則)涣易,注意與iteration-count不要沖突(動(dòng)畫執(zhí)行無限次)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冶伞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌步氏,老刑警劉巖响禽,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡芋类,警方通過查閱死者的電腦和手機(jī)隆嗅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侯繁,“玉大人胖喳,你說我怎么就攤上這事≈梗” “怎么了丽焊?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咕别。 經(jīng)常有香客問我技健,道長,這世上最難降的妖魔是什么惰拱? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任雌贱,我火速辦了婚禮,結(jié)果婚禮上偿短,老公的妹妹穿的比我還像新娘欣孤。我一直安慰自己,他們只是感情好昔逗,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布降传。 她就那樣靜靜地躺著,像睡著了一般纤子。 火紅的嫁衣襯著肌膚如雪搬瑰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天控硼,我揣著相機(jī)與錄音泽论,去河邊找鬼。 笑死卡乾,一個(gè)胖子當(dāng)著我的面吹牛翼悴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幔妨,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼鹦赎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了误堡?” 一聲冷哼從身側(cè)響起古话,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锁施,沒想到半個(gè)月后陪踩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杖们,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年肩狂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摘完。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡傻谁,死狀恐怖孝治,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情审磁,我是刑警寧澤谈飒,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站力图,受9級(jí)特大地震影響步绸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吃媒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一瓤介、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赘那,春花似錦刑桑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拱礁,卻和暖如春琢锋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呢灶。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工吴超, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸯乃。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓鲸阻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缨睡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸟悴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1.html 實(shí)體 網(wǎng)頁中需要些特殊符號(hào),使用html中的實(shí)體奖年,語法為: &實(shí)體名字细诸; 例如: &gt; ...
    ZZH_ZZH閱讀 413評(píng)論 0 0
  • 頭部開始 logo部分 導(dǎo)航nav 搜索search 用戶user banner橫幅圖片開始Start banne...
    辛敏滔閱讀 764評(píng)論 0 0
  • 《爛俗前端》[https://juejin.cn/column/7017997240325111845]是一部以前...
    島民小強(qiáng)閱讀 1,037評(píng)論 0 1
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,761評(píng)論 1 92
  • 課程目標(biāo): 學(xué)會(huì)使用CSS選擇器熟記CSS樣式和外觀屬性熟練掌握CSS各種選擇器熟練掌握CSS各種選擇器熟練掌握C...
    前端陳陳陳閱讀 278評(píng)論 0 1