CSS3總結一:border(邊框)


 一、Border-CSS1的屬性

在CSS1中就定義了邊框樣式屬性:border設置全部或指定具體邊框樣式。具體包括指定樣式:寬度:width、樣式:style(none、heidden、solid、groove等)、顏色:color。可以通過border統一設置邊框樣式,也可以通過border-left:width style color獨立設置邊框樣式。這部分相對比較簡單,使用四個div示例及樣式展示一下基本設置方法:

solid
dotted
bouble
border-bottom
 
1 .solid{border:1px solid #ee9900;}
2 .dotted{border:1px botted #993366;}
3 .bouble{border:3px boudle #000;}/*注意雙實線實質上是將邊框寬度分成約等於的三等份,取整值,比如如果設置寬度為2px,兩條邊框各取1px,就沒有空隙了*/
4 .borderBottom{border-bottom:3px solid red;}

 二、Border-CSS3的屬性

 2.1-邊框半徑(圓角邊框):border-radius

 

邊框半徑border-radius是CSS3的一個邊框屬性,也是兼容性不錯的一個屬性,先來看看基本及幾個使用示例:

radius1
radius2
radius3
 
1 .radius1{border-radius:10px;}
2 .radius2{border-radius:10px 15px 20px 25px;}
3 //radius3第一種寫法
4 .radius3{border-radius:10px 20px;}
5 //radius3第二種寫法
6 .radius3{border-top-left-radius:10px;border-top-right-radius:20px;border-bottom-right-radius:10px;border-bottom-left:20px;}

 上面三個是非常簡單的border-radius應用,就不過多的解釋了,接着來看下面這幾個特殊的示例:

radius4
radius5
radius6
radius7
radius8
radius9
radius10
radius11
radius12
 

 到這里是不是眼花繚亂了,如果沒有眼花繚亂的大神請繞路啦,下面是實現每個形狀的css代碼:

 1 //沒有設置寬高的都默認為100*100
 2 .radius4{border-top-left-radius:100%;}
 3 .radius5{border-top-left-radius:50px 50px;border-top-raight:50px 50px; width:100px; height:50px;}
 4 .radius6{border-radius:50%;}
 5 .radius7{border-top-left-radius:50px 100px;}
 6 .radius8{border-top-left-radius:50px 100px; border-top-right-radius:50px 100px;}
 7 .radius9{border-radius:50%; width:100px; height:50px;}
 8 .radius10{border-top-left-radius:50% 100%; border-bottom-right-radius:50% 100%; widht:100px; height:50px;}
 9 .radius11{border-top-raight-radius:100%; border-bottom-left-radius:100%; width:100px; height:50px;}
10 .radius11{border-top-raight-radius:50%; border-bottom-left-radius:100%; width:100px; height:50%;}

關於border-radius需要注意的是在設置具體的方向值時,需要將top或者bottom設置在left或者raight前面,這個問題我不確定時瀏覽器問題還是語法要求,在我印象中好像誰先誰后不會有影響,但是我在chrome和firefox都必須按照前后順序編寫代碼,不然無法產生效果。然后在回頭來看radius2的示例,這個示例還有一種表示方法:

.radius2{border-radius: 10px 20px 30px 40px/ 10px 20px 30px 40px;}

 2.2-元素陰影:box-shadow

 

一開始在手冊中看到box-shadow在border~background屬性列表下的時候我有點懵,不是邊框和背景屬性嗎?怎么把盒子屬性放到這里呢?是不是手冊搞錯了?后來仔細想想,盒子屬性應該可以分為兩大類:盒子自身樣式屬性和盒子內部元素關系樣式屬性。如果這樣來分其實邊框背景和陰影本身就都是盒子自身樣式屬性了。雖然着對編程沒有任何影響,但是對於記憶和理解知識個人覺得還是很有幫助。

關於box-shadow先從外陰影入手逐一分析每個屬性值的含義,先來看下面這幾個示例:

box-shadow1
box-shadow2
box-shadow3
box-shadow4
box-shadow5
box-shadow6
box-shadow7
box-shadow8
box-shadow9
 
1 .box-shadow1{box-shasow:10px 10px 0px 0px #00CD66;}
2 .box-shadow2{box-shasow:10px 10px 0px 5px #00CD66;}
3 .box-shadow3{box-shasow:10px 10px 5px 5px #00CD66;}
4 .box-shadow4{box-shasow:10px -5px 0px 0px #00CD66;}
5 .box-shadow5{box-shasow:10px -5px 0px -5px #00CD66;}

box-shadow的屬性值:橫向移動(x-offtset)、縱向移動(y-offset)、模糊寬度(blur)、擴大寬度(spread)、陰影顏色(color)。

陰影位置(偏移):x-offset、y-offset負責定義陰影位置,像素值可以是負數。以元素的中心為原點,向x、y方向做正負偏移。

陰影大小(縮放):spread負責定義陰影大小,大小縮放是同時在四個方向加上設定像素值。

陰影模糊(高斯):blur負責定義陰影的模糊值,模糊本質上就是一個過度效果,沿着元素邊緣向兩個方向過渡,但是由於陰影有和模型的疊層效果,看上去,外陰影模糊就是向外擴散設定的陰影距離,內陰影模糊就是向內產生設定的陰影模糊過渡距離。所以接着來看這幾個內陰影(inset)的示例:

1 .box-shadow6{box-shadow:inset 0px 0px 0px 20px #00CD66;}
2 .box-shadow7{box-shadow:inset 0px 0px 20px 20px #00CD66;}
3 .box-shadow8{box-shadow:inset 10px 10px 0px 0px #00CD66;}
4 .box-shadow9{box-shadow:inset -10px -10px 0px 10px #00CD66;}

內陰影可以說是從元素邊緣產生,以陰影偏移或者陰影大小設定的值向元素內容上覆蓋陰影。到這里關於元素陰影box-shadow的基本用法全部介紹完畢了,但是並沒結束。請看下面這幾個示例:

 
 
 

 上面的示例是用css3的box-shadow和border-radius做的一個星球沖撞圖,上面這個不是截圖,而是用代碼實現的,這里有一個全頁面展示的代碼:

 1 <style>
 2     *{
 3         padding: 0;
 4         margin: 0;
 5     }
 6     :root,
 7     body{
 8         width: 100%;
 9         height: 100%;
10         background-color: #000;
11     }
12     .div1{
13         position: absolute;
14         width: 200px;
15         height: 200px;
16         left: calc(50% - 100px);
17         top: calc(50% - 100px);
18         border-radius: 50%;
19         box-shadow: inset 10px 0px 50px 0px red,
20                     inset -10px 0px 50px 0px blue,/*第一階段*/
21                     -10px 0px 20px 0px red,
22                     -13px 0px 20px 0px blue,
23                     -23px 0px 20px -10px red,
24                     -33px 0px 20px -20px blue,
25                     -43px 0px 30px -30px red,
26                     -53px 0px 40px -40px blue,
27                     -63px 0px 50px -50px red,
28                     -73px 0px 60px -60px blue,
29                     -83px 0px 70px -70px red,
30                     -93px 0px 80px -80px blue,
31                     -100px 0px 80px -90px red,
32                     -100px 0px 80px -90px blue;
33     }
34     .div2{
35         position: absolute;
36         width: 150px;
37         height: 150px;
38         left: calc(50% + 150px);
39         top: calc(50% - 50px);
40         border-radius: 50%;
41         box-shadow: inset 10px 0px 50px 0px red,
42                     inset -10px 0px 50px 0px blue,/*第一階段*/
43                     10px 0px 20px 0px blue,
44                     13px 0px 20px 0px red,
45                     23px 0px 20px -10px blue,
46                     33px 0px 20px -20px red,
47                     43px 0px 30px -30px blue,
48                     53px 0px 40px -40px red,
49                     63px 0px 50px -50px blue,
50                     73px 0px 60px -60px red,
51                     83px 0px 70px -70px blue,
52                     93px 0px 80px -80px red,
53                     100px 0px 80px -90px blue,
54                     100px 0px 80px -90px red;
55     }
56 </style>
57 </head>
58 <body>
59 <div class="div1"></div>
60 <div class="div2"></div>
61 </body>
星球沖撞圖全部代碼

看起來這個星球沖撞好像很炫酷,實際上代碼實現難度比接下來這個示例要簡單的太多了,這個示例就是太陽,附贈一個月亮:

 
 
 
 

這里的太陽和月亮雖然也是使用代碼實現,但是和我提供的代碼在一些數值上會有一些差別,這是因為陰影需要根據具體的適應場景來調整視覺效果,特別是月亮在博客編輯器中不好使用偽元素實現,采用的是兩個div實現的,下面提供的代碼采用的是偽元素實現的。

 1     <style>
 2         *{
 3             margin: 0;
 4             padding: 0;
 5         }
 6         .root,
 7         body{
 8             width: 100%;
 9             height: 100%;
10             background-color: #000;
11 
12         }
13         .sun{
14             width: 10px;
15             height: 10px;
16             position: absolute;
17             left:calc(50% - 5px);
18             top:calc(50% - 5px);
19             background-color: #fff;
20             border-radius: 50%;
21             box-shadow: 0px 0px 25px 25px #fff,/*關鍵的一行*/
22                         0px 0px 100px 50px #ff0;
23         }
24     </style>
25 </head>
26 <body>
27     <div class="sun"></div>
28 </body>
實現太陽效果的代碼
 1     <style>
 2         *{
 3             margin: 0;
 4             padding: 0;
 5         }
 6         :root,
 7         body{
 8             width: 100px;
 9             height: 100px;
10             background-color: #000;
11         }
12         .moon{
13             width: 100px;
14             height: 100px;
15             position: absolute;
16             left: calc(50% - 50px);
17             top: calc(50% - 50px);
18             border-radius: 50%;
19             background-color: #fff;
20             box-shadow: 0px 0px 5px 0px #fff;
21         }
22         .moon::after{
23             content: "";
24             width: 100px;
25             height: 100px;
26             position: absolute;
27             left: calc(50% - 75px);
28             top: calc(50% - 60px);
29             border-radius: 50%;
30             background-color: #000;
31         }
32     </style>
33 </head>
34 <body>
35     <div class="moon"></div>
36 </body>
實現月亮效果的代碼

 2.1-邊框圖片:border-image

 

從兼容性來看,border-image的兼容性不是很好,但因為都有兼容的趨勢,所以學習就是有必要的了。還是和前面一樣,先來一些基本應用的示例:

border-image:
border-image-source | [border-image-slice,border-image-width,border-image-outset] | border-image-repeat
  • border-image-source:引入邊框圖片或者創建漸變色來確定圖像。(可以取值“none”表示無圖片。)
  • border-image-slice:切割背景圖片,可以采用數值(number)和百分比(percentage)兩種取值方式。
  • border-image-width:設置邊框圖像所占邊框寬度,可以設置像素值、數值(根據邊框寬度按倍計算)、百分比(根據slice的取值計算)、auto(同等與100%)。
  • border-image-outset:設置邊框圖片向外(四個方向)延申(注意知識純粹延申,不會改變邊框圖片的寬度)。
  • border-image-repeat:背景填充方式。拉伸(stretch)(默認值)、重復平鋪(repeat)、當圖片不能整數平鋪時適當縮放(round)、當圖片不能整數平鋪時留白space。

使用下面這張圖片以及后面的示例來描述border-image的使用(圖片的實際像素是300*300px):

下面是應用border-image設置不同的屬性值組合出的樣式:(在富文本編輯器中實現不了border-image,一下采用等比例截圖作為參考。)

50px²
 

 實現demo1、demo2、demo3的代碼:

 /* demo1 */
 div{
     width: 50px;
     height: 50px;
     font-size: 8px;
     position: absolute;
     background-color: blue;
     top: calc(50% - 50px);
     left: calc(50% - 50px);
     border: 50px solid #fff;
     text-align: center;
     line-height: 50px;
     border-image-source: url('這里是圖片的路徑');
 
     border-image-slice: 100;
     border-image-width: 1;
 }
 /* demo2 */
 div{
     /* 以上代碼同demo1 */
     border-image-slice: 150;
     border-image-width: 1;
 }
 /* demo3 */
 div{
     /* 以上代碼同demo1 */
     border-image-slice: 140;
     border-image-width: 1;
}

 

從demo1可看到border-image-slice:100均勻的將像素300px²的圖片切割成了9等份(實際上slice的數值就是同等於像素值),然后通過border-image-width:1表示邊框背景圖片的寬度等於邊框寬度(即50px),原本像素100px²的被縮放成50px²的背景塊填充到demo1邊框上。

再通過下圖來看看demo1的slice切割模型圖:

 通過demo1的slice切割模型,來思考demo2的slice切割模型,從下面一個手畫草圖可以看到縱橫向都只有一條切割線了,其實不然,因為將slice的值設置為150導致橫向的top、bottom兩條切割線重疊,這兩條線重疊了也就表示重點沒有多余的莫部分,這里可以看作是只將圖片切割成了四等分,但由於需要8個填充塊,所以四條邊框的中間部分就出現了空白部分。

demo3的模型圖就不畫了,從代碼的角度來分析,5\6\7\8這四塊切割部分的像素是寬10(這里可以看到前面所描述的9等份並不嚴謹,因為實際上中間快起作用的切割線只有同一個方向上的兩條,從實際的切割效果來看demo3的的5切割塊寬為10px當高並不是10px),但由於border-image-repeat默認值stretch的拉升效果,出現了填充。

最后關於border-image-width要注意,取值如果是像素值的畫,就表示邊框背景圖片填充的寬度,但不會切割背景圖片,而是將slice切割好的圖片壓縮填充到設定的寬度內。下圖是在demo1的基礎上將border-image-width的值設置為10px的顯示結果。

 

還有slice的值的設置方式,在demo代碼中都是簡寫的,實際上三個demo的slice的值可以寫成一下形式:

border-image-slice: 100 100 100 100;
border-image-slice: 150 150 150 150;
border-image-slice: 150 140 140 140;
/* left right top bottom */
/* 從左向有計算left切割線位置 從右向左計算right切割線的位置 從上到下計算top切割線的位置 從下到上計算bottom切割線的位置 * /

關於border的css屬性就全部介紹完了,常被應用到的屬性還是前面兩個border-radius和box-shadow,而border-image不是很常間的應用屬性,但是由於主流瀏覽器最新版本都已經支持,所以有必要弄明白了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM