国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
目錄
非透明解決方案
透明解決方案
添加圓角
總結(jié)
首頁 web前端 css教學(xué) 獲得CSS梯度陰影的不同方法

獲得CSS梯度陰影的不同方法

Mar 09, 2025 am 10:03 AM

Different Ways to Get CSS Gradient Shadows

經(jīng)常有人問我這樣一個問題:能否用漸變色而不是純色來創(chuàng)建陰影? CSS中沒有專門的屬性可以實(shí)現(xiàn)這一點(diǎn)(相信我,我已經(jīng)找過了),任何你找到的關(guān)於這方面的博文基本上都是一些近似漸變的CSS技巧。我們接下來會介紹其中一些技巧。

但首先……又是關(guān)於漸變陰影的文章?真的嗎?

是的,這又是關(guān)於這個主題的另一篇文章,但它有所不同。我們將一起突破極限,尋找一個解決方案,涵蓋我從未在其他地方見過的內(nèi)容:透明度。大多數(shù)技巧在元素具有非透明背景時有效,但如果我們有透明背景怎麼辦?我們將在此探討這種情況!

在我們開始之前,讓我介紹一下我的漸變陰影生成器。你只需調(diào)整配置,即可獲得代碼。但請繼續(xù)閱讀,因?yàn)槲覍椭憷斫馍纱a背後的所有邏輯。

目錄

  • 非透明解決方案
  • 透明解決方案
  • 添加圓角
  • 總結(jié)

非透明解決方案

讓我們從適用於80% 常見情況的解決方案開始。最典型的情況是:你正在使用一個帶有背景的元素,並且需要向其添加漸變陰影。這裡不需要考慮透明度問題。

解決方案是依靠一個定義了漸變的偽元素。你把它放在實(shí)際元素的後面,並對其應(yīng)用模糊濾鏡。

<code>.box {
  position: relative;
}
.box::before {
  content: "";
  position: absolute;
  inset: -5px; /* 控制擴(kuò)散 */
  transform: translate(10px, 8px); /* 控制偏移量 */
  z-index: -1; /* 將元素置于后面 */
  background: /* 你的漸變色在這里 */;
  filter: blur(10px); /* 控制模糊 */
}</code>

代碼看起來很多,這是因?yàn)樗_實(shí)很多。以下是如何使用box-shadow代替它,如果我們使用純色而不是漸變色的話。

<code>box-shadow: 10px 8px 10px 5px orange;</code>

這應(yīng)該讓你很好地了解第一段代碼中值的作用。我們有X和Y偏移量、模糊半徑和擴(kuò)散距離。請注意,我們需要一個來自inset屬性的負(fù)擴(kuò)散距離值。

這是一個演示,顯示了漸變陰影與經(jīng)典box-shadow並排:

如果你仔細(xì)觀察,你會注意到兩個陰影略有不同,尤其是模糊部分。這並不奇怪,因?yàn)槲液艽_定filter屬性的算法與box-shadow的算法不同。這沒什麼大不了的,因?yàn)樽罱K結(jié)果非常相似。

這個解決方案很好,但仍然有一些與z-index:-1聲明相關(guān)的缺點(diǎn)。是的,那裡發(fā)生了“堆疊上下文”!

我向主元素應(yīng)用了一個轉(zhuǎn)換,然後,陰影不再位於元素下方。這不是錯誤,而是堆疊上下文的邏輯結(jié)果。別擔(dān)心,我不會開始對堆疊上下文進(jìn)行枯燥的解釋(我已經(jīng)在Stack Overflow線程中做過這個了),但我仍然會向你展示如何解決它。

我推薦的第一個解決方案是使用3D轉(zhuǎn)換:

<code>.box {
  position: relative;
}
.box::before {
  content: "";
  position: absolute;
  inset: -5px; /* 控制擴(kuò)散 */
  transform: translate(10px, 8px); /* 控制偏移量 */
  z-index: -1; /* 將元素置于后面 */
  background: /* 你的漸變色在這里 */;
  filter: blur(10px); /* 控制模糊 */
}</code>

我們不使用z-index: -1,而是使用沿Z軸的負(fù)平移。我們將所有內(nèi)容都放在translate3d()中。不要忘記在主元素上使用transform-style: preserve-3d;否則,3D轉(zhuǎn)換將不會生效。

據(jù)我所知,這個解決方案沒有任何副作用……但也許你會看到一個。如果是這樣,請?jiān)谠u論區(qū)分享,讓我們嘗試找到一個解決方法!

如果由於某種原因你無法使用3D轉(zhuǎn)換,另一個解決方案是依靠兩個偽元素——::before和::after。一個創(chuàng)建漸變陰影,另一個複制主背景(以及你可能需要的其他樣式)。這樣,我們可以輕鬆控制兩個偽元素的堆疊順序。

<code>box-shadow: 10px 8px 10px 5px orange;</code>

重要的是要注意,我們正在通過在其上聲明z-index: 0或任何其他執(zhí)行相同操作的屬性來強(qiáng)制主元素創(chuàng)建堆疊上下文。此外,不要忘記偽元素將主元素的填充框視為參考。因此,如果主元素有邊框,則在定義偽元素樣式時需要考慮這一點(diǎn)。你會注意到我在::after上使用inset: -2px來考慮在主元素上定義的邊框。

正如我所說,只要你不需要支持透明度,這個解決方案在大多數(shù)情況下可能就足夠好了,你想要一個漸變陰影。但我們是為了挑戰(zhàn)和突破極限而來的,所以即使你不需要接下來要講的內(nèi)容,也請繼續(xù)關(guān)注。你可能會學(xué)習(xí)到可以在其他地方使用的新的CSS技巧。

透明解決方案

讓我們從我們在3D轉(zhuǎn)換中結(jié)束的地方開始,並從主元素中移除背景。我將從一個偏移量和擴(kuò)散距離都等於0的陰影開始。

其想法是找到一種方法來裁剪或隱藏元素區(qū)域(綠色邊框內(nèi))內(nèi)的所有內(nèi)容,同時保留外部內(nèi)容。我們將為此使用clip-path。但你可能會想知道clip-path如何在一個元素內(nèi)部進(jìn)行裁剪。

確實(shí),沒有辦法做到這一點(diǎn),但是我們可以使用特定的多邊形圖案來模擬它:

<code>.box {
  position: relative;
  transform-style: preserve-3d;
}
.box::before {
  content: "";
  position: absolute;
  inset: -5px;
  transform: translate3d(10px, 8px, -1px); /* (X, Y, Z) */
  background: /* .. */;
  filter: blur(10px);
}</code>

瞧!我們得到了一個支持透明度的漸變陰影。我們所做的只是向之前的代碼添加了一個clip-path。這裡有一張圖來說明多邊形部分。

藍(lán)色區(qū)域是在應(yīng)用clip-path後可見的部分。我只使用藍(lán)色來說明這個概念,但實(shí)際上,我們只會看到該區(qū)域內(nèi)的陰影。正如你所看到的,我們定義了四個點(diǎn),它們的值很大(B)。我的大值是100vmax,但它可以是你想要的任何大值。其想法是確保我們有足夠的陰影空間。我們還有四個點(diǎn)是偽元素的角點(diǎn)。

箭頭表示定義多邊形的路徑。我們從(-B, -B)開始,直到到達(dá)(0,0)??偣参覀冃枰?0個點(diǎn)。不是8個點(diǎn),因?yàn)槁窂街兄匮}了兩次兩個點(diǎn)(( -B,-B)和(0,0))。

我們還需要做最後一件事,那就是考慮擴(kuò)散距離和偏移量。上面演示之所以有效,僅僅是因?yàn)檫@是一個特殊情況,偏移量和擴(kuò)散距離都等於0。

讓我們定義擴(kuò)散並看看會發(fā)生什麼。記住,我們使用負(fù)值的inset來做到這一點(diǎn):

偽元素現(xiàn)在比主元素大,所以clip-path裁剪的內(nèi)容比我們需要多。記住,我們總是需要裁剪主元素內(nèi)部的部分(示例中綠色邊框內(nèi)的區(qū)域)。我們需要調(diào)整clip-path中四個點(diǎn)的位。

<code>.box {
  position: relative;
}
.box::before {
  content: "";
  position: absolute;
  inset: -5px; /* 控制擴(kuò)散 */
  transform: translate(10px, 8px); /* 控制偏移量 */
  z-index: -1; /* 將元素置于后面 */
  background: /* 你的漸變色在這里 */;
  filter: blur(10px); /* 控制模糊 */
}</code>

我們?yōu)閿U(kuò)散距離定義了一個CSS變量--s,並更新了多邊形點(diǎn)。我沒有觸及我使用大值的地方。我只更新定義偽元素角的點(diǎn)。我將所有零值增加--s,並將100%的值減少--s。

偏移量也是同樣的邏輯。當(dāng)我們轉(zhuǎn)換偽元素時,陰影會錯位,我們需要再次校正多邊形並將點(diǎn)移動到相反的方向。

<code>box-shadow: 10px 8px 10px 5px orange;</code>

還有兩個變量用於偏移量:--x和--y。我們在transform內(nèi)部使用它們,我們還更新了clip-path值。我們?nèi)匀徊挥|及具有大值的多邊形點(diǎn),但我們偏移所有其他點(diǎn)——我們從X坐標(biāo)中減少--x,從Y坐標(biāo)中減少--y。

現(xiàn)在我們只需要更新一些變量來控制漸變陰影。當(dāng)我們這樣做的時候,讓我們也把模糊半徑也變成一個變量:

我們還需要3D轉(zhuǎn)換技巧嗎?

這完全取決於邊框。不要忘記偽元素的參考是填充框,因此如果你對主元素應(yīng)用邊框,你將會有重疊。你可以保留3D轉(zhuǎn)換技巧或更新inset值來考慮邊框。

這是前面演示中用更新的inset值代替3D轉(zhuǎn)換的版本:

我認(rèn)為這是一種更合適的方法,因?yàn)閿U(kuò)散距離將更準(zhǔn)確,因?yàn)樗鼜腷order-box而不是padding-box開始。但是你需要根據(jù)主元素的邊框調(diào)整inset值。有時,元素的邊框是未知的,你必須使用之前的解決方案。

使用之前的非透明解決方案,你可能會遇到堆疊上下文問題。使用透明解決方案,你可能會遇到邊框問題?,F(xiàn)在你有了解決這些問題的選擇和方法。 3D轉(zhuǎn)換技巧是我最喜歡的解決方案,因?yàn)樗迯?fù)了所有問題(在線生成器也會考慮它)

添加圓角

如果你嘗試在使用我們開始的非透明解決方案時向元素添加border-radius,這是一個相當(dāng)簡單的任務(wù)。你只需要從主元素繼承相同的值,就完成了。

即使你沒有圓角,定義border-radius: inherit也是一個好主意。這考慮了你以後可能想要添加的任何潛在圓角或來自其他地方的圓角。

處理透明解決方案的情況就不同了。不幸的是,這意味著要找到另一個解決方案,因?yàn)閏lip-path無法處理曲線。這意味著我們將無法裁剪主元素內(nèi)部的區(qū)域。

我們將mask屬性添加到混合中。

這部分非常繁瑣,我很難找到一個不依賴於幻數(shù)的通用解決方案。我最終得到了一個非常複雜的解決方案,它只使用一個偽元素,但是代碼是一團(tuán)亂麻,只涵蓋了一些特定情況。我認(rèn)為探索這條路不值得。

為了簡化代碼,我決定插入一個額外的元素。以下是標(biāo)記:

<code>.box {
  position: relative;
}
.box::before {
  content: "";
  position: absolute;
  inset: -5px; /* 控制擴(kuò)散 */
  transform: translate(10px, 8px); /* 控制偏移量 */
  z-index: -1; /* 將元素置于后面 */
  background: /* 你的漸變色在這里 */;
  filter: blur(10px); /* 控制模糊 */
}</code>

我使用自定義元素來避免與外部CSS發(fā)生任何潛在衝突。我可以使用

,但是因?yàn)樗且粋€常見元素,所以很容易被來自其他地方的另一個CSS規(guī)則所定位,這可能會破壞我們的代碼。第一步是定位元素並故意創(chuàng)建溢出:
<code>box-shadow: 10px 8px 10px 5px orange;</code>

代碼可能看起來有點(diǎn)奇怪,但我們會逐步講解其背後的邏輯。接下來,我們使用的偽元素創(chuàng)建漸變陰影。

<code>.box {
  position: relative;
  transform-style: preserve-3d;
}
.box::before {
  content: "";
  position: absolute;
  inset: -5px;
  transform: translate3d(10px, 8px, -1px); /* (X, Y, Z) */
  background: /* .. */;
  filter: blur(10px);
}</code>

正如你所看到的,偽元素使用了與所有之前的示例相同的代碼。唯一的區(qū)別是在元素上定義了3D轉(zhuǎn)換,而不是偽元素上。目前,我們有一個沒有透明度功能的漸變陰影:

請注意,元素的區(qū)域是用黑色輪廓定義的。我為什麼要這樣做?因?yàn)檫@樣,我就可以在其上應(yīng)用一個遮罩來隱藏綠色區(qū)域內(nèi)部的部分,並保留我們需要看到陰影的溢出部分。

我知道這有點(diǎn)棘手,但是與clip-path不同,mask屬性不會考慮元素外部的區(qū)域來顯示和隱藏內(nèi)容。這就是為什麼我不得不引入額外的元素——來模擬“外部”區(qū)域。

此外,請注意,我正在使用邊框和inset的組合來定義該區(qū)域。這允許我將額外元素的padding-box保持與主元素相同,以便偽元素不需要額外的計(jì)算。

從使用額外元素中獲得的另一個有用的東西是元素是固定的,只有偽元素在移動(使用translate)。這將允許我輕鬆地定義遮罩,這是這個技巧的最後一步。

<code>.box {
  position: relative;
  z-index: 0; /* 我們強(qiáng)制創(chuàng)建一個堆疊上下文 */
}
/* 創(chuàng)建陰影 */
.box::before {
  content: "";
  position: absolute;
  z-index: -2;
  inset: -5px;
  transform: translate(10px, 8px);
  background: /* .. */;
  filter: blur(10px);
}
/* 復(fù)制主元素樣式 */
.box::after {
  content: "";
  position: absolute;
  z-index: -1;
  inset: 0;
  /* 繼承在主元素上定義的所有裝飾 */
  background: inherit;
  border: inherit;
  box-shadow: inherit;
}</code>

完成了!我們有了漸變陰影,而且它支持border-radius!你可能期望一個複雜的面具值,裡面有很多漸變,但不是!我們只需要兩個簡單的漸變和一個mask-composite來完成魔法。

讓我們隔離元素來理解那裡發(fā)生了什麼:

<code>clip-path: polygon(-100vmax -100vmax,100vmax -100vmax,100vmax 100vmax,-100vmax 100vmax,-100vmax -100vmax,0 0,0 100%,100% 100%,100% 0,0 0)</code>

以下是我們得到的結(jié)果:

請注意內(nèi)部半徑如何與主元素的border-radius匹配。我定義了一個大的邊框(150px)和一個等於大邊框主元素半徑的border-radius。在外部,我有一個等於150px R的半徑。在內(nèi)部,我有150px R - 150px = R。

我們必須隱藏內(nèi)部(藍(lán)色)部分,並確保邊框(紅色)部分仍然可見。為此,我定義了兩個遮罩層——一個只覆蓋content-box區(qū)域,另一個覆蓋border-box區(qū)域(默認(rèn)值)。然後我將一個從另一個中排除以顯示邊框。

<code>.box {
  position: relative;
}
.box::before {
  content: "";
  position: absolute;
  inset: -5px; /* 控制擴(kuò)散 */
  transform: translate(10px, 8px); /* 控制偏移量 */
  z-index: -1; /* 將元素置于后面 */
  background: /* 你的漸變色在這里 */;
  filter: blur(10px); /* 控制模糊 */
}</code>

我使用相同的技術(shù)來創(chuàng)建支持漸變和border-radius的邊框。 Ana Tudor也有一篇關(guān)於遮罩複合的好文章,我邀請你閱讀。

這種方法有什麼缺點(diǎn)嗎?

是的,這絕對不完美。你可能遇到的第一個問題與在主元素上使用邊框有關(guān)。如果你沒有考慮它,這可能會導(dǎo)致半徑出現(xiàn)輕微錯位。我們的示例中存在此問題,但你可能很難注意到它。

修復(fù)起來相對容易:為元素的inset添加邊框?qū)挾取?

<code>box-shadow: 10px 8px 10px 5px orange;</code>

另一個缺點(diǎn)是我們用於邊框的大值(示例中為150px)。此值應(yīng)該足夠大以包含陰影,但不能太大以避免溢出和滾動條問題。幸運(yùn)的是,在線生成器將考慮所有參數(shù)來計(jì)算最佳值。

我意識到的最後一個缺點(diǎn)是當(dāng)你使用複雜的border-radius時。例如,如果你想對每個角應(yīng)用不同的半徑,你必須為每一側(cè)定義一個變量。這並不是真正的缺點(diǎn),我認(rèn)為,但這可能會使你的代碼維護(hù)起來有點(diǎn)困難。

<code>.box {
  position: relative;
  transform-style: preserve-3d;
}
.box::before {
  content: "";
  position: absolute;
  inset: -5px;
  transform: translate3d(10px, 8px, -1px); /* (X, Y, Z) */
  background: /* .. */;
  filter: blur(10px);
}</code>

為了簡單起見,在線生成器只考慮統(tǒng)一的半徑,但你現(xiàn)在知道如果要考慮複雜的半徑配置如何修改代碼了。

總結(jié)

我們已經(jīng)到達(dá)了終點(diǎn)!漸變陰影背後的魔法不再是謎團(tuán)。我試圖涵蓋所有可能性以及你可能遇到的任何問題。如果我遺漏了什麼或者你發(fā)現(xiàn)了任何問題,請隨時在評論區(qū)報(bào)告,我會檢查一下。

同樣,考慮到事實(shí)上的解決方案將涵蓋你的大多數(shù)用例,這其中很多可能都是多餘的。然而,了解技巧背後的“為什麼”和“如何”,以及如何克服其局限性是很好的。此外,我們在玩CSS剪輯和遮罩方面得到了很好的練習(xí)。

當(dāng)然,你隨時可以使用在線生成器來避免麻煩。

以上是獲得CSS梯度陰影的不同方法的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

什麼是'渲染障礙CSS”? 什麼是'渲染障礙CSS”? Jun 24, 2025 am 12:42 AM

CSS會阻塞頁面渲染是因?yàn)闉g覽器默認(rèn)將內(nèi)聯(lián)和外部CSS視為關(guān)鍵資源,尤其是使用引入的樣式表、頭部大量內(nèi)聯(lián)CSS以及未優(yōu)化的媒體查詢樣式。 1.提取關(guān)鍵CSS並內(nèi)嵌至HTML;2.延遲加載非關(guān)鍵CSS通過JavaScript;3.使用media屬性優(yōu)化加載如打印樣式;4.壓縮合併CSS減少請求。建議使用工具提取關(guān)鍵CSS,結(jié)合rel="preload"異步加載,合理使用media延遲加載,避免過度拆分與復(fù)雜腳本控制。

外部與內(nèi)部CSS:最好的方法是什麼? 外部與內(nèi)部CSS:最好的方法是什麼? Jun 20, 2025 am 12:45 AM

thebestapphachforcssdepprodsontheproject'sspefificneeds.forlargerprojects,externalcsSissBetterDuoSmaintoMaintainability andReusability; forsMallerProjectsorsingle-pageApplications,InternaltCsmightBemoresobleable.InternalCsmightBemorese.it.it'sclucialtobalancepopryseceneceenceprodrenceprodrenceNeed

我的CSS必須在較低的情況下嗎? 我的CSS必須在較低的情況下嗎? Jun 19, 2025 am 12:29 AM

否,CSSDOESNOTHAVETOBEINLOWERCASE.CHOMENDENS,使用flowercaseisrecommondendendending:1)一致性和可讀性,2)避免使用促進(jìn)性技術(shù),3)潛在的Performent FormanceBenefits,以及4)RightCollaboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraborationWithInteams。

CSS案例靈敏度:了解重要的 CSS案例靈敏度:了解重要的 Jun 20, 2025 am 12:09 AM

cssismostlycaseminemintiment,buturlsandfontfamilynamesarecase敏感。 1)屬性和valueslikeColor:紅色; prenotcase-sensive.2)urlsmustmustmatchtheserver'server'scase,例如

什麼是AutoPrefixer,它如何工作? 什麼是AutoPrefixer,它如何工作? Jul 02, 2025 am 01:15 AM

Autoprefixer是一個根據(jù)目標(biāo)瀏覽器範(fàn)圍自動為CSS屬性添加廠商前綴的工具。 1.它解決了手動維護(hù)前綴易出錯的問題;2.通過PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設(shè)置browserslist、在構(gòu)建流程中啟用;4.注意事項(xiàng)有不手動加前綴、保持配置更新、非所有屬性都加前綴、建議配合預(yù)處理器使用。

什麼是CSS計(jì)數(shù)器? 什麼是CSS計(jì)數(shù)器? Jun 19, 2025 am 12:34 AM

csscounterscanautomationallymentermentermentections和lists.1)usecounter-ensettoInitializize,反插入式發(fā)芽,andcounter()orcounters()

CSS:何時重要(何時不)? CSS:何時重要(何時不)? Jun 19, 2025 am 12:27 AM

在CSS中,選擇器和屬性名不區(qū)分大小寫,而值、命名顏色、URL和自定義屬性則區(qū)分大小寫。 1.選擇器和屬性名不區(qū)分大小寫,例如background-color和Background-Color相同。 2.值中的十六進(jìn)制顏色不區(qū)分大小寫,但命名顏色區(qū)分大小寫,如red有效而Red無效。 3.URL區(qū)分大小寫,可能導(dǎo)致文件加載問題。 4.自定義屬性(變量)區(qū)分大小寫,使用時需注意大小寫一致。

什麼是圓錐級函數(shù)? 什麼是圓錐級函數(shù)? Jul 01, 2025 am 01:16 AM

theconic-Gradient()functionIncsscreatesCircularGradientsThatRotateColorStopSaroundAcentralPoint.1.IsidealForPieCharts,ProgressIndicators,colordichers,colorwheels和decorativeBackgrounds.2.itworksbysbysbysbydefindefingincolordefingincolorstopsatspecificains off.

See all articles