博客內容進度插件的實現

前面的話

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

 

效果演示

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

  經過使用以下代碼,可將進度插件插入頁面中瀏覽器

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

   因爲目錄和進度都是經常使用的功能,因此,我把進度的功能整合到目錄生成的插件中了app

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

 

原理解釋

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

 

具體實現

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

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,就是用來表示任務的進度或進程的3d

  [注意]IE9-瀏覽器不支持code

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

  若是是IE9-瀏覽器,progress元素被退化爲div元素,僅顯示百分比便可htm

  將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) + '%';    
});
相關文章
相關標籤/搜索