1)flex-direction 屬性:
flex-direction 屬性指定了彈性子元素在父容器中的排列方向和順序。
其語法格式為:
flex-direction: row | row-reverse | column | column-reverse;
其屬性值的意義如下所示:
屬性值 | 描述 |
row | 橫向從左到右排列(左對齊),默認的排列方式。 |
row-reverse | 反轉橫向排列(右對齊),從后往前排,最后一項排在最前面。 |
column | 縱向排列 |
column-reverse | 反轉縱向排列,從后往前排,最后一項排在最上面。 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.content{
width:200px;
height:200px;
border:1px solid #C3C3C3;
display:flex;
}
.content2{
flex-direction: row-reverse;/*行對齊,主軸起點與終點相反*/
}
.content3{
flex-direction: column;/*列對齊,主軸起點與終點相同*/
}
.content4{
flex-direction: column-reverse;/*列對齊,主軸起點與終點相反*/
}
.box{
width:50px;
height:50px;
color:black;
}
</style>
</head>
<body>
<div class="content content1">
<div class="box" style="background-color:#FFE5B9;">A</div>
<div class="box" style="background-color:#EFF8FF;">B</div>
<div class="box" style="background-color:#C9CBFF;">C</div>
</div>
<div class="content content2">
<div class="box" style="background-color:#FFE5B9;">A</div>
<div class="box" style="background-color:#EFF8FF;">B</div>
<div class="box" style="background-color:#C9CBFF;">C</div>
</div>
<div class="content content3">
<div class="box" style="background-color:#FFE5B9;">A</div>
<div class="box" style="background-color:#EFF8FF;">B</div>
<div class="box" style="background-color:#C9CBFF;">C</div>
</div>
<div class="content content4">
<div class="box" style="background-color:#FFE5B9;">A</div>
<div class="box" style="background-color:#EFF8FF;">B</div>
<div class="box" style="background-color:#C9CBFF;">C</div>
</div>
</body>
</html>
flex-direction指定了彈性子元素在父容器中的排列方向和順序
(2)flex-wrap 屬性:
flex-wrap 屬性用于指定彈性盒子的子元素換行方式。
其語法格式為:
flex-wrap: nowrap|wrap|wrap-reverse|initial|inherit;
其屬性值的意義如下所示:
屬性值 | 描述 |
nowrap | 默認, 彈性容器為單行。該情況下彈性子項可能會溢出容器。 |
wrap | 彈性容器為多行。該情況下彈性子項溢出的部分會被放置到新行,子項內部會發生斷行。 |
wrap-reverse | 反轉 wrap 排列。 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
div {
width: 100px;
height: 100px;
color: black;
}
#content {
width: 240px;
height: 300px;
background-color: white;
display: flex;
flex-wrap: wrap-reverse;
}
.item1 {
background-color: #ffe5b9;
}
.item2 {
background-color: #eff8ff;
}
.item3 {
background-color: #c9cbff;
}
</style>
</head>
<body>
<div id="content">
<div class="item1">1</div>
<div class="item2">2</div>
<div class="item3">3</div>
</div>
</body>
</html>
flex-wrap指定彈性盒子子元素換行方式
(3)align-items 屬性:
align-items 屬性是用來設置或檢索彈性盒子元素在側軸(縱軸)方向上的對齊方式。
其語法格式為:
align-items: flex-start | flex-end | center | baseline | stretch;
其屬性值的意義如下所示:
屬性值 | 描述 |
flex-start | 彈性盒子元素的側軸(縱軸)起始位置的邊界緊靠住該行的側軸起始邊界。 |
flex-end | 彈性盒子元素的側軸(縱軸)起始位置的邊界緊靠住該行的側軸結束邊界。 |
center | 彈性盒子元素在該行的側軸(縱軸)上居中放置。 |
baseline | 如彈性盒子元素的行內軸與側軸為同一條,則該值與 flex-start 等效。其它情況下,該值將參與基線對齊。 |
stretch | 如果指定側軸大小的屬性值為 auto,則其值會使項目的邊距盒的尺寸盡可能接近所在行的尺寸,但同時會遵照 min/max-width/height 屬性的限制。 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
div {
width: 100px;
color: black;
}
#content {
width: 240px;
height: 300px;
background-color: white;
display: flex;
align-items: stretch;
}
.item1 {
background-color: #ffe5b9;
}
.item2 {
background-color: #eff8ff;
}
.item3 {
background-color: #c9cbff;
}
</style>
</head>
<body>
<div id="content">
<div class="item1">1</div>
<div class="item2">2</div>
<div class="item3">3</div>
</div>
</body>
</html>
flex-items設置或檢索彈性盒子元素在軸上對齊方式
(4)align-content 屬性:
align-content 控制多行對齊方式,若只有一行則不起作用。
其語法格式為:
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
其屬性值的意義為:
屬性值 | 描述 |
stretch | 默認。各行將會伸展以占用剩余的空間。 |
flex-start | 各行向彈性盒容器的起始位置堆疊。 |
flex-end | 各行向彈性盒容器的結束位置堆疊。 |
center | 各行向彈性盒容器的中間位置堆疊。 |
space-between | 各行在彈性盒容器中平均分布。 |
space-around | 各行在彈性盒容器中平均分布,兩端保留子元素與子元素之間間距大小的一半。 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
div {
width: 60px;
color: black;
}
#content {
width: 300px;
height: 300px;
background-color: antiquewhite;
display: flex;
flex-wrap: wrap;
align-content: stretch;
}
.left {
background-color: gray;
}
.center {
background-color: silver;
}
.right {
background-color: darkgray;
}
</style>
</head>
<body>
<div id="content">
<div class="left">div1塊</div>
<div class="center">div2塊</div>
<div class="right">div3塊</div>
<div class="left">div4塊</div>
<div class="center">div5塊</div>
<div class="right">div6塊</div>
<div class="left">div7塊</div>
<div class="center">div8塊</div>
<div class="right">div9塊</div>
<div class="left">div10塊</div>
<div class="center">div11塊</div>
<div class="right">div12塊</div>
</div>
</body>
</html>
...
#content {
width: 300px;
height: 300px;
background-color: antiquewhite;
display: flex;
flex-wrap: wrap;
align-content: flex-start;/*各行向彈性盒容器的起始位置堆疊*/
}
...
...
#content {
width: 300px;
height: 300px;
background-color: antiquewhite;
display: flex;
flex-wrap: wrap;
align-content: flex-end;/*各行向彈性盒容器的結束位置堆疊*/
}
...
...
#content {
width: 300px;
height: 300px;
background-color: antiquewhite;
display: flex;
flex-wrap: wrap;
align-content: center;/*各行向彈性盒容器的中間位置堆疊*/
}
...
...
#content {
width: 300px;
height: 300px;
background-color: antiquewhite;
display: flex;
flex-wrap: wrap;
align-content: space-between;/*各行在彈性盒容器中平均分布*/
}
...
#content {
width: 300px;
height: 300px;
background-color: antiquewhite;
display: flex;
flex-wrap: wrap;
align-content: space-around;/*各行在彈性盒容器中平均分布,兩端保留子元素與子元素之間間距大小的一半*/
}
align-content控制多行對齊方式
完成代碼,看到如下效果:
先開篇之前先提個問題:
為什么Flex box跟Grid box的是以start、end為排列規則,而不是常規的top 、right 、bottom 跟left?
先不要急著往下翻,大家先思考一下。
這個問題的答案,魚頭會在文章中給出,歡迎大家帶著這個問題往下翻閱,如果已經知道答案,也可以看看跟大家所知道的答案是否一致。
2017年5月18日,W3C的 CSS工作組(CSS Working Group) 發布了 CSS邏輯屬性和值(CSS Logical Properties and Values Level 1) 的首份工作草案(First Public Working Draft)。不同的書寫模式(writing mode)中,可以抽取出共性的抽象概念(如開始位置,或行),這些邏輯抽象概念需要在不同書寫模式下映射到左或右、上或下等物理的概念上。一些CSS布局可能依賴這些共性的邏輯概念。該 CSS 模塊給出了用于通過邏輯方式(而不是基于物理坐標、書寫方向和維映射等)控制布局的邏輯屬性和取值(logical properties and values)。這個模塊來源于CSS21中關于邏輯屬性和值的特性。
對于前端來說,我們一直習慣于使用top 、 right 、 bottom、 left來定義我們的HTML元素,這跟我們物理上的概念是一致的。但是對于CSS這個原本是為了服務于圖文展示才誕生的語言來說,其實是不匹配的,為什么這么說?
writing-mode:定義了文本水平或垂直排布以及在塊級元素中文本的行進方向。
writing-mode一共有以下5個改變HTML文本書寫規則的值(還有幾個是用在SVG上的,本文不予討論):
writing-mode: horizontal-tb 定義了內容從左到右水平流動,從上到下垂直流動。下一條水平線位于上一條線下方。
writing-mode: vertical-rl 定義了內容從上到下垂直流動,從右到左水平流動。下一條垂直線位于上一行的左側。
writing-mode: vertical-lr定義了內容從上到下垂直流動,從左到右水平流動。下一條垂直線位于上一行的右側。
writing-mode: sideways-rl定義了內容從上到下垂直流動,所有字形,甚至是垂直腳本中的字形,都設置在右側。
writing-mode: sideways-lr內容從上到下垂直流動,所有字形,甚至是垂直腳本中的字形,都設置在左側。
源碼如下:
.wm-htb {
writing-mode: horizontal-tb;
}
.wm-vrl {
writing-mode: vertical-rl;
}
.wm-vlr {
writing-mode: vertical-lr;
}
.wm-srl {
writing-mode: sideways-rl;
}
.wm-slr {
writing-mode: sideways-lr;
}
.text-content {
width: 200px;
padding: 20px;
border: 1px solid;
display: inline-block;
vertical-align: top;
padding-right: 100px;
}
<div class="text-content wm-htb">writing-mode: horizontal-tb;</div>
<div class="text-content wm-vrl">writing-mode: vertical-rl;</div>
<div class="text-content wm-vlr">writing-mode: vertical-lr;</div>
<div class="text-content wm-srl">writing-mode: sideways-rl;</div>
<div class="text-content wm-slr">writing-mode: sideways-lr;</div>
圖示如下:
從上圖可以發現,當我們設置了padding-right: 100px;的時候,不同的書寫規則,展示效果是不一樣的。
我自己是一名從事了多年開發的web前端老程序員,目前辭職在做自己的web前端私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的web前端學習干貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:前端,即可免費獲取。
在最開始的時候,HTML與CSS只服務于英語國家,但是隨著互聯網的發展,逐漸各個不同書寫規則的國家也開始流行了起來。
我們原來的CSS邏輯屬性是按照物理邏輯,從上(top)、右(right)、下(bottom)、左(left)劃分的。
那么按著這個規則去修改文本屬性時,就會出現上述這種不符合語法規則的狀態。
大概也是基于這個原因,所以W3C發布了新的邏輯屬性與值。
CSS新舊邏輯屬性是完全不同的兩種模型。
我們首先來看看新舊有的邏輯屬性的對比圖示:
左舊右新
通過上圖可以得知新舊邏輯屬性對應關系如下:
舊的邏輯屬性 新的邏輯屬性 margin-top margin-block-start margin-right margin-inline-end margin-bottom margin-block-end margin-left margin-inline-start border-top border-block-start border-right border-inline-end border-bottom border-block-end border-left border-inline-start padding-top padding-block-start padding-right padding-inline-end padding-bottom padding-block-end padding-left padding-inline-start width inline-size height block-size
由上表可以得知,把Y軸方向的屬性都改為了block,X軸方向的屬性都改為了inline。
對于不同語系的國家,書寫順序會可能有很大的差異,意思就是block跟inline的方向不同。例如:
這就意味著舊的邏輯屬性,在某些國家里會變得不合常理。
CSS的定位屬性變化如下:
舊的邏輯屬性 新的邏輯屬性 top inset-block-start bottom inset-block-end left inset-inline-start right inset-inline-end
例子如下:
/* 舊的邏輯屬性 */
.popup{
position:fixed;
top:0;
bottom:0;
left:0;
right:0;
}
/* 新的邏輯屬性 */
.popup{
position:fixed;
inset-block-start:0; /*top - in English*/
inset-block-end:0; /*bottom - in English*/
inset-inline-start:0; /*left - in English*/
inset-inline-end:0; /*right - in English*/
}
/* 新的邏輯屬性支持簡寫 */
.popup{
position:fixed;
inset:0 0 0 0; /*top, right, bottom, left - in English*/
}
浮動float的屬性也改了。
舊的邏輯屬性 新的邏輯屬性 float: left float: inline-start float: right float: inline-end
文本text-align的屬性也改了。
舊的邏輯屬性 新的邏輯屬性 text-align: left text-align: start text-align: right text-align: end
除了writing-mode,還有一個排版屬性就是direction,跟writing-mode類似,不一樣的是writing-mode是控住網頁布局方向的,而direction是控制文本對齊方向的。屬性如下:
默認值,讓文本和其他元素從左到右顯示。
讓文本和其他元素從右到左顯示。
吐槽一下,看到這里的切圖仔們,抓緊 跑路 重構吧,等哪天此屬性正式被啟用,就真的GG了。不過我想應該會立個屬性來選擇性開啟物理屬性還是邏輯屬性,不然這對前端來說將會是一場災難!
當瀏覽器對一個render tree進行渲染時,瀏覽器的渲染引擎就會根據基礎盒模型(CSS basic box model),將所有元素劃分為一個個矩形的盒子,這些盒子的外觀,屬性由CSS來決定。
我們在瀏覽器控制臺輸入如下代碼就可以看到頁面的每一個元素都是由一個矩形來包裹的,這些就是盒子
$$('*').forEach(e=> {
e.style.border='1px solid';
})
圖示如下:
每個盒子都由四個部分組成:
盒子(box) 的內容,顯示標簽內一切的文本,圖案或者別的內容。
盒子(box) 內的填充物,樣式為透明,主要負責擴展盒子內區域大小。
盒子(box) 外部的區域,樣式為透明,負責隔離相鄰的元素。
盒子(box) 的邊界,負責隔離外邊距以及內邊距。
盒子模型一共有三個值:
content-box為標準的盒子模型。盒子的width跟height只包括盒子本身的width與height屬性。
計算法則:
width=width
height=height
border-box為盒子模型可選的屬性之一。盒子的width跟height包括content、padding跟border。這也是當文檔處于 Quirks模式 時Internet Explorer使用的盒模型。
計算法則:
width=width + border + padding
height=height + border + padding
padding-box為非標準屬性,曾經在Firefox中實現過,但是在Firefox 50中被刪除。padding-box的width和height 屬性包括內容和內邊距,但是不包括邊框和外邊距。
圖示:
這里吐槽一下,不知道為何沒有margin-box,雖然并沒有太大意義,當真實現了效果估計也很詭異,但是作為一個強迫癥患者晚期,少了一個屬性總感覺好不舒服。
CSS的視覺格式化模型(visual formatting model) 是根據 基礎盒模型(CSS basic box model) 將 文檔(doucment) 中的元素轉換一個個盒子的實際算法。
官方說法就是:它規定了用戶端在媒介中如何處理文檔樹( document tree )。
每個盒子的布局由以下因素決定:
視覺格式化模型(visual formatting model) 的計算,都取決于一個矩形的邊界,這個矩形,被稱作是 包含塊( containing block ) 。 一般來說,(元素)生成的框會扮演它子孫元素包含塊的角色;我們稱之為:一個(元素的)框為它的子孫節點建造了包含塊。包含塊是一個相對的概念。
例子如下:
<div>
<table>
<tr>
<td>hi</td>
</tr>
</table>
</div>
以上代碼為例,div 和 table 都是包含塊。div 是 table 的包含塊,同時 table 又是 td 的包含塊,不是絕對的。
盒子的生成是 CSS視覺格式化模型 的一部分,用于從文檔元素生成盒子。盒子的類型取決于CSS display 屬性。
一旦形成了盒子,CSS引擎就需要定位它們來完成布局。
定位所使用的規則如下:
作者:大前端世界
鏈接:https://www.jianshu.com/p/3446dd9b22a6
二部分 CSS
第八章 css基礎知識
<div style="position:absolute;top:0px"> <div style="background-color:gray;">background-color:gray</div> <div style="background-color:#F00;">background-color:#F00</div> <div style="background-color:#ffff00;">background-color:#ffff00</div> <div style="background-color:rgb(255,0,255);">background-color:rgb(255,0,255)</div> <div style="background-color:hsl(120,80%,50%);">background-color:hsl(120,80%,50%)</div> <div style="background-color:rgba(255,0,255,0.5);">background-color:rgba(255,0,255,0.5)</div> <div style="background-color:hsla(120,80%,50%,0.5);">background-color:hsla(120,80%,50%,0.5)</div> </div>
<head> <style type="text/css" > p{color:red;} </style> </head>
第九章 css選擇器(上)
第十章 css選擇器(下)
第十一章 背景屬性
第十二章 文字文本屬性
第十三章 盒子模型
補充盒子模型內容
<html> <head> <title>你用的盒子模型是?</title> <script language="javascript" src="jquery.min.js"></script> <script language="javascript"> var sbox=$.boxmodel ? "標準w3c":"ie"; document.write("您的頁面目前支持:"+sbox+"盒子模型"); </script> </head> <body> </body> </html>
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html> <head> <title>你用的盒子模型是標準w3c盒子模型</title> <script language="javascript" src="jquery.min.js"></script> <script language="javascript"> var sbox=$.boxmodel ? "標準w3c":"ie"; document.write("您的頁面目前支持:"+sbox+"盒子模型"); </script> </head> <body> </body> </html>
第十四章 塊元素、行元素與溢出
第十五章 定位
第十六章 框架
<frameset> <frame src=“” /> <frame src=“” /> <frame src=“” /> <noframes> <body>內容</body> </noframes> </frameset>
第十七章 css高級屬性
{ opacity:0.5; filter:alpha(opacity:50);/*0-100*/ -moz-opacity:0.5; /*取值0-1*/-->針對早起版本的火狐兼容問題的解決 }
*請認真填寫需求信息,我們會在24小時內與您取得聯系。