原声JavaScript实现滚动条·改1
修正了获取元素相对视口左距离的逻辑问题(之前的函数实际获取的是相对于页面左距离)。去除了调试时忘记删除的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的更多相关文章
- javascript自定义滚动条插件,几行代码的事儿
在实际项目中,经常由于浏览器自带的滚动条样式太戳,而且在各个浏览器中显示不一样,所以我们不得不去实现自定义的滚动条,今天我就用最少的代码实现了一个自定义滚动条,代码量区区只有几十行,使用起来也非常方便 ...
- 比较原声socket 、GCDAsyncSocket
原声socket NSInputStream 输入流(OC)NSOutputStream 输出流(OC)1:通过c语言的输入输出流CFReadStreamRef/CFWirteStreamRef(输入 ...
- 关于ios原声嵌入web页面的问题
当在一个界面中既有原生又有web的时候,如果想让上下整体滑动的话,我们怎么确定web的高度呢,下面分享一下我的心得 首先在webView的代理方法中我们可以获取到加载完整个web页面的高度 - (vo ...
- 大D实例化model-->调用自定义类方法,大M调用原声model方法
class ContactsModel extends Model{ public function addxxx(){ } } $conmodel = D('contacts','Model'); ...
- 移动WEB模拟原声APP滑动删除
移动WEB模拟原声APP滑动删除 效果 代码 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- matrix-gui-2.0 将javascript文件夹改成js文件夹
/******************************************************************************** * matrix-gui-2.0 将 ...
- node.js 安装方法 以及 用原声搭建服务器
node.js 安装方法: 第一步: 64位的安装包网址: https://nodejs.org/dist/v4.4.3/node-v4.4.3-x64.msi 第二步: 进入命令提示框 输入 ...
- 【原】javascript最佳实践
摘要:这篇文章主要内容的来源是<javascript高级程序设计第三版>,因为第二遍读完,按照书里面的规范,发觉自己在工作中没有好好遵守.所以此文也是对自己书写js的一种矫正. 1.可维护 ...
- 【原】javascript数组操作
继续我的第二遍<javascript高级程序设计第三版>,今天要做的笔记是array 一.数组的操作 1.数组的创建: var colors= new Array(); //创建一个数组 ...
随机推荐
- qt小问题
QT如何实现不点击鼠标就能触发 mouseMoveEvent(QMouseEvent *e):setMouseTracking(true) QTableView如何实现单击事件:不需要重写单击事件,而 ...
- InstallShield Limited Edition for Visual Studio 2013 图文教程
http://www.wuleba.com/?p=23892 原文链接
- bootstrap datetimerange
天用的了bootstrap日期插件感觉搜索的资料不是很多在此写下一些使用的心得: 插件开源地址:daterangepicker日期控件, 插件使用只要按照开源中的文档信息来就好先包括以下引用: < ...
- Java Iterator, ListIterator 和 foreach语句使用
Java Iterator, ListIterator 和 foreach语句使用 foreach语句结构: for(part1:part2){part3}; part2 中是一个数组对象,或者是带 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用spring framework的IoC容器功能----->方法一:使用XML文件定义beans之间的依赖注入关系
XML-based configuration metadata(使用XML文件定义beans之间的依赖注入关系) 第一部分 编程思路概述 step1,在XML文件中定义各个bean之间的依赖关系. ...
- Struts——(四)异常处理机制
在通常的情况下,我们得到异常以后,需要将页面导航到一个错误提示的页面,提示错误信息.利用Stuts我们可以采用两种方式处理异常: 1.编程式异常处理 即我们在Action中调用业务逻辑层对象的方法时, ...
- 安装好grunt,cmd 提示"grunt不是内部或外部命令" 怎么办?
Grunt和所有grunt插件都是基于nodejs来运行的,因此,必须安装node.js. (一) 去官网http://nodejs.org/ 下载安装包 node-v6.9.2.msi,直接点击安装 ...
- Symmetric Difference
function sym(args) { //return args; var arr = []; for(var i = 0; i < arguments.length; i++){ arr. ...
- js正则获取图片的src属性及正则分割一个字符串
try{ var str='<P>xczxzxzxcxcxc<IMG src="http://file.ynet.com/2/1612/12/12119048.jp ...
- java多线程详解(3)-线程的互斥与同步
前言:前一篇文章主要描述了多线程中访成员变量与局部变量问题,我们知道访成员变量有线程安全问题,在多线程程序中 我们可以通过使用synchronized关键字完成线程的同步,能够解决部分线程安全问题 在 ...