修正了获取元素相对视口左距离的逻辑问题(之前的函数实际获取的是相对于页面左距离)。去除了调试时忘记删除的mouseleave事件。将创建滚动条的功能单独列为一个函数。

添加了鼠标点在滚动条什么位置,就立即卷动到什么位置的功能;添加了键盘左右键滚动的功能(滚动距离为一个内容页面)

<!DOCTYPE html>
<html>
<head>
<title>A demo</title>
<meta http-equiv="content-type" name="author" content="Fujihara No Kokukiyo" />
<meta charset="utf-8" />
</head>
<style rel="stylesheet" type="text/css">
.outer{width:500px;border:1px solid black;overflow:hidden;margin:50px 0 0 100px;}
.test_div{width:1200px;background-image:linear-gradient(90deg,lightcoral 0%,lightgreen 50%,lightblue 100%);height:150px;}
.slider_bar,.slider_block{ border-radius:5px;}
.slider_bar{position:relative;width:80%;margin:5px auto 5px auto;background-color:lightgreen;height:5px;}
.slider_block{width:20px;height:5px;background-color:grey;cursor:pointer;position:absolute;}
</style>
<script type="text/javascript">
window.onload=function(){
function Slider(slider_content){
var slider_instance=this;
this.slider_content=slider_content;
this.outer=slider_content.parentNode; createSlider(); this.slider_content_width=this.slider_content.offsetWidth-this.outer.clientWidth;
this.slider_bar_width=this.slider_bar.clientWidth-this.slider_block.offsetWidth; this.slider_content_left=0;
this.slider_block_left=0; this.slider_bar_pageLeft=getPageLeft(this.slider_bar); this.slider_block.addEventListener("mousedown",mousedownHandler,false);
this.outer.addEventListener("mouseup",mouseupHandler,false);
this.slider_bar.addEventListener("click",sliderbarClickHandler,false);
this.outer.addEventListener("keydown",sliderbarKeydownHandler,false); function createSlider(){
slider_instance.slider_bar=document.createElement("div");
slider_instance.slider_bar.className="slider_bar";
slider_instance.slider_block=document.createElement("div");
slider_instance.slider_block.className="slider_block";
slider_instance.slider_bar.appendChild(slider_instance.slider_block);
slider_instance.outer.appendChild(slider_instance.slider_bar);
}
function mousedownHandler(event){
slider_instance.mouseLeft=event.clientX-getPageLeft(this);
slider_instance.outer.addEventListener("mousemove",mousemoveHandler,false);
}
function mousemoveHandler(event){
var blockLeft=event.clientX-slider_instance.slider_bar_pageLeft-slider_instance.mouseLeft;
if(blockLeft>slider_instance.slider_bar_width){
blockLeft=slider_instance.slider_bar_width
}else if(blockLeft<0){
blockLeft=0;
}
slider_instance.slider_block.style.left=blockLeft+"px";
slider_instance.slider_content.style.marginLeft="-"+(blockLeft/slider_instance.slider_bar_width*slider_instance.slider_content_width)+"px";
}
function mouseupHandler(event){
slider_instance.outer.removeEventListener("mousemove",mousemoveHandler,false);
}
function sliderbarClickHandler(event){
if(event.target!=slider_instance.slider_block){
var blockLeft=event.clientX-slider_instance.slider_bar_pageLeft-slider_instance.slider_block.offsetWidth/2;
if(blockLeft>slider_instance.slider_bar_width){
blockLeft=slider_instance.slider_bar_width
}else if(blockLeft<0){
blockLeft=0;
}
slider_instance.slider_block.style.left=blockLeft+"px";
slider_instance.slider_content.style.marginLeft="-"+(blockLeft/slider_instance.slider_bar_width*slider_instance.slider_content_width)+"px";;
}
}
function sliderbarKeydownHandler(event){
var newMarginLeft,scrollPercent;
switch(event.keyCode){
//left
case 39:{
if(parseInt(slider_instance.slider_content.style.marginLeft)!=slider_instance.slider_content_width){
newMarginLeft=parseInt(slider_instance.slider_content.style.marginLeft)-slider_instance.outer.clientWidth;
if(-newMarginLeft>slider_instance.slider_content_width){
newMarginLeft=-slider_instance.slider_content_width;
}
scrollPercent=-newMarginLeft/slider_instance.slider_content_width;
slider_instance.slider_content.style.marginLeft=newMarginLeft+"px";
slider_instance.slider_block.style.left=scrollPercent*slider_instance.slider_bar_width+"px";
}
break;
}
case 37:{
if(parseInt(slider_instance.slider_content.style.marginLeft)!=0){
newMarginLeft=parseInt(slider_instance.slider_content.style.marginLeft)+slider_instance.outer.clientWidth;
if(newMarginLeft>0){
newMarginLeft=0;
}
scrollPercent=-newMarginLeft/slider_instance.slider_content_width;
slider_instance.slider_content.style.marginLeft=newMarginLeft+"px";
slider_instance.slider_block.style.left=scrollPercent*slider_instance.slider_bar_width+"px";
}
break;
}
}
}
function getPageLeft(el){
return el.getBoundingClientRect().left;
}
}
new Slider(document.getElementsByClassName("test_div")[0]); }
</script>
<body>
<div class="outer" tabindex="1">
<div class="test_div"></div>
</div>
</body>
</html>

原声JavaScript实现滚动条·改1的更多相关文章

  1. javascript自定义滚动条插件,几行代码的事儿

    在实际项目中,经常由于浏览器自带的滚动条样式太戳,而且在各个浏览器中显示不一样,所以我们不得不去实现自定义的滚动条,今天我就用最少的代码实现了一个自定义滚动条,代码量区区只有几十行,使用起来也非常方便 ...

  2. 比较原声socket 、GCDAsyncSocket

    原声socket NSInputStream 输入流(OC)NSOutputStream 输出流(OC)1:通过c语言的输入输出流CFReadStreamRef/CFWirteStreamRef(输入 ...

  3. 关于ios原声嵌入web页面的问题

    当在一个界面中既有原生又有web的时候,如果想让上下整体滑动的话,我们怎么确定web的高度呢,下面分享一下我的心得 首先在webView的代理方法中我们可以获取到加载完整个web页面的高度 - (vo ...

  4. 大D实例化model-->调用自定义类方法,大M调用原声model方法

    class ContactsModel extends Model{ public function addxxx(){ } } $conmodel = D('contacts','Model'); ...

  5. 移动WEB模拟原声APP滑动删除

    移动WEB模拟原声APP滑动删除 效果 代码 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  6. matrix-gui-2.0 将javascript文件夹改成js文件夹

    /******************************************************************************** * matrix-gui-2.0 将 ...

  7. node.js 安装方法 以及 用原声搭建服务器

    node.js 安装方法: 第一步: 64位的安装包网址:   https://nodejs.org/dist/v4.4.3/node-v4.4.3-x64.msi 第二步: 进入命令提示框  输入 ...

  8. 【原】javascript最佳实践

    摘要:这篇文章主要内容的来源是<javascript高级程序设计第三版>,因为第二遍读完,按照书里面的规范,发觉自己在工作中没有好好遵守.所以此文也是对自己书写js的一种矫正. 1.可维护 ...

  9. 【原】javascript数组操作

    继续我的第二遍<javascript高级程序设计第三版>,今天要做的笔记是array 一.数组的操作 1.数组的创建: var colors= new Array(); //创建一个数组 ...

随机推荐

  1. 团队编程——web应用之人事管理系统

    本次作业为团队作业,团队博客要求如下:1. 介绍团队情况:包括队长.成员.队名.成员照片.队训--.等:2. 介绍团队项目名称.总体任务,各成员任务等:3. 每个队做 一次需求调研(针对团队项目),要 ...

  2. arguments 对象

    在函数体内,标识符arguments是指向实参对象的引用,实参对象是一个类数组对象 arguments[0],arguments.length arguments是什么? 答:1:arguments是 ...

  3. Linux下MySQL数据库常用基本操作 一

    1.显示数据库 show databases; 2.选择数据库 use 数据库名; 3.显示数据库中的表 show tables; 4.显示数据表的结构 describe 表名; 5.显示表中记录 S ...

  4. Java 如何跳出多重嵌套循环体?

    1. 在最外层循环语句前定义一个标号,循环体内任意位置都可以使用带有标号的break语句跳出外层循环,结束整个循环. System.out.println("MainClass1 Start ...

  5. String类的构造方法详解

    package StringDemo; //String类的构造方法详解 //方法一:String(); //方法二:String(byte[] bytes) //方法三:String (byte[] ...

  6. lucene历史版本地址

    http://archive.apache.org/dist/lucene/java/

  7. 关于js闭包的误区

    一直以为js的闭包只是内部函数保存了一份外部函数的变量值副本,但是以下代码打破了我的认识: function createFunctions() { var result = new Array(); ...

  8. JavaWeb 学习009-4个页面,5条sql语句(添加、查看、修改、删除)

    ===========++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++==+++++++++ 2016-12-3------ ...

  9. mysql学习(1)-linux操作系统源码包安装

    背景: CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.22. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server ...

  10. 查看Oracle中是否有锁表的sql

    1.查看是否有锁表的sql 代码如下: select 'blocker('||lb.sid||':'||sb.username||')-sql:'|| qb.sql_text blockers, 'w ...