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 函数集合
Jun 11 Javascript
JS修改iframe页面背景颜色的方法
Apr 01 Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
Jul 29 Javascript
jQuery EasyUI菜单与按钮详解
Jul 13 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
Dec 22 Javascript
聊聊JavaScript如何实现继承及特点
Apr 07 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
Dec 08 Javascript
使vue实现jQuery调用的两种方法
May 12 jQuery
Vue + Scss 动态切换主题颜色实现换肤的示例代码
Apr 27 Javascript
VSCode 配置uni-app的方法
Jul 11 Javascript
创建与框架无关的JavaScript插件
Dec 01 Javascript
Vue-router编程式导航的两种实现代码
Mar 04 Vue.js
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数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
2011/10/29 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
为javascript添加String.Format方法
2020/08/11 Javascript
Extjs学习笔记之六 面版
2010/01/08 Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
2011/12/20 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
2017/01/05 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
2018/01/30 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
基于JavaScript的数据结构队列动画实现示例解析
2020/08/06 Javascript
python正则分组的应用
2013/11/10 Python
Python实现查找匹配项作处理后再替换回去的方法
2017/06/10 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
python 定时器,轮询定时器的实例
2019/02/20 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
python中数据库like模糊查询方式
2020/03/02 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
大学生四个方面的自我评价
2013/09/19 职场文书
客户代表实习人员自我鉴定
2013/09/27 职场文书
船舶专业个人求职信范文
2014/01/02 职场文书
《果园机器人》教学反思
2014/04/13 职场文书
消防志愿者活动方案
2014/08/23 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
鸦片战争观后感
2015/06/09 职场文书