非常實用!用Filter巧妙實現內凹的平滑圓角

2021-12-29 大帥老猿
背景

某日,群友們在群裡拋出這樣一個問題,如何使用 CSS 實現如下的布局:

在 CSS 世界中,如果只是下述這種效果,還是非常容易實現的:

一旦涉及到圓角或者波浪效果,難度就會提升很多。

實現這種連續平滑的曲線其實是比較麻煩的,當然,也不是完全沒有辦法。本文,就會帶大家看看,使用 CSS 實現上述內凹平滑圓角效果的一些可能的方式。

利用圓的銜接實現

第一種方法比較笨。我們可以使用多個圓的銜接實現。

首先,我們會實現一個內部挖出一個矩形的矩形:

<div></div>

核心 CSS 代碼如下:

div {
    height: 200px;
    background: 
        linear-gradient(90deg, #9c27b0, #9c27b0 110px, transparent 110px, transparent 190px, #9c27b0 190px),
        linear-gradient(90deg, #9c27b0, #9c27b0);
    background-size: 100% 20px, 100% 100%;
    background-position: 0 0, 0 20px;
    background-repeat: no-repeat;
}

得到這樣一個圖形(實現的方式有很多,這裡我利用的是漸變):

接下來,就是通過偽元素去疊加三個圓,大概是這樣:

div {
    ...
    &::before {
        position: absolute;
        content: "";
        width: 40px;
        height: 40px;
        border-radius: 50%;
        background: #000;
        left: 90px;
        box-shadow: 40px 0 0 #000, 80px 0 0 #000;
    }
}

稍微,修改一下三個圓的顏色,我們就可以得到如下的效果:

可以看到,這種通過 3 個圓的疊加實現的效果並不是太好,只能說是勉強還原,如果背景色不是純色,就穿幫了:

完整的代碼你可以戳這裡:CodePen Demo - Smooth concave rounded corners[1]

通過 filter 實現

下面,是本文的重點,將介紹一種利用濾鏡實現該效果的方式

一聽到濾鏡,你可能會比較詫異,啊?這個效果好像和濾鏡應該扯不上什麼關係吧?

下面,就是見證奇蹟的時刻。

首先,我們只需要實現這樣一個圖形:

<div class="g-container">
    <div class="g-content">
        <div class="g-filter"></div>
    </div>
</div>

.g-container {
    position: relative;
    width: 300px;
    height: 100px;
    
    .g-content {
        height: 100px;
        
        .g-filter {
            height: 100px;
            background: radial-gradient(circle at 50% -10px, transparent 0, transparent 39px, #000 40px, #000);
        }
    }
}

得到這樣一個簡單的圖形:

看到這裡,肯定會疑惑,為什麼這個圖形需要用 3 層 div 嵌套的方式?不是一個 div 就足夠了嗎?

是因為我們又要運用 filter: contrast() 和 filter: blur() 這對神奇的組合。

我們簡單改造一下上述代碼,仔細觀察和上述 CSS 的異同:

.g-container {
    position: relative;
    width: 300px;
    height: 100px;
    
    .g-content {
        height: 100px;
        filter: contrast(20);
        background-color: white;
        overflow: hidden;
        
        .g-filter {
            filter: blur(10px);
            height: 100px;
            background: radial-gradient(circle at 50% -10px, transparent 0, transparent 29px, #000 40px, #000);
        }
    }
}

我們給 .g-content 添加了 filter: contrast(20) 和 background-color: white,給 .g-filter 添加了 filter: blur(10px)。

神奇的事情發生了,我們得到了這樣一個效果:

通過對比度濾鏡把高斯模糊的模糊邊緣給幹掉,將原本的直角,變成了圓角,Amazing。

通過一個 Gif 圖更直觀的感受:

這裡有幾個細節需要注意:

.g-content 這一層需要設置 background、需要 overflow: hidden(可以自己嘗試去掉看看效果)

基於上述第二點,外側的直角也變成了圓角,如果希望這個圓角也是直角,就有了 .g-container 這一層,我們可以通過在這一層添加一個偽元素,將 4 個角覆蓋成直角:

.g-container {
    &::before {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        bottom: 0;
        right: 0;
        z-index: 1;
        background: radial-gradient(circle at 50% -10px, transparent 0, transparent 60px, #000 60px, #000 0);
    }
}

我們就可以得到,只有中間部分是內凹圓角,其餘四個角是直角的效果:

完整的代碼你可以戳這裡:CodePen Demo - Smooth concave rounded corners By filter[2]

當然,上述平滑內凹圓角由於應用了模糊濾鏡,內部不建議再放置 DOM,最好當做背景使用,內部內容可以通過其他方式疊加在其上方即可。

關於神奇的 filter: contrast() 和 filter: blur() 的融合效果,你可以戳這篇文章具體了解 -- 你所不知道的 CSS 濾鏡技巧與細節[3]

最後

實現本文的內凹的平滑圓角還有其它幾種方式,本質與本文的第一種方式類似,都是疊加的障眼法,不一一羅列。本文核心目的在於介紹第二中濾鏡的方式。

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

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

參考資料[1]

CodePen Demo - Smooth concave rounded corners: https://codepen.io/Chokcoco/pen/oNGgyeK

[2]

CodePen Demo - Smooth concave rounded corners By filter: https://codepen.io/Chokcoco/pen/JjroBPo

[3]

你所不知道的 CSS 濾鏡技巧與細節: https://github.com/chokcoco/iCSS/issues/30

相關焦點

  • 10個非常實用的CSS技巧
    英文 | https://javascript.plainenglish.io/10-useful-css-tips-and-tricks-every-developer-should-know-4d8b2a5dcea1翻譯 | 楊小二在開發交互式用戶界面時,級聯樣式表 (CSS) 非常棒且非常強大
  • 嘮嗑 | 圓角矩形的魔力
    比如說手機就是「弧度」的重災區,包裹住手機的金屬邊框,為了減少割手感,被設計了一個巧妙地弧度。到了全面屏時代,屏幕上的四個直角也被磨圓,使視覺上更為統一。儘管圓角矩形的設計元素因iPhone 4的顛覆性變革,帶動了工業設計、UI設計的變遷,但多年來,特立獨行的微軟在Windows系統上一直堅持著直角矩形的設計風格。
  • CAD快捷鍵命令:圓角命令的巧用
    浩辰CAD軟體中為了方便繪圖經常會用到CAD快捷鍵命令,圓角命令(FILLET)也是常用的CAD快捷鍵命令之一。除了按常規操作生成圓角外,圓角命令還有一些擴展應用,如果能夠靈活應用的話,可以提高繪圖效率。接下來就跟大家分享幾種圓角命令的使用技巧吧!
  • CSS filter有哪些神奇用途
    這個時候,filter 屬性的 drop-shadow 方法就能很好的解決這個問題,用它添加的陰影可以穿透元素,而不是添加到元素的盒模型邊框上。drop-shadow 添加的陰影除了可以穿透透明元素外,陰影效果和 box-shadow 是相同的,如果瀏覽器支持硬體加速的話,使用 filter 添加的陰影效果會更加逼真。
  • 六種方法繪製圓角多邊形
    這種圓角給人的感覺非常圓潤,放到PPT頁面中也有不錯的效果我給大家提供六種方法,僅供參考:方法一:AI圓角拖拽法【五星推薦】用強大的矢量繪圖軟體 illustrator 做這種是再簡單不過,從CC2015版本開始,就有了這個神奇的圓角拖拽點,輕輕一拖,就有了圓角。這就是新版本的優勢,為你節省大量時間。
  • 深入探討 filter 與 backdrop-filter 的異同
    本文將深入探討在 CSS 中兩個非常類似的屬性 -- filter 和 backdrop-filter。它們都能完成某些濾鏡功能,但是它們肯定也存在差異。那麼,為什麼在 CSS 中有了 filter 還誕生了 backdrop-filter 了?帶著這個疑問,開始今天的正文。
  • 細數 CSS filter 那些神奇用途
    這個時候,filter 屬性的 drop-shadow 方法就能很好的解決這個問題,用它添加的陰影可以穿透元素,而不是添加到元素的盒模型邊框上。drop-shadow 添加的陰影除了可以穿透透明元素外,陰影效果和 box-shadow 是相同的,如果瀏覽器支持硬體加速的話,使用 filter 添加的陰影效果會更加逼真。
  • Filter017 風格選物展 @ 誠品生活EXPO
    反觀位於城市街頭的型人們,不再拘泥於單一的服飾風格,大膽的嘗試將不同元素混搭,並善用潮流單品配件點出個人品味,逐漸的發展出屬於自己的玩味品生活。此次EXPO誠品生活文創平臺 與 Filter017設計團隊 合作-「街頭玩味 潮流品生活-風格選物展」。在創作與設計領域上,Filter017團隊試圖將各種元素或意識形態的概念在作品上巧妙的融合。
  • 定製這種帶「圓角」的衣櫃,好看又實用
    定製這種帶"圓角"的衣櫃,好看又實用我們現在給家中裝修都會注意到個性的追求,也讓臥室裝修時會選擇定製款式的衣櫃,讓它能安裝我們的喜好和家裝風格去給它做不同款式的設計。以前臥室裝修是用獨立的成品衣櫃擺放在這,不會注意到它跟我們家的整個格局是否搭配,也讓它整體搭配上會有些違和感,可現在這種裝飾完全不能符合我們的需求。
  • Widows 10將統一採用圓角圖標 Edge瀏覽器已經用上了
    來源:快科技一種新的圖標設計正在微軟的多平臺上普及,相比當前的方形布局和銳利邊緣的圖標,Windows 10逐漸轉為圓角圖標。微軟表示,這種新的圓角在視覺上將更具吸引力並且更易於接受。今年早些時候,微軟開始在Windows 10上的Office、收件箱、計算器、鬧鐘和時鐘等應用程式中採用圓角圖標。現在,這一變化也來到了Edge瀏覽器上。在面向測試者推送的最新Edge版本中,已經放棄了方形圖標,採用了圓角圖標。採用圓角圖標的新版Edge會在今年晚些時候正式面向普通用戶發布。
  • 圓角衣櫃真有那麼實用?聽過來人分析完,回家我也效仿裝一個
    圓角衣櫃真有那麼實用?聽過來人分析完,回家我也效仿裝一個我們裝修的時候,都會給家裡設計上衣櫃,有些人家直接購買成品衣櫃,有些人家就會讓師傅來打造。這兩種形式都可以使用,不過我們要注意一個問題,就是衣櫃一定要選擇更實用的。
  • 如何選擇IR filter
    所以在目前的相機裡都會在sensor前安裝IR cut filter, 也有的叫NIR cut filter。加了IR filter的影響有三:把近紅外的射線去除掉。紅光和近紅外射線都被吸收了。使sensor的感光和人眼一樣,這樣就是所謂的真彩色。
  • 你對圓角所有的困惑,這裡都幫你解答了!
    在7代之前,圖標的圓角曲率並非連續的,每個圓角與邊緣的銜接處都會帶有明顯的切邊;蘋果受工業設計的啟發,將工業中的曲線連續概念應用在了ui中,以連續、漸變式的曲率來將讓圓角矩形變得更加圓潤、平滑;同時,這種更新也與同一時間發布的iphone5c的邊角工藝設計達成了統一。
  • CSS3圓角 border-radius
    HTML5學堂:圓角是用一段與角的兩邊相切的圓弧替換原來的直角。
  • 【第93期】CSS3 Filter的十種特效
    不過有一點大家需要特別的注意:此處的CSS3 filter和css filter完全是兩樣東東。更不是我們一直說的IE濾鏡。具體所指的是什麼?大家感興趣的自行google。我就不多說了,因為說也說不清楚,我只想和大家一起探討的是如休整使用這個「CSS3 Filter」。那我們開始吧。Filters主要是運用在圖片上,以實現一些特效。
  • AutoCAD小妙招,把CAD中的直角掰彎成圓角!
    怎麼在CAD製圖時將直角變成圓角?也就是說如果我們在CAD軟體中想要把已經畫好的直角倒成圓角應該怎麼操作呢?來和小編一起看看怎麼解決吧!千篇一律的打開CAD製圖軟體新建文件,畫一個矩形作為實例來演示把直角變成圓角的方法。這可是我們經常用的一個命令,在我們繪製一個矩形框或者柱子的繪製時候會方便快捷。現在我們需要對矩形的四個角添加倒圓角。
  • 手機屏幕圓角完勝直角,那麼多大圓角才好看?
    隨著全面屏時代的到來,手機屏幕外觀進行了一次大躍進,不單單尺寸從原來的16:9變成了如今的18:9,更直觀的要屬直角屏變成圓角屏,確實我們看了這麼多年的直角屏,突然變成圓角,這種新鮮感是非常明顯的!小編做了個小調查,發現絕大多數的用戶更偏愛圓角屏,一方面是新鮮感,另一方面是配合全面屏帶來的震撼!目前圓角手機非常多,像iPhone X,三星S9,小米MIX,華為P20,VIXO X21,OPPO R15等主流機型均採用圓角設計,而大家在圓角大小上卻有不同,有小圓角小米MIX,中圓角三星s9,以及絕大多數的大圓角,那麼多大的圓角才好看呢?
  • python教程:3個非常有用的內置函數
    這三個內置函數還是非常有用的,在工作中用的還不少,順手,下面一一進行介紹 1、filter 語法:filter
  • 卡爾曼濾波器詳解——從零開始(3) Kalman Filter from Zero
    很多人對Wiener filter知之甚少,殊不知它是Kalman filter的「前身」。沒有Wiener等人的工作,是沒有後來這麼有用的KF的。深入學習之後,我們在下一篇正式研究KF時,你會發現一切推導都是那麼自然又簡單。本篇目錄1.