WEB基礎之:CSS浮動和嵌入形狀
浮動和嵌入形狀 Floating and Shapes
1. 浮動Floating
float
屬性允許浮動任何元素,如:影象、段落、列表。
屬性值 | 描述 |
---|---|
left | 元素向左浮動。 |
right | 元素向右浮動。 |
none | 預設值。元素不浮動,並會顯示在其在文字中出現的位置。 |
inherit | 規定應該從父元素繼承 float 屬性的值。 |
p {float: right; width: 15em; margin: 0 1em 1em; padding: 0.25em; border: 1px solid;}
img {float: left; width: 160px; margin: 25px;}
1.1 控制浮動元素擺放的規則
- 浮動元素的左(或右)外邊界不能超出其包含塊的左(或右)內邊界。
- 防止元素彼此覆蓋,浮動元素的左(或右)外邊界必須是源文件中之前出現的左浮動(右浮動)元素的右(或左)外邊界,除非後出現浮動元素的頂端在先出現浮動元素的底端下面。
- 左浮動元素的右外邊界不會在其右邊右浮動元素的左外邊界的右邊。右浮動元素的左外邊界不會在其左邊左浮動元素的右外邊界的左邊。這條規則避免浮動的元素重疊。假如網頁正文的寬度是500畫素,內容裡有兩個影象,都是300畫素寬。第一個影象向左浮動,第二個影象向右浮動。根據這條規則,第二個影象不會與第一個影象出現100畫素寬的重疊區域。事實上,第二個影象的頂邊將正好在左浮動影象的底邊以下。
- 一個浮動元素的頂端不能比其父元素的內頂端更高。
- 浮動元素的頂端不能比之前所有浮動元素或塊級元素的頂端更高。
- 如果源文件中一個浮動元素之前出現另一個元素,浮動元素的頂端不能比包含該元素所生成框的任何行框的頂端更高。
- 浮動元素不能超出其包含元素的邊界。左(或右)浮動元素的左(或右)邊有另一個浮動元素,前者的右外邊界不能在其包含塊的右(或左)邊界的右(或左)邊。如果沒有足夠的空間,浮動元素會被擠到一個新的“行上”
- 浮動元素必須儘可能高地放置。即滿足其他約束條件的前提下,浮動得儘可能高。
- 左浮動元素必須向左儘可能遠,右浮動元素則必須向右儘可能遠。
1.2 應用行為Applied Behavior
-
浮動規則只處理了浮動元素和其父元素的左、右和上邊界;沒有涉及下邊界。
-
浮動元素會延伸從而包含其所有後代浮動元素。
-
負外邊距可能導致浮動元素移到其父元素的外面。當浮動元素比其父元素更寬,浮動元素會超出其父元素的左右內邊界,從而儘可能正確的顯示。
-
對於行內元素:
- 行內框與一個浮動元素重疊時,其邊框、背景和內容都在該浮動元素之上顯示。 - 塊框與一個浮動元素重疊時,其邊框和背景在該浮動元素之下顯示,而內容在浮動元素之上顯示。
1.3 清除Clearing
clear 屬性規定元素的哪一側不允許存在浮動元素。
屬性值 | 描述 |
---|---|
left | 在左側不允許浮動元素。 |
right | 在右側不允許浮動元素。 |
both | 在左右兩側均不允許浮動元素。 |
top | 在頂部不允許浮動元素。 |
bottom | 在底部不允許浮動元素。 |
none | 預設值。允許浮動元素出現在兩側。 |
inherit | 規定應該從父元素繼承 clear 屬性的值。 |
clear: both;
注:大多數情況下,無法知道一個元素周圍多大範圍內不允許有浮動元素,要確保一個設定clear屬性的元素的頂端與一個浮動元素的底端之間有一定空間。可以為浮動元素本身設定一個下外邊距。如:
img {
float: left; margin: 0 0;
}
2. 嵌入形狀Shapes
2.1 shape-outside屬性
shape-outside
屬性指定使用下面列表的值來定義浮動元素的浮動區域。這個浮動區域決定了行內內容(浮動元素)所包裹的形狀。
屬性值 | 描述 |
---|---|
none | 浮動區域不受影響,行內元素以預設的方式包裹著該元素的margin box。 |
shape-box | 根據浮動元素的邊緣(通過 CSS box model 來定義)形狀計算出浮動的區域。可能是 margin-box, border-box, padding-box, 或者 content-box。這個形狀包括了由 border-radius 屬性製造出來的弧度(與 background-clip 的表現類似)。 |
basic-shape | 基於 inset(), circle(), ellipse(), 或者 polygon()其中一個創造出來的形狀計算出浮動區域。如果同時存在<shape-box> ,那麼會為 <basic-shape> 方法定義一個參考盒,這個參考盒預設為 margin-box 。 |
image | 提取並且計算指定<image> 的alpha通道得出浮動區域(譯者:即根據圖片的非透明區域進行包裹)。就跟通過 shape-image-threshold來定義一樣。 |
2.1.1 shape-box的型別
-
margin-box
定義一個由外邊距的外邊緣封閉形成的形狀。這個形狀的角的半徑由相應的border-radius 和margin 的值決定。如果 border-radius / margin 的比率大於等於 1 , 那麼這個 margin box 的角的弧度就是 border-radius + margin ;如果比率小於 1,那麼這個 margin box 的角的弧度就是 border-radius + (margin * (1 + (ratio-1)^3)) 。 -
border-box
定義一個由邊界的外邊緣封閉形成的形狀。 這個形狀遵循正常的邊界外部圓角的形成規則。 -
padding-box
定義一個由內邊距的外邊緣封閉形成的形狀。這個形狀遵循正常的邊界內部圓角的形成規則。 -
content-box
定義一個由內容區域的外邊緣封閉形成的形狀(即:被padding包裹的區域,在chrome控制檯中的盒子模型圖中的藍色區域。)。每一個角的弧度取 0 或 border-radius - border-width - padding 中的較大值。
2.1.2 basic-shape的型別
-
inset() :定義一個矩形範圍。
inset( <shape-arg>{1,4} [round <border-radius>]? )
四個引數遵循以下原則:
-
top right bottom left`。這些值圍著元素從上(top)順時針旋轉,如果想呈現你想要的效果,就必須正確安排值的順序。
-
值複製:當其中一個值預設的時候,將會按照以下規則:如果為外邊距指定3個值,則第4個值將會從第2個複製得到。如果給定兩個值,第4個值會從第2個值複製得到,第3個值會從第1個值得到。
-
-
circle():定義一個圓形範圍。
百分數的值等於
sqrt(width^2+height^2)/sqrt(2)
.circle( [<shape-radius>]? [at <position>]? )
-
ellipse(): 定義一個橢圓範圍。
ellipse( [<shape-radius>{2}]? [at <position>]? )
-
polygon():定義一個多邊形範圍。
path( [<fill-rule>,]? <string>)
2.1.3 語法
/* 關鍵字值 */
shape-outside: none;
shape-outside: margin-box;
shape-outside: content-box;
shape-outside: border-box;
shape-outside: padding-box;
/* 函式值 */
shape-outside: circle();
shape-outside: ellipse();
shape-outside: inset(10px 10px 10px 10px);
shape-outside: polygon(10px 10px, 20px 20px, 30px 30px);
/* <url> 值 */
shape-outside: url(image.png);
/* 漸變值 */
shape-outside: linear-gradient(45deg, rgba(255, 255, 255, 0) 150px, red 150px);
/* 全域性值 */
shape-outside: initial;
shape-outside: inherit;
shape-outside: unset;
舉例:
img.plane {
float: left;
shape-outside: url(images/paperplane.png);
height: 160px;
}
<img class="plane" src="images/paperplane.png" alt="papaer plane">
2.2 shape-margin
shape-margin
用於設定由shape-outside
建立的CSS形狀的外邊距。
shape-margin: 0;
shape-margin: 20px;
shape-margin: 1em;
shape-margin: 5%;