利用純CSS如何在捲動時自動加入頭部陰影?以下這篇文章跟大家介紹一下CSS層級小技巧!看看在滾動時自動添加頭部陰影的方法,希望對大家有所幫助!
在網頁中,經常會用陰影來突出層級關係,特別是頂部導航,但有時候設計覺得沒必要一開始就顯示陰影,只有滾動後才出現。例如下面這個例子,注意觀察頭部陰影。 【推薦學習:css影片教學】
#可以看到,只有捲動以後才出現陰影。一般情況下,使用JS 監聽滾動事件動態添加類別名稱就可以實現,不過經過我的一番嘗試,發現這種效果僅使用CSS 也能輕易實現,下面是實現效果
你也可以提前造訪CSS auto header shadow(codepen.io) 查看實際效果。那如何實現的呢,花兩分鐘時間看看吧~
假設有這樣一個佈局
<header>LOGO</header> <main>很多内容文本</main>
#簡單修飾一下
header{ background: #fff; font-size: 20px; padding: 10px; }
頭部固定定位有很多種方式,比較常見的是使用fixed
定位
header{ position: fixed; top: 0 }
但是,fixed
定位是不佔空間的,會導致遮蔽內容區域,所以一般還需要預留頭部一部分空間出來,比如這樣
main{ margin-top: 头部的高度 }
在這裡,我更推薦使用sticky
定位,在吸頂的同時,還能保留原有的佔位
header{ position: sticky; top: 0 }
效果如下,只是沒有陰影
實現這個效果,需要一點點「CSS 障眼法」。假設有一層陰影,在預設情況下用一個元素遮擋起來,以下都稱之為「遮擋物」。這裡需要考慮好各個部分的層級關係,稍微有些複雜,如下所示(側面層級關係圖)
層級關係為: 頭部> 遮擋物> 陰影> 內容
在滾動過程中,陰影就自動就可見了,遮擋物正好又會被頭部遮住,注意,遮擋物和內容是一起滾動的,動態示範如下
原理就是這樣,看具體實作
根據上述原理,這裡需要加入一個元素,陰影和遮蔽物都可以用偽元素產生
<header>LOGO</header> <shadow></shadow> <main>很多内容文本</main>
這裡陰影的位置是固定的,也不需要佔據空間,所以可以直接用fixed
定位,也可以不設定top
值,因為預設就位於非定位時的位置(又體現出sticky
的好處了),也就是頭部下面
shadow::before{ content: ''; box-shadow: 0 0 10px 1px #333; position: fixed; /*无需 top 值*/ width: 100%; }
fixed
定位在不設定top 或left 值時,仍然位於原先位置,但是會在這個位置固定下來
遮擋物可以用純色填充,而且需要跟隨內容滾動,也不需要佔據空間,同時也為了提升層級,可以設定一個absolute
定位
shadow::after{ content: ''; width: 100%; height: 15px; background: #fff; position: absolute; /*无需 top 值*/ }
absolute
定位在不設定top 或left 值時,仍位於原先位置,也會跟隨內容滾動
現在再來看看層級關係,頭部、陰影、遮蔽物都設定了定位 ,依照dom 先後順序,此時
層級關係為:遮蔽物> 陰影> 頭部> 內容
頭部應該是最高的,所以需要單獨改變一下層級
header{ /**/ z-index: 1; }
層級關係為:頭部> 遮擋物> 陰影 > 內容
這樣就實現了文章開頭所示效果,效果如下
其实上面的效果已经很好了,但是稍微有点生硬。仔细观察,在慢慢滚动过程中,阴影有一种“向上推进”的感觉,如下
有没有办法让这个过程更柔和一点呢?比如透明度的变化?
当然也是可以的,实现也比较简单。上面比较生硬的原因是,遮挡物是纯色的,如果换成半透明渐变是不是就好一些呢?
shadow::after{ height: 30px; background: linear-gradient(to bottom, #fff 50% , transparent); }
效果如下
这样阴影出现的效果就不再是“向上推进”的效果,你觉得怎么样呢?
重点来了~下面是完整 CSS 代码(20行不到~)
header{ position: sticky; background: #fff; top: 0; font-size: 20px; padding: 10px; z-index: 1; } shadow::before{ content: ''; box-shadow: 0 0 10px 1px #333; position: fixed; width: 100%; } shadow::after{ content: ''; width: 100%; height: 30px; background: linear-gradient(to bottom, #fff 50% , transparent); position: absolute; }
HTML 结构也很简单
<header>LOGO</header> <shadow></shadow> <main>很多内容文本</main>
你可以访问在线链接 CSS auto header shadow(codepen.io):
https://codepen.io/xboxyan/pen/yLvdgXw
以上就是全部分享内容了,是不是又掌握一个 CSS 小技巧?用到了3个定位属性,几乎零成本,复制几行代码,马上就可以用起来了,下面总结一下实现要点:
固定头部的布局推荐用 sticky
实现,好处是可以保留头部占位,无需额外预留
整体实现思路是CSS 障眼法和 CSS 层级,相互遮挡
fixed
定位在不设置 top 或者 left 值时,仍然位于原先位置,但是会在这个位置固定下来
absolute
定位在不设置 top 或者 left 值时,仍然位于原先位置,也会跟随内容滚动
纯色遮挡在滚动时有些生硬,半透明渐变遮挡在滚动时会更加柔和
在未来,像这类滚动相关的交互都可以通过@scroll-timeline
来实现,有兴趣的可以提前了解这方面内容,只是现在几乎不可实际生产使用(目前需要手动开启实验特性),可以预料,随着 CSS 新特性的不断发展,像这类“CSS 奇技淫巧”肯定会被官方逐步替代,体验也会更加完善,但并,并不是说这些思考是无用了,实际需求千千万,官方不可能一一照顾到,就算有规划,有草案,可能已经是多年以后了,所以学习 CSS 一定不要停止思考,停止想象,这大概也是 CSS 比较有趣的地方吧~
(学习视频分享:web前端入门)
以上是利用純CSS如何在滾動時自動添加頭部陰影的詳細內容。更多資訊請關注PHP中文網其他相關文章!