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调用XML制作连动下拉列表框
Jun 25 Javascript
背景音乐每次刷新都可以自动更换
Feb 01 Javascript
JQuery 学习笔记 选择器之四
Jul 23 Javascript
js 内存释放问题
Apr 25 Javascript
web网页按比例显示图片实现原理及js代码
Aug 09 Javascript
js完美的div拖拽实例代码
Jan 22 Javascript
select多选 multiple的使用示例
Jun 16 Javascript
原生JS实现旋转木马式图片轮播插件
Apr 25 Javascript
详解Vue SPA项目优化小记
Jul 03 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
Apr 17 Javascript
微信小程序实现订单倒计时
Nov 01 Javascript
ECharts地图绘制和钻取简易接口详解
Jul 12 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
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
全面了解js中的script标签
2016/07/04 Javascript
js实现文字截断功能
2016/09/14 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
教你5分钟学会用requirejs(必看篇)
2017/07/25 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
js实现拖动缓动效果
2020/01/13 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
python中字符串类型json操作的注意事项
2017/05/02 Python
django中模板的html自动转意方法
2018/05/27 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
教师党员一句话承诺
2014/03/28 职场文书
卖车协议书
2014/04/21 职场文书
广告宣传策划方案
2014/05/21 职场文书
房屋维修申请报告
2015/05/18 职场文书
刑事辩护词范文
2015/05/21 职场文书
杨善洲观后感
2015/06/04 职场文书
保险公司岗前培训工作总结
2015/10/24 职场文书
Golang 链表的学习和使用
2022/04/19 Golang
Go web入门Go pongo2模板引擎
2022/05/20 Golang