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 相关文章推荐
JQuery获取各种宽度、高度(format函数)实例
Mar 04 Javascript
打印json对象的内容及JSON.stringify函数应用
Mar 29 Javascript
jquery通过visible来判断标签是否显示或隐藏
May 08 Javascript
Bootstrap每天必学之下拉菜单
Nov 25 Javascript
jQuery添加和删除指定标签的方法
Dec 16 Javascript
7个去伪存真的JavaScript面试题
Jan 07 Javascript
原生JavaScript实现滚动条效果
Mar 24 Javascript
jQuery回到顶部的代码
Jul 09 Javascript
Bootstrap Table使用整理(二)
Jun 09 Javascript
react-router browserHistory刷新页面404问题解决方法
Dec 29 Javascript
Angular5中提取公共组件之radio list的实例代码
Jul 10 Javascript
node.js中npm包管理工具用法分析
Feb 14 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
制作美丽的拉花
2021/03/03 冲泡冲煮
安装APACHE
2007/01/15 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
php上传大文件设置方法
2016/04/14 PHP
使用ltrace工具跟踪PHP库函数调用的方法
2016/04/25 PHP
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
jQuery中$.each()函数的用法引申实例
2016/05/12 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
详解微信小程序用定时器实现倒计时效果
2019/04/30 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
python机器学习之神经网络(一)
2017/12/20 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
皇家阿尔伯特瓷器美国官网:Royal Albert美国
2020/02/16 全球购物
关于Java String的一道面试题
2013/09/29 面试题
Android面试题及答案
2015/09/04 面试题
高中同学聚会邀请函
2014/01/11 职场文书
春季运动会开幕词
2015/01/28 职场文书
教师节老师寄语
2015/05/28 职场文书
实验心得体会范文
2016/01/25 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏