博客內容進度插件的實現

来源:http://www.cnblogs.com/xiaohuochai/archive/2017/02/18/6412921.html
-Advertisement-
Play Games

[1]效果演示 [2]原理解釋 [3]具體實現 [4]插件代碼 ...


前面的話

  最近在複習自己寫的博客,但有的博客內容很長,長到不知道多少時間可以讀完。這時,就有種泄氣的衝動。但,如果能夠提供一個博客內容進度的插件,根據所讀內容的多少,顯示進度條,讓自己對所讀的內容進度心裡有數,可以讓自己平靜下來,一點一點讀下去。本文將詳細介紹博客內容進度插件的實現

 

效果演示

  無論是通過滑鼠滾輪,還是拖動滾動條,也或者是按空格鍵,只要發生了頁面的滾動操作,就會觸發頁面底部博客內容進度條的變化。根據當前內容的多少計算與博客所有內容的比例,最終對應成進度條的寬度。當滑鼠移入進度條範圍時,會以數字顯示出當前的進度百分比

  通過使用如下代碼,可將進度插件插入頁面中

<script src="http://files.cnblogs.com/files/xiaohuochai/progress.js"></script>

   由於目錄和進度都是常用的功能,所以,我把進度的功能整合到目錄生成的插件中了

<script src="http://files.cnblogs.com/files/xiaohuochai/catalog.js"></script>

 

原理解釋

  上面已經簡明扼要的說明瞭進度條的原理,而實現起來也不困難。在觸發滾動事件時,計算兩個高度值。一個值H用來表示整篇博客內容的底部離頁面頂端的距離。一個值h用來表示當前視窗內博客內容的底部離頁面頂端的距離。從而比例值radio = h/H,就是進度百分比,以進度條的寬度變化顯示出來

 

具體實現

  【1】獲取博客內容總高度H,如下圖所知,博客園將博客內容放在id為cnblogs_post_body的div內,通過scrollHeight來獲取其高度即可。且該值是固定不變的,不需在發生滾動事件時再獲取,頁面載入完成後就可獲取

function addEvent(target,type,handler){
    if(target.addEventListener){
        target.addEventListener(type,handler,false);
    }else{
        target.attachEvent('on'+type,function(event){
            return handler.call(target,event);
        });
    }
}
var H;
addEvent(window,'load',function(){
    H = cnblogs_post_body.scrollHeight;
});

  【2】獲取當前頁面視窗中顯示的博客內容高度h,h實際上就是頁面的滾動距離h2

var h = document.documentElement.scrollTop || document.body.scrollTop;

  【3】進度條實現,通過H和h,可以計算出比例繫數radio = h/H。HTML5新增了一個表單類控制項progress,就是用來表示任務的進度或進程的

  [註意]IE9-瀏覽器不支持

<progress id="progress" value="" max=""></progress>

  如果是IE9-瀏覽器,progress元素被退化為div元素,僅顯示百分比即可

  將progress的max值設置為H,將value值設置為h。滾動事件觸發時,更新value值即可

addEvent(window,'scroll',function(){
    var h = document.documentElement.scrollTop || document.body.scrollTop;
    progress.value =  h;
    var radio = (h/H >= 1) ? 1 : h/H;
    progress.innerHTML = progress.title =  Math.floor(100*radio) + '%';    
});

  【4】樣式設置

  進度條的樣式設置較為簡單,將其固定定位,居於頁面底部,並與視窗寬度相同

.progress{
    position:fixed;
    left:0;
    right:0;
    bottom:0;
    width:100%;
    height:12px;
    text-align:center;
    font:12px/12px "宋體";
}

  【5】動態腳本

  由於最終將以插件的形式呈現,所有的代碼都需要動態生成

var progress = document.createElement('progress');
progress.id = 'progress';
document.body.appendChild(progress);

 

插件代碼

//事件相容
function addEvent(target,type,handler){
    if(target.addEventListener){
        target.addEventListener(type,handler,false);
    }else{
        target.attachEvent('on'+type,function(event){
            return handler.call(target,event);
        });
    }
}
//生成元素
var progress = document.createElement('progress');
progress.id = 'progress';
progress.style.cssText = 'position:fixed;left:0;right:0;bottom:0;width:100%;height:12px;text-align:center;font:12px/12px "宋體";';
document.body.appendChild(progress);

//計算H
var H;
addEvent(window,'load',function(){
    progress.max = H = cnblogs_post_body.scrollHeight;
});

//計算h及radio
addEvent(window,'scroll',function(){
    var h = document.documentElement.scrollTop || document.body.scrollTop;
    progress.value =  h;
    var radio = (h/H >= 1) ? 1 : h/H;
    progress.innerHTML = progress.title =  Math.floor(100*radio) + '%';    
});

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

-Advertisement-
Play Games
更多相關文章
  • html代碼: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <title>輪播圖練習</title> <link rel="stylesheet" href="css/css.css" type="text/css"/ ...
  • 動態顯示目錄的作用 不用每次寫博客的時候繁瑣的人工整理目錄,又可以動態浮動在右下角,方便快速跳到感興趣的位置同時也可以快速的對文章內容有一個大概的瞭解。 實現原理 首先根據個人喜好,我習慣了用 h1 來做分類。所以本篇內容也主要是針對h1來提取目錄。 如何提取出來h1呢? 先來看這張圖,以獵豹瀏覽器 ...
  • 一、為什麼使用RequireJS? <script src="a.js"></script> <script src="b.js"></script> <script src="c.js"></script> <script src="b.js"></script> <script src="c.j ...
  • 個人在移動端的一些總結歸納,有新的知識點會一直更新 一.css部分 1.meta標簽 <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/> 移動端加上這個標簽才是真正的自適應,不加的 ...
  • 1 . 相對定位relative:顧名思義,相對定位是相對於自己的位置來進行偏移,如下圖: 以盒子中心為基準,為每條邊的正方向,例: 向右移動20px : 代碼為left:20px;或者right:-20px; 向下移動20px : 代碼為top:20px;或者bottom:-20px; 2 . 絕 ...
  • 直入正題,JS打開攝像頭並截圖上傳至後端的一個完整步驟 1. 打開攝像頭主要用到getUserMedia方法,然後將獲取到的媒體流置入video標簽 2. 截取圖片主要用到canvas繪圖,使用drawImage方法將video的內容繪至canvas中 3. 將截取的內容上傳至伺服器,將canvas ...
  • 下麵舉一些小例子: 先假設的創建一個上下文環境 1.canvas做灰色圖像: 個人認為主要的知識點在於: (1)獲取當前畫布中圖像的各個像素點的值; (2)灰色圖像的求解方式(r+g+b)/3,再將這個值賦給原來的像素的R、G、B; (3)在用新的顏色值畫一張圖片 2.canvas刮刮樂 個人認為主 ...
  • No1. 必須搭建java環境 只需要最基礎的java環境,也就是cmd下可以運行java和javac即可, 具體教程請自行百度,都會有很詳細的教程,這裡不重點介紹。 No2. 下載安裝HBuilder 請在這裡下載HBuilder:http://www.dcloud.io/, 下載完成後請將zip ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...