漸變的邊框效果

如何實(shí)現(xiàn)下面這個(gè)漸變的邊框效果:

image

這個(gè)問題本身不難,實(shí)現(xiàn)的方法也有一些滩字,主要是有一些細(xì)節(jié)需要注意咽安。

border-image

border-image 是 CSS 規(guī)范 CSS Backgrounds and Borders Module Level 3 (最新一版的關(guān)于 background 和 border 的官方規(guī)范) 新增的一個(gè)屬性值。

顧名思義闪幽,我們可以給 border 元素添加 image料皇,類似于 background-image谓松,可以是圖片也可以是漸變星压,不再局限于純色践剂。

使用 border-image 實(shí)現(xiàn)漸變邊框

有了 border-image 之后,實(shí)現(xiàn)漸變邊框變得很方便

不過多介紹 border-image 的語法娜膘,讀者需要自行了解一下逊脯。

實(shí)現(xiàn)如下:

<``div class="border-image"></``div``>

3

4

5

6

7

8

|

.border-image {

width``: ``200px``;

height``: ``100px``;

border-radius: ``10px``;

border-image-source: linear-gradient(``45``deg, gold, deeppink);

border-image-slice: ``1``;

border-image-repeat: stretch;

}

|

上面關(guān)于 border-image 的三個(gè)屬性可以簡寫為 border-image: linear-gradient(45deg, gold, deeppink) 1;

得到如下結(jié)果:

image

border-radius 失效

仔細(xì)看上面的 Demo,設(shè)置了 border-radius: 10px 但是實(shí)際表現(xiàn)沒有圓角竣贪。使用 border-image 最大的問題在于军洼,設(shè)置的 border-radius 會(huì)失效。

我們無法得到一個(gè)帶圓角的漸變邊框演怎。原因匕争,查看官方規(guī)范 W3C 解釋如下:

A box's backgrounds, but not its border-image, are clipped to the appropriate curve (as determined by ‘background-clip’). Other effects that clip to the border or padding edge (such as ‘overflow’ other than ‘visible’) also must clip to the curve. The content of replaced elements is always trimmed to the content edge curve. Also, the area outside the curve of the border edge does not accept mouse events on behalf of the element.

為此,我們得另辟蹊徑或者稍加改進(jìn)爷耀,得到帶圓角的漸變邊框甘桑。

法一:background-image + 偽元素

第一種方法,我們不再使用 border-image ,而是使用 background-image + 偽元素 的方案跑杭,這也是在 border-image 規(guī)范沒有出現(xiàn)最常用的方法铆帽。

非常簡單,簡單的示意圖如下:

image

利用 background-image 實(shí)現(xiàn)一個(gè)漸變背景德谅,再通過疊加一個(gè)白色背景使之形成一個(gè)漸變邊框爹橱。

CodePen Demo -- bg + overflow 實(shí)現(xiàn)漸變邊框

缺點(diǎn)

這個(gè)方案有兩個(gè)問題,第一個(gè)是多使用了兩個(gè)元素(當(dāng)然在這里是 ::before 和 ::after)窄做,其次最致命的是愧驱,如果要求邊框內(nèi)的背景是透明的,此方案便行不通了浸策。

法二冯键,使用 background-clip 實(shí)現(xiàn)

第二種方法,使用 background-clip: content-box 以及 background-clip: border-box 配合使用庸汗。

background-clip:background-clip 設(shè)置元素的背景(背景圖片或顏色)是否延伸到邊框下面惫确。它的部分取值和 box-sizing 類似。其中蚯舱,

  • background-clip: border-box 表示設(shè)置的背景 background-image 將延伸至邊框
  • background-clip: content-box 表示設(shè)置的背景 background-image 被裁剪至內(nèi)容區(qū)(content box)外沿

這里改化,我們使用設(shè)置兩個(gè) background-image,設(shè)置兩個(gè) background-clip 枉昏,并且將 border 設(shè)置為透明即可:

核心 CSS:

|

1

2

3

4

5

6

7

8

9

10

|

div {

width``: ``200px``;

height``: ``100px``;

border``: ``solid 10px transparent``;

border-radius: ``10px``;

background-image``: linear-gradient(``#fee``, ``#fee``),

linear-gradient(to ``right``, ``green``, gold);

background-origin: border-box;

background-``clip``: content-box, border-box;

}

|

image

因?yàn)橛玫搅?background-clip: border-box陈肛,所以還需要 background-origin: border-box 使圖案完整顯示,可以嘗試下關(guān)掉這個(gè)屬性兄裂,即可明白為什么需要這樣做句旱。

CodePen Demo -- background-clip 實(shí)現(xiàn)漸變邊框

缺點(diǎn)

與第一種方法類似,如果要求邊框內(nèi)的背景是透明的晰奖,此方案便行不通了谈撒。

法三:border-image + overflow: hidden

這個(gè)方法也很好理解,既然設(shè)置了 background-image 的元素的 border-radius 失效匾南。那么啃匿,我們只需要給它加一個(gè)父容器,父容器設(shè)置 overflow: hidden + border-radius 即可:

|

1

|

<``div class="border-image-overflow"></``div``>

|

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

|

.border-image-pesudo {

position``: ``relative``;

width``: ``200px``;

height``: ``100px``;

border-radius: ``10px``;

overflow``: ``hidden``;

}

.border-image-pesudo::before {

content``: ``""``;

position``: ``absolute``;

width``: ``200px``;

height``: ``100px``;

top``: ``50%``;

left``: ``50%``;

transform: translate(``-50%``, ``-50%``);

border``: ``10px solid``;

border-image: linear-gradient(``45``deg, gold, deeppink) ``1``;

}

|

效果如下:

image

當(dāng)然蛆楞,這里還是多借助了一個(gè)元素實(shí)現(xiàn)溯乒。還有一種方法,可以不使用多余元素實(shí)現(xiàn):

法四:border-image + clip-path

設(shè)置了 background-image 的元素的 border-radius 失效豹爹。但是在 CSS 中裆悄,還有其它方法可以產(chǎn)生帶圓角的容器,那就是借助 clip-path臂聋。

[clip-path](https://developer.mozilla.org/zh-CN/docs/Web/CSS/clip-path)光稼,一個(gè)非常有意思的 CSS 屬性崖技。

clip-path CSS 屬性可以創(chuàng)建一個(gè)只有元素的部分區(qū)域可以顯示的剪切區(qū)域。區(qū)域內(nèi)的部分顯示钟哥,區(qū)域外的隱藏迎献。剪切區(qū)域是被引用內(nèi)嵌的URL定義的路徑或者外部 SVG 的路徑。

簡而言之腻贰,這里吁恍,我們只需要在 border-image 的基礎(chǔ)上,再利用 clip-path 裁剪出一個(gè)帶圓角的矩形容器即可:

|

1

|

<``div class="border-image-clip-path"></``div``>

|

|

1

2

3

4

5

6

7

8

|

.border-image-clip-path {

position``: ``relative``;

width``: ``200px``;

height``: ``100px``;

border``: ``10px solid``;

border-image: linear-gradient(``45``deg, gold, deeppink) ``1``;

clip-path: ``inset``(``0 round ``10px``);

}

|

解釋一下:clip-path: inset(0 round 10px) 播演。

  • clip-path: inset() 是矩形裁剪
  • inset() 的用法有多種冀瓦,在這里 inset(0 round 10px) 可以理解為,實(shí)現(xiàn)一個(gè)父容器大行纯尽(完全貼合翼闽,垂直水平居中于父容器)且 border-radius: 10px 的容器,將這個(gè)元素之外的所有東西裁剪掉(即不可見)洲炊。

非常完美感局,效果如下:

image

當(dāng)然,還可以利用 filter: hue-rotate()順手再加個(gè)漸變動(dòng)畫:

image

你可以在我 CSS-Inspiration 看到這個(gè)例子:

CSS-Inspiration -- 使用 clip-path 和 border-image 實(shí)現(xiàn)圓角漸變邊框

最后

好了暂衡,本文到此結(jié)束询微,希望對(duì)你有幫助 :)

更多精彩 CSS 技術(shù)文章匯總在我的 Github -- iCSS ,持續(xù)更新狂巢,歡迎點(diǎn)個(gè) star 訂閱收藏撑毛。

更多精彩有趣的 CSS 效果,歡迎來這里看看 CSS 靈感 -- 在這里找到寫 CSS 的靈感唧领。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藻雌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斩个,更是在濱河造成了極大的恐慌胯杭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萨驶,死亡現(xiàn)場離奇詭異歉摧,居然都是意外死亡艇肴,警方通過查閱死者的電腦和手機(jī)腔呜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來再悼,“玉大人核畴,你說我怎么就攤上這事〕寰牛” “怎么了谤草?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵跟束,是天一觀的道長。 經(jīng)常有香客問我丑孩,道長冀宴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任温学,我火速辦了婚禮略贮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仗岖。我一直安慰自己逃延,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布轧拄。 她就那樣靜靜地躺著揽祥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪檩电。 梳的紋絲不亂的頭發(fā)上拄丰,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音俐末,去河邊找鬼愈案。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鹅搪,可吹牛的內(nèi)容都是我干的站绪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼丽柿,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼恢准!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起甫题,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤馁筐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后坠非,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敏沉,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年炎码,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盟迟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潦闲,死狀恐怖攒菠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歉闰,我是刑警寧澤辖众,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布卓起,位于F島的核電站,受9級(jí)特大地震影響凹炸,放射性物質(zhì)發(fā)生泄漏戏阅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一啤它、第九天 我趴在偏房一處隱蔽的房頂上張望饲握。 院中可真熱鬧,春花似錦蚕键、人聲如沸救欧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笆怠。三九已至,卻和暖如春誊爹,著一層夾襖步出監(jiān)牢的瞬間蹬刷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工频丘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留办成,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓搂漠,卻偏偏與公主長得像迂卢,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桐汤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • 我還記得國外某位大牛在一篇文章中寫道而克,CSS is fine, it's just really hard。讀完他...
    garble閱讀 1,075評(píng)論 0 0
  • CSS邊框?qū)傩?元素的邊框就是圍繞元素內(nèi)容和內(nèi)邊距的一條或多條線怔毛。 元素的邊框?qū)傩裕?border 簡寫屬性员萍,用...
    Zd_silent閱讀 975評(píng)論 0 1
  • 1、屬性選擇器:id選擇器 # 通過id 來選擇類名選擇器 . 通過類名來選擇屬性選擇器 ...
    Yuann閱讀 1,619評(píng)論 0 7
  • 1.半透明邊框 問題原因:背景會(huì)擴(kuò)展到邊框border下解決方案:把背景限制在padding-box中backgr...
    阿r阿r閱讀 809評(píng)論 0 0
  • 1:CSS3 圓角邊框div{border:2px solid;border-radius:25px;-moz-b...
    憶往昔Code閱讀 230評(píng)論 0 0