巧妙實現帶圓角的漸變邊框

来源:https://www.cnblogs.com/coco1s/archive/2020/02/17/12321837.html
-Advertisement-
Play Games

如何實現下麵這個漸變的邊框效果: 這個問題本身不難,實現的方法也有一些,主要是有一些細節需要註意。 border-image border-image 是 CSS 規範 CSS Backgrounds and Borders Module Level 3 (最新一版的關於 background 和 ...


如何實現下麵這個漸變的邊框效果:

這個問題本身不難,實現的方法也有一些,主要是有一些細節需要註意。

 

border-image

border-image 是 CSS 規範 CSS Backgrounds and Borders Module Level 3 (最新一版的關於 background 和 border 的官方規範) 新增的一個屬性值。

顧名思義,我們可以給 border 元素添加 image,類似於 background-image,可以是圖片也可以是漸變,不再局限於純色。

 

使用 border-image 實現漸變邊框

有了 border-image 之後,實現漸變邊框變得很方便

不過多介紹 border-image 的語法,讀者需要自行瞭解一下。

實現如下:

<div class="border-image"></div>
.border-image {
    width: 200px;
    height: 100px;
    border-radius: 10px;
    border-image-source: linear-gradient(45deg, gold, deeppink);
    border-image-slice: 1;
    border-image-repeat: stretch;
}

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

得到如下結果:

 

border-radius 失效

仔細看上面的 Demo,設置了 border-radius: 10px 但是實際表現沒有圓角。使用 border-image 最大的問題在於,設置的 border-radius 會失效。

我們無法得到一個帶圓角的漸變邊框。原因,查看官方規範 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.

為此,我們得另闢蹊徑或者稍加改進,得到帶圓角的漸變邊框。

 

法一:background-image + 偽元素

第一種方法,我們不再使用 border-image ,而是使用 background-image + 偽元素 的方案,這也是在 border-image 規範沒有出現最常用的方法。

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

利用 background-image 實現一個漸變背景,再通過疊加一個白色背景使之形成一個漸變邊框。

CodePen Demo -- bg + overflow 實現漸變邊框 

缺點

這個方案有兩個問題,第一個是多使用了兩個元素(當然在這裡是 ::before 和 ::after),其次最致命的是,如果要求邊框內的背景是透明的,此方案便行不通了。

 

法二,使用 background-clip 實現

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

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

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

這裡,我們使用設置兩個 background-image,設置兩個 background-clip ,並且將 border 設置為透明即可:

核心 CSS:

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;
}

因為用到了 background-clip: border-box,所以還需要 background-origin: border-box 使圖案完整顯示,可以嘗試下關掉這個屬性,即可明白為什麼需要這樣做。

CodePen Demo -- background-clip 實現漸變邊框

缺點

與第一種方法類似,如果要求邊框內的背景是透明的,此方案便行不通了。

 

法三:border-image + overflow: hidden

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

<div class="border-image-overflow"></div>
.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(45deg, gold, deeppink) 1;
} 

效果如下:

當然,這裡還是多藉助了一個元素實現。還有一種方法,可以不使用多餘元素實現:

 

法四:border-image + clip-path

設置了 background-image 的元素的 border-radius 失效。但是在 CSS 中,還有其它方法可以產生帶圓角的容器,那就是藉助 clip-path

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

clip-path CSS 屬性可以創建一個只有元素的部分區域可以顯示的剪切區域。區域內的部分顯示,區域外的隱藏。剪切區域是被引用內嵌的URL定義的路徑或者外部 SVG 的路徑。

簡而言之,這裡,我們只需要在 border-image 的基礎上,再利用 clip-path 裁剪出一個帶圓角的矩形容器即可:

<div class="border-image-clip-path"></div>
.border-image-clip-path {
    position: relative;
    width: 200px;
    height: 100px;
    border: 10px solid;
    border-image: linear-gradient(45deg, gold, deeppink) 1;
    clip-path: inset(0 round 10px);
}

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

  • clip-path: inset() 是矩形裁剪
  • inset() 的用法有多種,在這裡 inset(0 round 10px) 可以理解為,實現一個父容器大小(完全貼合,垂直水平居中於父容器)且 border-radius: 10px 的容器,將這個元素之外的所有東西裁剪掉(即不可見)。

非常完美,效果如下:

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

你可以在我 CSS-Inspiration 看到這個例子:

CSS-Inspiration -- 使用 clip-path 和 border-image 實現圓角漸變邊框

 

最後

好了,本文到此結束,希望對你有幫助 :)

更多精彩 CSS 技術文章彙總在我的 Github -- iCSS ,持續更新,歡迎點個 star 訂閱收藏。

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

如果還有什麼疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Druid快速入門其實已經簡單的介紹過最簡化配置的單節點部署,本文我們將詳細描述Druid的多種部署方式,對於測試開發環境可以選用輕量的單機部署方式,而生產環境我們最好選用集群部署的方式,確保系統的高可用性。 一、單機部署 Druid提供了一組可以參考的配置和單機部署的啟動腳本。 尺寸適合筆記本電 ...
  • 定義 對象是JS中的引用數據類型。對象是一種複合數據類型,在對象中可以保存多個不同數據類型的屬性。使用typeof檢查一個對象時,會返回object。 分類 內置對象 由ES標准定義的對象,在任何ES的實現中都可以實現。比如 Math String Number Boolean Function O ...
  • BOM(Browser Object Model)也叫瀏覽器對象,它提供了很多對象,用於訪問瀏覽器的功能。但是BOM是沒有標準的,每一個瀏覽器廠家會根據自己的需求來擴展BOM對象。本文主要以一些簡單的小例子,簡述前端開發中BOM的相關基礎知識,僅供學習分享使用,如有不足之處,還請指正。 ...
  • ES6)新增加了兩個重要的 JavaScript 關鍵字:let 和 const。以前聲明變數時只有一種方式:var,ES6對聲明方式進行了擴展,現在可以有三種聲明方式了。 1、var:variable的簡寫,字面意思就是變數。 2、let:let的意思(vt. 允許,讓;出租;假設;妨礙;vi. ...
  • 動畫DOM及CSS操作 自定義動畫 animate(最終css狀態,時間) 這個最終css狀態是一個對象 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>demo</title> <style> div{ w ...
  • 先看代碼: let fn1 = function (x) { return x + 10; }; let fn2 = function (x) { return x * 10; }; let fn3 = function (x) { return x / 10; }; console.log(fn3 ...
  • 方法一: if ($("#checkbox-id").get(0).checked) { // do something } 方法二: if($('#checkbox-id').is(':checked')) { // do something } 方法三: if ($('#checkbox-id' ...
  • 通過運算符可以對一個或多個值進行運算,並且一定有運算結果返回 算數運算符 ​ 算數運算符包括相加(+)、相減( )、相乘( )、相除(/)、取模(%)。任何值與字元串相加都會轉換為字元串,做的是字元串連。除了與字元串做加法,當對非 Number 類型的值進行運算時,會將這些值轉換為 Number 再 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...