js 博客内容进度插件详解


Posted in Javascript onFebruary 19, 2017

前面的话

最近在复习自己写的博客,但有的博客内容很长,长到不知道多少时间可以读完。这时,就有种泄气的冲动。但,如果能够提供一个博客内容进度的插件,根据所读内容的多少,显示进度条,让自己对所读的内容进度心里有数,可以让自己平静下来,一点一点读下去。本文将详细介绍博客内容进度插件的实现

效果演示

无论是通过鼠标滚轮,还是拖动滚动条,也或者是按空格键,只要发生了页面的滚动操作,就会触发页面底部博客内容进度条的变化。根据当前内容的多少计算与博客所有内容的比例,最终对应成进度条的宽度。当鼠标移入进度条范围时,会以数字显示出当前的进度百分比

通过使用如下代码,可将进度插件插入页面中

<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来获取其高度即可。且该值是固定不变的,不需在发生滚动事件时再获取,页面加载完成后就可获取

js 博客内容进度插件详解

js 博客内容进度插件详解

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) + '%'; 
});

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
Nov 04 Javascript
jQuery 在光标定位的地方插入文字的插件
May 10 Javascript
javascript数组去重方法汇总
Apr 23 Javascript
js简单实现竖向tab选项卡的方法
May 04 Javascript
javascript如何写热点图
Dec 08 Javascript
jQuery判断浏览器并动态调整select宽度的方法
Mar 02 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
Jun 06 Javascript
Javascript使用SWFUpload进行多文件上传
Nov 16 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
Jul 04 Javascript
JS数组去重常用方法实例小结【4种方法】
May 28 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
Aug 28 Javascript
vue 实现Web端的定位功能 获取经纬度
Aug 08 Javascript
ajax接收后台数据在html页面显示
Feb 19 #Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
Feb 19 #Javascript
JavaScript中无法通过div.style.left获取值的解决方法
Feb 19 #Javascript
JS获取浮动(float)元素的style.left值为空的快速解决办法
Feb 19 #Javascript
Angular 输入框实现自定义验证功能
Feb 19 #Javascript
js实现九宫格的随机颜色跳转
Feb 19 #Javascript
原生JS实现垂直手风琴效果
Feb 19 #Javascript
You might like
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
zend framework多模块多布局配置
2011/02/26 PHP
php删除指定目录的方法
2015/04/03 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
js innerHTML 改变div内容的方法
2013/08/03 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
浅析JavaScript中命名空间namespace模式
2016/06/22 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
DOM事件探秘篇
2017/02/15 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
python模块之paramiko实例代码
2018/01/31 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
英国计算机商店:Technextday
2019/12/28 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
幼师专业求职推荐信
2013/11/08 职场文书
怎样写演讲稿
2014/01/04 职场文书
大学生学习自我评价
2014/01/13 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
2015年女职工工作总结
2015/05/15 职场文书
2016学习医德医风心得体会
2016/01/25 职场文书
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android