亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【布局進(jìn)階】巧用 :has & drop-shadow 實(shí)現(xiàn)復(fù)雜布局效果

freeflydom
2024年6月18日 14:56 本文熱度 1629

希望使用 CSS 實(shí)現(xiàn)如下所示的布局效果:

正常而言,我們的 HTML 結(jié)構(gòu)大致是如下所示:

<div class="g-container">

    <div class="g-nav">

        <ul>

            <li>Tab 1</li>

            <li>Tab 2</li>

            <li>Tab 3</li>

            <li>Tab 4</li>

        </ul>

    </div>

    <div class="g-main">

        <ul class="g-content">

            <li>...</li>

            <li>...</li>

            <li>...</li>

            <li>...</li>

        </ul>

    </div>

</div>

對于 Hover 導(dǎo)航 Tab 時(shí)候的內(nèi)容切換,暫且不談。本文,我們核心想探討的是兩個(gè)點(diǎn):

  1. 一是對于如下所示的不規(guī)則布局,應(yīng)該如何實(shí)現(xiàn):

并且,這里我們可能還需要給它加上陰影效果:

  1. 如何配合 Hover 動(dòng)作,實(shí)現(xiàn)整個(gè)切換效果

帶著這兩個(gè)問題,我們一起來嘗試慢慢把這個(gè)效果實(shí)現(xiàn)。

借助偽元素實(shí)現(xiàn)不規(guī)則按鈕

首先,我們需要實(shí)現(xiàn)這個(gè)效果:

這個(gè),其實(shí)在很多篇文章都有提及過:

想一想,這里其實(shí)就是豎向的 Chrome 分 Tab 的效果:

像是這樣:

我們對這個(gè)按鈕形狀拆解一下,這里其實(shí)是 3 塊的疊加:

只需要想清楚如何實(shí)現(xiàn)兩側(cè)的弧形三角即可。這里還是借助了漸變 -- 徑向漸變,其實(shí)他是這樣,如下圖所示,我們只需要把黑色部分替換為透明即可,使用兩個(gè)偽元素即可:

代碼如下:

<div class="outside-circle"></div>

.outside-circle {

    position: relative;

    background: #e91e63;

    border-radius: 10px 10px 0 0;


    &::before {

        content: "";

        position: absolute;

        width: 20px;

        height: 20px;

        left: -20px;

        bottom: 0;

        background: #000;

        background:radial-gradient(circle at 0 0, transparent 20px, #e91e63 21px);

    }

    &::after {

        content: "";

        position: absolute;

        width: 20px;

        height: 20px;

        right: -20px;

        bottom: 0;

        background: #000;

        background:radial-gradient(circle at 100% 0, transparent 20px, #e91e63 21px);

    }

}

即可得到:

我們照葫蘆畫瓢,即可非常輕松的實(shí)現(xiàn)豎向的相同的效果,示意圖如下:

利用 drop-shadow 實(shí)現(xiàn)按鈕陰影

好,接下來,我們需要給按鈕添加上陰影效果,像是這樣:

因?yàn)槭褂昧藘蓚€(gè)偽元素,當(dāng)前單個(gè)按鈕在 Hover 狀態(tài)下的大致代碼如下:

li {

    position: relative;

    width: 160px;

    height: 36px;

    border-radius: 10px 0 0 10px;

    background: #ddd;


    &::before,

    &::after {

        content: "";

        position: absolute;

        right: 0;

        border-radius: unset;

    }


    &::before {

        width: 20px;

        height: 20px;

        top: -20px;

        background: radial-gradient(circle at 0 0, transparent, transparent 19.5px, #ddd 20px, #ddd);

    }

    &::after {

        width: 20px;

        height: 20px;

        bottom: -20px;

        background: radial-gradient(circle at 0 100%, transparent, transparent 19.5px, #ddd 20px, #ddd);

    }

}

如果使用 box-shadow 肯定是不行的,整個(gè)效果就會(huì)露餡:

嘗試給按鈕添加一個(gè) box-shadow: 0 0 5px 0 #333

彎曲的連接處,明顯沒有陰影效果,怎么解決呢?

嗯哼,老讀者一定也知道,這里我們需要對整個(gè)可見部分添加陰影,需要使用 filter:drop-shadow()。

drop-shadow() 濾鏡的作用用于創(chuàng)建一個(gè)符合元素(圖像)本身形狀(alpha 通道)的陰影。其中,最為常見的技巧,就是利用它生成不規(guī)則圖形的陰影。

因此,我們把上述的 box-shadow 替換成:filter: drop-shadow(0 0 5px #ddd)

這樣,我們就實(shí)現(xiàn)了基于單個(gè)不規(guī)則按鈕的陰影效果。

但是,顯然事情還沒有結(jié)束。

修改布局結(jié)構(gòu),再借助利用 drop-shadow 實(shí)現(xiàn)統(tǒng)一陰影

記得我們上面提到過的 HTML 的布局嗎?正常而言,右側(cè)的主體內(nèi)容和左側(cè)的導(dǎo)航,結(jié)構(gòu)是分離的:

<div class="g-container">

    <div class="g-nav">

        <ul>

            <li>Tab 1</li>

            // ...

        </ul>

    </div>

    <div class="g-main">

        <ul class="g-content">

            <li>...</li>

            // ...

        </ul>

    </div>

</div>

因此,這里最為麻煩的地方在于,左側(cè)按鈕的陰影,需要和右側(cè)的主體內(nèi)容連在一起!,所以當(dāng)我們給右側(cè)的 .g-main 也添加上相同的 filter:drop-shadow() 時(shí),整個(gè)效果會(huì)變得非常奇怪:

// 當(dāng)前被 Hover 的 li

.g-nav li {

    filter: drop-shadow(0 0 5px #ddd)

}

// 右側(cè)的主體

.g-main {

    filter: drop-shadow(0 0 5px #ddd)

}

無論層級誰在上,整體陰影的展示都會(huì)瑕疵:

所以,如果想要實(shí)現(xiàn)整個(gè)元素的陰影是一整個(gè)的整體的效果,我們就不得不另辟蹊徑。

這里,我們的思路如下:

  1. 可以嘗試在 .g-main 中,添加一組與 .g-nav 相同的結(jié)構(gòu),負(fù)責(zé)樣式層面的展示

  2. 把新增的結(jié)構(gòu),利用絕對定位,讓其與實(shí)際的導(dǎo)航位置重疊

  3. 在原本的 .g-nav 中,通過 :has() 偽類,傳遞實(shí)時(shí)的 Hover 狀態(tài)

基于此,我們需要改造一下我們的結(jié)構(gòu):

<div class="g-container">

    <div class="g-nav">

        <ul>

            <li>Tab 1</li>

            <li>Tab 2</li>

            <li>Tab 3</li>

            <li>Tab 4</li>

        </ul>

    </div>

    <div class="g-main">

        <ul class="g-status">

            <li></li>

            <li></li>

            <li></li>

            <li></li>

        </ul>

        <ul class="g-content">

            <li>...</li>

            // ...

        </ul>

    </div>

</div>

仔細(xì)看上面的結(jié)構(gòu),我們多了一組 .g-stauts 結(jié)構(gòu),放置在了 .g-main 之下。其 li 個(gè)數(shù)與實(shí)際的導(dǎo)航 .g-nav 保持一致,并且高寬大小都是一模一樣的。

并且,可以利用絕對定位,讓其完全疊加在 .g-nav 的位置上。

然后,我們把上述類 Chrome Tab 樣式的不規(guī)則按鈕結(jié)構(gòu)的 CSS 代碼結(jié)構(gòu),都賦給 .g-status 下的 li。

此時(shí),由于不規(guī)則按鈕結(jié)構(gòu)和右側(cè)的主體內(nèi)容結(jié)構(gòu),其實(shí)是在一個(gè)父 div 之下,所以,我們只需要給 .g-main 元素添加 filter: drop-shadow(),就可以實(shí)現(xiàn)一整個(gè)整體的陰影效果:

最后,我們利用 :has() 偽類,傳遞實(shí)時(shí)的 Hover 狀態(tài),把內(nèi)外的結(jié)構(gòu)連接起來。

最為核心的代碼如下:

.g-main {

    background: #ddd;

    filter: drop-shadow(0 0 3px #999);

}

.g-status {

    position:absolute;

    left: -160px;

    top: 0;

    width: 160px;


    li {

        width: 160px;

        height: 36px;

        position: relative;

        background: #ddd;

        opacity:0;


        &::before,

        &::after {

            content: "";

            position: absolute;

            right: 0;

            border-radius: unset;

        }

        &::before {

            width: 20px;

            height: 20px;

            top: -20px;

            background: radial-gradient(circle at 0 0, transparent, transparent 19.5px, #ddd 20px, #ddd);

        }

        &::after {

            width: 20px;

            height: 20px;

            bottom: -20px;

            background: radial-gradient(circle at 0 100%, transparent, transparent 19.5px, #ddd 20px, #ddd);

        }

    }

}

.g-status li {

    opacity: 0;

}

.g-nav:has(li:nth-child(1):hover) + .g-main {

    .g-status li:nth-child(1) {

        opacity: 1;

    }

}

.g-nav:has(li:nth-child(2):hover) + .g-main {

    .g-status li:nth-child(2) {

        opacity: 1;

    }

}

.g-nav:has(li:nth-child(3):hover) + .g-main {

    .g-status li:nth-child(3) {

        opacity: 1;

    }

}

.g-nav:has(li:nth-child(4):hover) + .g-main {

    .g-status li:nth-child(4) {

        opacity: 1;

    }

}

什么意思呢?解釋一下:

  1. 事先把每一個(gè) Tab 被 Hover 時(shí)的樣式,都寫在了 .g-stauts 中,并且再提醒一下,這個(gè)結(jié)構(gòu)是在 .g-main 之下的。然后,默認(rèn)設(shè)置隱藏即可;

  2. 實(shí)際觸發(fā) Hover 動(dòng)畫效果,是正常的 .g-nav 下的一個(gè)一個(gè)的 li 結(jié)構(gòu);

  3. 當(dāng) .g-nav 下的一個(gè)一個(gè)的 li 被 Hover 時(shí),我們通過 :has() 偽類,能夠拿到此事件,并且根據(jù)當(dāng)前是第幾個(gè)元素被 hover,對應(yīng)的控制實(shí)際在 .g-main 下的結(jié)構(gòu)進(jìn)行樣式的展示;

不太了解的 :has() 偽類的小伙伴,可以先讀一讀這篇文章 -- 淺談邏輯選擇器 is、where、not、has,此偽類的誕生,填補(bǔ)了在之前 CSS 選擇器中,沒有父選擇器的空缺。讓我們能夠在父元素節(jié)點(diǎn)上,根據(jù)子元素的狀態(tài)變化,做出樣式的調(diào)整。

這樣,我們就最終實(shí)現(xiàn)了我們文章一開始的效果:

文章可能有部分內(nèi)容沒有闡述的很清晰,完整的代碼其實(shí)行數(shù)非常之少,對文章內(nèi)容還不太理解的建議戳進(jìn) DEMO 中看看。

完整的 DEMO 效果:CodePen Demo -- Tab Hover Effect

有小伙伴會(huì)有疑問,為什么不直接在 .g-nav 導(dǎo)航結(jié)構(gòu)和 .g-main 結(jié)構(gòu)的父節(jié)點(diǎn)直接添加 drop-shadow(),不是也可以實(shí)現(xiàn)一樣的效果嗎?

是的,對于本文貼出的代碼效果,是可以實(shí)現(xiàn)一樣的效果。但是,實(shí)際業(yè)務(wù)中,.g-nav 會(huì)更復(fù)雜,它們的共同父元素下也可能還有其他元素,實(shí)際情況遠(yuǎn)比本文貼出來的結(jié)構(gòu)復(fù)雜,因此借助多一層虛擬 ul,實(shí)際上是更好的解法。

最后

好了,本文到此結(jié)束,希望本文對你有所幫助 😃

轉(zhuǎn)自https://www.cnblogs.com/coco1s/p/18142894 作者ChokCoco


該文章在 2024/6/18 14:58:42 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved