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 $.each的用法说明
Mar 22 Javascript
jquery 如何动态添加、删除class样式方法介绍
Nov 07 Javascript
jQuery实现tab选项卡效果的方法
Jul 08 Javascript
jquery取消事件冒泡的三种方法(推荐)
May 28 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
Jul 01 Javascript
Laravel中常见的错误与解决方法小结
Aug 30 Javascript
纯JavaScript手写图片轮播代码
Oct 20 Javascript
微信小程序 支付后台java实现实例
May 09 Javascript
完美解决linux下node.js全局模块找不到的情况
May 16 Javascript
对layui中表单元素的使用详解
Aug 15 Javascript
vue学习笔记之Vue中css动画原理简单示例
Feb 29 Javascript
JS面向对象编程——ES6 中class的继承用法详解
Mar 03 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 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
JavaScript的public、private和privileged模式
2009/12/28 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
JavaScript页面模板库handlebars的简单用法
2015/03/02 Javascript
JS通过ajax动态读取xml文件内容的方法
2015/03/24 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
Python with的用法
2014/08/22 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
TensorFlow实现简单的CNN的方法
2019/07/18 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
C语言面试题
2013/05/19 面试题
客户代表自我评价范例
2013/09/24 职场文书
家长对孩子评语
2014/01/30 职场文书
教师网络培训感言
2014/03/09 职场文书
创业女性典型材料
2014/05/02 职场文书
情况说明书格式范文
2014/05/06 职场文书
给客户的感谢信
2015/01/21 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python
centos7安装mysql5.7经验记录
2022/05/02 Servers