不可思議的純 CSS 滾動進度條效果

来源:https://www.cnblogs.com/coco1s/archive/2019/01/09/10244168.html
-Advertisement-
Play Games

結論先行,如何使用 CSS 實現下述滾動條效果? 就是頂部黃色的滾動進度條,隨著頁面的滾動進度而變化長短。 在繼續閱讀下文之前,你可以先緩一緩。嘗試思考一下上面的效果或者動手嘗試一下,不藉助 JS ,能否巧妙的實現上述效果。 OK,繼續。這個效果是我在業務開發的過程中遇到的一個類似的小問題。其實即便 ...


結論先行,如何使用 CSS 實現下述滾動條效果?

scrollbar

就是頂部黃色的滾動進度條,隨著頁面的滾動進度而變化長短。

在繼續閱讀下文之前,你可以先緩一緩。嘗試思考一下上面的效果或者動手嘗試一下,不藉助 JS ,能否巧妙的實現上述效果。

OK,繼續。這個效果是我在業務開發的過程中遇到的一個類似的小問題。其實即便讓我藉助 Javascript ,我的第一反應也是,感覺很麻煩啊。所以我一直在想,有沒有可能只使用 CSS 完成這個效果呢?

image

 

分析需求

第一眼看到這個效果,感覺這個跟隨滾動動畫,僅靠 CSS 是不可能完成的,因為這裡涉及了頁面滾動距離的計算。

如果想只用 CSS 實現,只能另闢蹊徑,使用一些討巧的方法。

好,下麵就藉助一些奇技淫巧,使用 CSS 一步一步完成這個效果。分析一下難點:

  • 如何得知用戶當前滾動頁面的距離並且通知頂部進度條?

正常分析應該是這樣的,但是這就陷入了傳統的思維。進度條就只是進度條,接收頁面滾動距離,改變寬度。如果頁面滾動和進度條是一個整體呢?

  

實現需求

不賣關子了,下麵我們運用線性漸變來實現這個功能。

假設我們的頁面被包裹在 <body> 中,可以滾動的是整個 body,給它添加這樣一個從左下到到右上角的線性漸變:

body {
    background-image: linear-gradient(to right top, #ffcc00 50%, #eee 50%);
    background-repeat: no-repeat;
}

那麼,我們可以得到一個這樣的效果:

scrollbar2

Wow,黃色塊的顏色變化其實已經很能表達整體的進度了。其實到這裡,聰明的同學應該已經知道下麵該怎麼做了。

我們運用一個偽元素,把多出來的部分遮住:

body::after {
    content: "";
    position: fixed;
    top: 5px;
    left: 0;
    bottom: 0;
    right: 0;
    background: #fff;
    z-index: -1;
}

為了方便演示,我把上面白色底改成了黑色透明底,:

scrollbar3

實際效果達成了這樣:

scrollbar4

眼尖的同學可能會發現,這樣之後,滑到底的時候,進度條並沒有到底:

image

究其原因,是因為 body 的線性漸變高度設置了整個 body 的大小,我們調整一下漸變的高度:

body {
    background-image: linear-gradient(to right top, #ffcc00 50%, #eee 50%);
    background-size: 100% calc(100% - 100vh + 5px);
    background-repeat: no-repeat;
}

這裡使用了 calc 進行了運算,減去了 100vh,也就是減去一個屏幕的高度,這樣漸變剛好在滑動到底部的時候與右上角貼合。

而 + 5px 則是滾動進度條的高度,預留出 5px 的高度。再看看效果,完美:

scrollbar

至此,這個需求就完美實現拉,算是一個不錯的小技巧,完整的 Demo:

CodePen Demo -- 使用線性漸變實現滾動進度條

image 

別人寫過的東西通常我都不會再寫,這個技巧很早以前就有看到,中午在業務中剛好用到這個技巧就寫下了本文,沒有去考證最先發明這個技巧的是誰。不知道已經有過類似的文章,所以各位也可以看看下麵這篇:

W3C -- 純CSS實現Scroll Indicator(滾動指示器)

  

最後

其實這隻是非常牛逼的漸變非常小的一個技巧。更多你想都想不到的有趣的 CSS 你可以來這裡瞧瞧:

CSS-Inspiration -- CSS靈感

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

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

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

 

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 兩個參數: border-box和content-box 在此不難發現兩個框不同,.border-box那個計算方式為 80(隨著內邊距和邊框的增加而減少) + 10 * 2 (內邊距兩邊)= 100 (不變), 無論內邊距(10)和邊框(忘了加了)怎麼變,它們相加的結果始終等於自己設置的寬度(10 ...
  • 用CSS開啟硬體加速來提高網站性能(轉) 翻譯文章,原文地址:http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css。 你知道我們可以在瀏覽器中用css開啟硬體加速,使GP ...
  • ``` ``` ...
  • 本地 git 服務,通常都會選擇 gitlab。本人最先也是選擇 gitlab,在 centos7 上按照官網的步驟進行安裝,下載的速度難以忍受,無奈放棄。最終選擇在 docker 中安裝 gogs 鏡像來自建 git 服務。 一、安裝 gogs 1、拉取鏡像 2、創建數據目錄 3、創建視窗並運行 ...
  • 文章 "原文地址" 前沿 從前有座山,山裡有座廟,廟裡有個小和尚在講故事、講什麼呢?講的是: 從前有座山,山裡有座廟,廟裡有個小和尚在講故事、講什麼呢?講的是: 從前有座山,山裡有座廟,廟裡有個小和尚在講故事、講什麼呢?講的是: ... 請看一個小故事 以前有一個餐廳,這個餐廳有一個老闆和一個廚師, ...
  • 剛入了這個博客園,發現竟然這麼高的自由度,頁面風格可以自己搞,那還不嗨起來? 於是趕緊搞了一波,有沒有被頭部的昵稱炫到。。。當然也是網上找的一個,拿來看一下效果 廢話不多說。上代碼 就是它了,各位看官可以拿走咯~ 只要在你的博客設置裡面,添加這段樣式,你的昵稱也就這麼酷炫了~ ...
  • html代碼: jq代碼: ...
  • 在網頁開發中,常常遇見這種問題,給定兩個框,A和B,和幾個圖片按鈕,A中存在幾個操作,點擊圖片按鈕,填加至B中,或者從B中移除等,這種效果如何實現,本文加以總結。 幾種效果圖如下: 原始圖: 添加全部功能圖: 移除全部功能圖: 添加選中功能圖: 移除選中功能圖: 實現思路: 1、首先要做出這種效果圖 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...