前言

邊框,在界面設計中是挺重要的,它不僅定義了界面元素的物理邊界,還可以影響用户的視覺感知,幫助用户區分不同的界面元素,起到視覺分隔焦點引導裝飾美化保持一致等作用

那麼,在前端開發中,如何實現邊框捏?

看完就會!解鎖CSS的花式邊框!_框圖

是的,只要給你的元素加上這一條樣式,你的元素就擁有了邊框,但是你會發現,這是一個實線邊框,如果我想實現其它邊框呢?只需要修改中間的solid值即可,可選值如:dasheddotteddoublegroove等,可實現如:虛線點線雙實線雕刻等效果邊框

但是,如果有一天,UI跟你説:“我想實現一個花圈邊框”,那怎麼辦呢?

看完就會!解鎖CSS的花式邊框!_縮放_02

UI打一遍? 當然不是

看完就會!解鎖CSS的花式邊框!_圖片資源_03

前端無法實現嗎?當然不是

這時候就要提到一個CSS屬性了(鋪墊這麼多),主角登場—border-image🎉

什麼是border-image

思考一下,如何實現花式邊框?

很容易想到的是用圖片,那怎麼用圖片呢?設為背景圖片?這樣倒是可以實現,但這樣很不靈活,一旦元素與設計發生出入,如比例變化,圖片就會被拉伸,如下

看完就會!解鎖CSS的花式邊框!_縮放_04

同樣的素材和示例,用border-image實現的話,就比較優雅,也不會被拉伸

看完就會!解鎖CSS的花式邊框!_框圖_05

一句話介紹,border-image就是在給定元素邊框區域以規定規則繪製圖像的屬性

屬性拆解

background等屬性類似,borde-image也是一個簡寫屬性,可細分為以下5個子屬性

border-image-source:決定邊框用什麼圖

border-image-slice:決定圖片怎麼切割,採用“九宮格”原理

border-image-width:決定邊框寬度(或者説厚度)

border-image-outset:決定是否往外擴展(即超出邊框盒)或向外擴展的大小

border-image-repeat:決定邊框填充方式,如拉伸、平鋪還是縮放

通過對這5個子屬性賦值,從而確定一張圖片將如何繪製在邊框區域內

border-image-source

該屬性用於指定將要繪製在邊框區域的圖片資源

可接受none或CSS合法的圖片引用,如url()或漸變

看完就會!解鎖CSS的花式邊框!_縮放_06

如果沒有設置border-image-source或圖片加載失敗,則會渲染border-style定義的樣式

border-image-slice

該屬性可以説是border-image中最核心的屬性了,基本語法如下:

看完就會!解鎖CSS的花式邊框!_圖片資源_07

其合法的值可以為數字(不帶單位)或百分比

  • • 當值為數字時,如果圖片資源為位圖,則表示像素點數量(即單位為像素);如果圖片資源為矢量圖,則由矢量圖的元素大小決定(如SVG的width、height屬性)
  • • 當值為百分比時,則表示相對於圖片自身寬高的百分比

它的作用就是規定如何切割圖像資源,將其繪製到邊框區域

其通過4條切片線,將圖像分割為9個區域:四個角、四個邊以及中心區域,大致如下:

看完就會!解鎖CSS的花式邊框!_圖片資源_08

如上圖所示,圖片會被分為以上9個區域,屬性則通過指定toprightbottomleft4個關鍵值來確認每個區域的大小,然後將各個區域一一繪製在邊框區域的對應位置;中間區域一般不會渲染,除非你使用了fill關鍵字

paddingmargin等屬性類似,border-image-slice也可以有多種寫法

  • • 指定一個值時,即上下左右都一樣大
  • • 指定兩個值時,第一個表示上下,第二個表示左右
  • • 指定三個值時,第一個表示上,第二個表示左右,第三個表示下
  • • 指定四個值時,分別表示上、右、下、左
  •  包含fill時(可選),則中間區域會保留(填充到元素的內容區域,相當於元素的一個背景,會堆疊在background之上,即會擋住背景),該關鍵字一般需寫在數值屬性值的末尾

看完就會!解鎖CSS的花式邊框!_圖片資源_09

使用效果大致如下

看完就會!解鎖CSS的花式邊框!_框圖_10

border-image-width

該屬性用於控制圖片邊框最終繪製的“厚度”,即決定邊框有多寬;基本語法如下

看完就會!解鎖CSS的花式邊框!_縮放_11

可寫 1 ~ 4 個值(規則同 padding / margin),默認值為1

屬性的合法值包括:

  • • 長度值(px, em, …):直接指定邊框具體厚度

看完就會!解鎖CSS的花式邊框!_圖片資源_12

  • • 百分比(%):相對於元素寬高的比例值

看完就會!解鎖CSS的花式邊框!_圖片資源_13

  • • 數字:表示相對於border-width的倍數

看完就會!解鎖CSS的花式邊框!_縮放_14

  • • auto:如果有指定slice屬性值,則等同於對應的slice值;如果沒有指定slice值,則由瀏覽器計算決定(不同瀏覽器實現可能不同,實際測試主流的瀏覽器會在四個角用圖片資源儘可能的佔滿元素);所以為了效果確定,最好還是指定具體值,同時保證slice屬性有值

看完就會!解鎖CSS的花式邊框!_框圖_15

注意:

在使用中,可能會遇到border-image-widthborder-width的情況,即邊框圖像的寬度大於邊框寬度,此時,邊框圖像繪製時除了佔滿邊框區域,超出部分會向內延伸,佔據內容區域

border-image-outset

該屬性用於指定邊框圖像相對於元素的邊框區域向外擴展的距離,即元素不侷限於元素本身的大小,而是可以向外擴展

可以理解為擴展了邊框圖像的繪製區域;基本語法如下:

看完就會!解鎖CSS的花式邊框!_縮放_16

可寫 1 ~ 4 個值(規則同 padding / margin)

合法的值類型如下:

  • • 長度值(帶單位,如pxem等),明確表示擴展多大
  • • 數字,表示按照border-width倍數進行擴展

看完就會!解鎖CSS的花式邊框!_圖片資源_17

注意:

該屬性會向外擴展邊框圖像的繪製區域,導致邊框圖像繪製到元素外,但實際不會撐大元素本身的大小,只是視覺上邊框“往外冒”

border-image-repeat

該屬性用於指定邊框圖像切片在元素邊框上如何填充,如平鋪或拉伸等;基本語法如下:

看完就會!解鎖CSS的花式邊框!_框圖_18

  • • 寫一個值,表示所有邊框的填充規則
  • • 寫兩個值,第一個值控制水平邊框,第二個值控制垂直邊框

值含義如下:

  • • stretch(默認值)拉伸,切片會被強行拉伸,以填滿對應的邊框區域
  • • repeat重複平鋪,切片會按照原始大小直接平鋪,超出邊框長度時截斷
  •  round平鋪加縮放湊整,類似repeat,但會自動縮放切片,讓它們剛好整數次鋪滿,而非截斷
  • • space平鋪加均勻留白,切片保持原始大小,不縮放,如果區域最後不夠整數次平鋪時,就會在切片之間均勻分配空隙

看完就會!解鎖CSS的花式邊框!_圖片資源_19

瞭解了上側特點,在選取邊框圖像資源時,可以儘量選擇可無縫循環的,效果會更優

🎯常見使用場景

☀不規則虛線/點線/波浪線/鋸齒線等效果

☀可伸縮的 UI 元素,如聊天軟件的氣泡皮膚、2D遊戲地圖、對話框等

☀漸變或動效邊框

☀代替複雜的切圖(四角+四邊切圖拼接),只需一張圖就能搞定

⚠️注意事項

★必須先定義border值才能顯示圖像邊框,如果你無誤地寫了border-image,但border: none;,那圖像邊框也不會顯示;且border-width至少要大於零,否則如果你沒有指定border-image-width值,那麼其默認就為border-width的大小,即,也會導致圖像邊框似乎無效

★會覆蓋常規邊框,一旦定義了border-image,將會覆蓋掉原本的border-styleborder-color的效果;如果邊框圖像資源加載失敗或錯誤,則會回退回原本的style、color邊框效果

★使用border-image,會導致border-radius圓角失效,邊框圖像是按矩形繪製的,不會跟隨圓角切割;如果需要圓角,可以直接在邊框圖像資源上體現

★如果border-image-width大於border-width,邊框會往內侵入內容區域不會被裁掉

border-image-outset只往外擴不會改變元素大小,不會影響元素的佈局尺寸,但可能會蓋住相鄰元素,需要留意

總結

你,學廢(會)了嗎ヽ(゜Q。)ノ?

看完就會!解鎖CSS的花式邊框!_縮放_20