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 相关文章推荐
js实现表单多按钮提交action的处理方法
Oct 24 Javascript
js获取时间精确到秒(年月日)
Mar 16 Javascript
BootStrap实现树形目录组件代码详解
Jun 21 Javascript
使用Angular缓存父页面数据的方法
Jan 03 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
Mar 15 Javascript
jquery仿微信聊天界面
May 06 jQuery
Angular2使用jQuery的方法教程
May 28 jQuery
angular ng-click防止重复提交实例
Jun 16 Javascript
vuex的使用及持久化state的方式详解
Jan 23 Javascript
vue组件的写法汇总
Apr 12 Javascript
layer扩展打开/关闭动画的方法
Sep 23 Javascript
微信小程序实现canvas分享朋友圈海报
Jun 21 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
php与php MySQL 之间的关系
2009/07/17 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
js实现右键菜单功能
2016/11/28 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
ionic 自定义弹框效果
2017/06/27 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
详解Python3注释知识点
2019/02/19 Python
python如何删除文件中重复的字段
2019/07/16 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
python 操作hive pyhs2方式
2019/12/21 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
Python requests获取网页常用方法解析
2020/02/20 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
2020/05/20 Python
python打包多类型文件的操作方法
2020/09/21 Python
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
2013届毕业生求职信范文
2013/11/20 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
体育比赛口号
2014/06/09 职场文书
师范生求职信
2014/06/14 职场文书
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL