js 博客內(nèi)容進(jìn)度插件詳解
前面的話
最近在復(fù)習(xí)自己寫的博客,但有的博客內(nèi)容很長,長到不知道多少時(shí)間可以讀完。這時(shí),就有種泄氣的沖動(dòng)。但,如果能夠提供一個(gè)博客內(nèi)容進(jìn)度的插件,根據(jù)所讀內(nèi)容的多少,顯示進(jìn)度條,讓自己對所讀的內(nèi)容進(jìn)度心里有數(shù),可以讓自己平靜下來,一點(diǎn)一點(diǎn)讀下去。本文將詳細(xì)介紹博客內(nèi)容進(jìn)度插件的實(shí)現(xiàn)
效果演示
無論是通過鼠標(biāo)滾輪,還是拖動(dòng)滾動(dòng)條,也或者是按空格鍵,只要發(fā)生了頁面的滾動(dòng)操作,就會(huì)觸發(fā)頁面底部博客內(nèi)容進(jìn)度條的變化。根據(jù)當(dāng)前內(nèi)容的多少計(jì)算與博客所有內(nèi)容的比例,最終對應(yīng)成進(jìn)度條的寬度。當(dāng)鼠標(biāo)移入進(jìn)度條范圍時(shí),會(huì)以數(shù)字顯示出當(dāng)前的進(jìn)度百分比
通過使用如下代碼,可將進(jìn)度插件插入頁面中
<script src=">
由于目錄和進(jìn)度都是常用的功能,所以,我把進(jìn)度的功能整合到目錄生成的插件中了
<script src=">
原理解釋
上面已經(jīng)簡明扼要的說明了進(jìn)度條的原理,而實(shí)現(xiàn)起來也不困難。在觸發(fā)滾動(dòng)事件時(shí),計(jì)算兩個(gè)高度值。一個(gè)值H用來表示整篇博客內(nèi)容的底部離頁面頂端的距離。一個(gè)值h用來表示當(dāng)前窗口內(nèi)博客內(nèi)容的底部離頁面頂端的距離。從而比例值radio = h/H,就是進(jìn)度百分比,以進(jìn)度條的寬度變化顯示出來
具體實(shí)現(xiàn)
【1】獲取博客內(nèi)容總高度H,如下圖所知,博客園將博客內(nèi)容放在id為cnblogs_post_body的div內(nèi),通過scrollHeight來獲取其高度即可。且該值是固定不變的,不需在發(fā)生滾動(dòng)事件時(shí)再獲取,頁面加載完成后就可獲取
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】獲取當(dāng)前頁面窗口中顯示的博客內(nèi)容高度h,h實(shí)際上就是頁面的滾動(dòng)距離h2
var h = document.documentElement.scrollTop || document.body.scrollTop;
【3】進(jìn)度條實(shí)現(xiàn),通過H和h,可以計(jì)算出比例系數(shù)radio = h/H。HTML5新增了一個(gè)表單類控件progress,就是用來表示任務(wù)的進(jìn)度或進(jìn)程的
[注意]IE9-瀏覽器不支持
<progress id="progress" value="" max=""></progress>
如果是IE9-瀏覽器,progress元素被退化為div元素,僅顯示百分比即可
將progress的max值設(shè)置為H,將value值設(shè)置為h。滾動(dòng)事件觸發(fā)時(shí),更新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】樣式設(shè)置
進(jìn)度條的樣式設(shè)置較為簡單,將其固定定位,居于頁面底部,并與窗口寬度相同
.progress{ position:fixed; left:0; right:0; bottom:0; width:100%; height:12px; text-align:center; font:12px/12px "宋體"; }
【5】動(dòng)態(tài)腳本
由于最終將以插件的形式呈現(xiàn),所有的代碼都需要?jiǎng)討B(tài)生成
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); //計(jì)算H var H; addEvent(window,'load',function(){ progress.max = H = cnblogs_post_body.scrollHeight; }); //計(jì)算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) + '%'; });
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
- node.js實(shí)現(xiàn)博客小爬蟲的實(shí)例代碼
- 用js實(shí)現(xiàn)博客打賞功能
- 利用JS生成博文目錄及CSS定制博客
- JS實(shí)現(xiàn)新浪博客左側(cè)的Blog管理菜單效果代碼
- 基于jsp+servlet實(shí)現(xiàn)的簡單博客系統(tǒng)實(shí)例(附源碼)
- javascript實(shí)現(xiàn)博客園頁面右下角返回頂部按鈕
- js使用ajax讀博客rss示例
- 博客側(cè)邊欄模塊跟隨滾動(dòng)條滑動(dòng)固定效果的實(shí)現(xiàn)方法(js+jquery等)
- 用js實(shí)現(xiàn)的仿sohu博客更換頁面風(fēng)格(簡單版)
- nodejs個(gè)人博客開發(fā)第七步?后臺登陸
相關(guān)文章
javascript動(dòng)態(tài)獲取登錄時(shí)間和在線時(shí)長
這篇文章主要為大家詳細(xì)介紹了javascript動(dòng)態(tài)獲取登錄時(shí)間和在線時(shí)長的相關(guān)資料,獲得登錄時(shí)候的時(shí)間,用來和動(dòng)態(tài)的時(shí)間做差來求時(shí)長,感興趣的小伙伴們可以參考一下2016-02-02JS中new?Blob()詳解及blob轉(zhuǎn)file示例
這篇文章主要給大家介紹了關(guān)于JS中new?Blob()詳解及blob轉(zhuǎn)file的相關(guān)資料,Blob?Blob(Binary?Large?Object)表示二進(jìn)制類型的大對象,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11JS字符串統(tǒng)計(jì)操作示例【遍歷,截取,輸出,計(jì)算】
這篇文章主要介紹了JS字符串統(tǒng)計(jì)操作,結(jié)合實(shí)例形式分析了javascript字符串的遍歷,截取,輸出,計(jì)算等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-03-03JavaScript截取字符串的Slice、Substring、Substr函數(shù)詳解和比較
這篇文章主要介紹了JavaScript截取字符串的Slice、Substring、Substr函數(shù)詳解和比較,需要的朋友可以參考下2014-03-03Layui數(shù)據(jù)表格之獲取表格中所有的數(shù)據(jù)方法
今天小編就為大家分享一篇Layui數(shù)據(jù)表格之獲取表格中所有的數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08js實(shí)現(xiàn)帶圓角的兩級導(dǎo)航菜單效果代碼
這篇文章主要介紹了js實(shí)現(xiàn)帶圓角的兩級導(dǎo)航菜單效果代碼,涉及javascript鼠標(biāo)事件及頁面元素樣式動(dòng)態(tài)變換技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-08-08