原声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(); //创建一个数组 ...
随机推荐
- ORACLE 获取程序当前位置的方法
FUNCTION f_Get_Program_Position RETURN VARCHAR2 IS l_Owner ); l_Name ); l_Lineno NUMBER; l_Type ); B ...
- Emmet (Zen Coding) HTML基本语法
1. 嵌套操作---------- 子操作: > div>ul>li 并列:+ div+ul>li 上级:^ ul>li^div ul>li>a^ ...
- EF外键关联
客户里面存在客服外键 基类模型 public class ModelBase { public ModelBase() { CreateTime = DateTime.Now; } [Key] pub ...
- 关于AFNetworking菊花转圈圈的问题
刚开始接触AFN的时候,发现菊花老是不转,百度到大神的博客上,说AFN里面的API的网络加载菊花默认是关闭的(才发现默认情况下AFN的转圈圈的菊花是关闭的)需要手动打开才能够显示转圈圈,打开的方法是: ...
- linux内核升级图文攻略(转)
一.Linux内核概览Linux是一个一体化内核(monolithic kernel)系统.设备驱动程序可以完全访问硬件.Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置 ...
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
控制台包空指针后跟这个异常,是因为控制层调用service时的失败,无法读到sql,问题在于controller在引入的service没有自动装配,在引入多个service时,每个service都要自 ...
- php常用的字符串函数
addslashes -- 使用反斜线引用字符串 chr -- 返回相对应于 ascii 码值所指定的单个字符. chunk_split -- 将字符串分割成小块 count_chars -- 返回 ...
- 'autocomplete="off"'在Chrome 中不起作用
大家都知道autocomplete属性是表单字段中的HTML5新属性,该属性有两种状态值,分别为"on" 和 "off",该属性可省略:省略属性值后默认值为&q ...
- agsXMPP参考代码
agsXMPP 1.删除好友 XmppCon.RosterManager.RemoveRosterItem(node.RosterItem.Jid); 2.注销用户 void userConn_OnL ...
- ReportViewer内存泄漏问题解决方案[上]
做这个项目有点倒霉,快要验收的时候,发现微软ReportViewer控件的一个bug,导致我们的项目无法正常验收. 问题描叙:用ReportViewer本地模式做的报表,在ASP.NET页面中呈现.在 ...