原生js模拟滚动条

滚动条的基本交互有两个,鼠标拖拽滚动条和滚轮滚动。

滚动条涉及到的dom元素:1、主体区域(obj,box2与box4的父元素),鼠标滚动的触发主体,包含内容和滚动条,宽高自定。2、滚动条(box1),宽自定,高按内容区比例计算。3、滚动区域(box2,box1的父节点),高与内容可视区的高相同,宽自定。4、内容(box3,滚动的内容主体)。5、内容(box4,box3的父元素,有限宽高,内容可视区)。

实现的基本原理就是以上元素绝对定位,通过鼠标的交互事件,来完成相关dom的top值,已达到模拟滚动条的目的。

function scrollbar(obj,box1,box2,box3,box4){ 
	var oBox=document.getElementById(obj);
	var oBar=document.getElementById(box1);
	var oRight=document.getElementById(box2);
	var oCon=document.getElementById(box3);
	var oLeft=document.getElementById(box4);
	//算滚动快的高度
	oBar.style.height=oLeft.offsetHeight/oCon.offsetHeight*oRight.offsetHeight+‘px‘;      
        //添加滚动快拖动的事件
	oBar.onmousedown=function(ev){
		var oEvent=ev || event;
		console.log(oEvent.clientY);
		var disY=oEvent.clientY-oBar.offsetTop;
		document.onmousemove=function(ev){
			var oEvent=ev || event;
			var t=oEvent.clientY-disY;
			setTop(t);
		}
		document.onmouseup=function(){
			document.onmousemove=null;
			document.onmouseup=null;
			oBar.releaseCapture && oBar.releaseCapture();
		}
		oBar.setCapture && oBar.setCapture();
		return false;
	}
	function setTop(t){
		t<0 && (t=0);
		t>oRight.offsetHeight-oBar.offsetHeight&&(t=oRight.offsetHeight-oBar.offsetHeight);
		oBar.style.top=t+‘px‘;
		var scale=t/(oRight.offsetHeight-oBar.offsetHeight);
		oCon.style.top=-(oCon.offsetHeight-oLeft.offsetHeight)*scale+‘px‘;
	}
}

函数setTop为主要交互函数,主要是根据传入的参数改变内容和滚动块的top值,完成模拟滚动。

以上函数完成了滚动的拖动交互,下面的函数完成滚轮滚动

function addWheel(obj,fn){
	function fnWheel(ev){
		var oEvent=ev || event;
		var bDown=false;
		if(oEvent.wheelDelta){
			if(oEvent.wheelDelta<0){
				bDown=true;
			}else{
				bDown=false;
			}
		}else{
			if(oEvent.detail>0){  //ff浏览器
				bDown=true;
			}else{
				bDown=false;
			}
		}
		fn && fn(bDown);
		oEvent.preventDefault && oEvent.preventDefault();
		return false;
	}
	//ff浏览器滚动事件特殊
	if(window.navigator.userAgent.toLowerCase().indexOf(‘firefox‘)!=-1){
		obj.addEventListener(‘DOMMouseScroll‘,fnWheel,false);
	}else{
		obj.onmousewheel=fnWheel;
	}
}
addWheel(oBox,function(bDown){
		var t=oBar.offsetTop;
		if(bDown){
			t+=10;
		}else{
			t-=10;
		}
		setTop(t);
	});

把addWheel函数放入scrollbar中,滚动的速度可以由回调函数的参数t控制。

通过调用scrollbar函数就能简单完成模拟滚动条的功能(垂直)。

时间: 2024-10-21 08:08:03

原生js模拟滚动条的相关文章

原生JS模拟百度搜索框

近期有个新入行的小伙伴一直在问一些基础知识,突然觉得人的记忆力有限,有些平常很少用到的知识点虽简单却也其实很容易模糊,或者是一个单词,或者是一个语法.所以想着应该利用一下工作之余的碎片时间,记录一些工作上的问题和一些有趣的小案例,于是开通了播客,一方面便于自己日后翻阅,一方面给刚学习的小伙伴一个参考. 今天先写一个简单的小案例:原生JS模拟百度搜索框. 需求: 1.当在输入框输入时,每输入一个文字,就会在下方展示相关内容列表 2.每一次输入框输入,清空上一次内容 3.鼠标移入列表内容时,对应的内

原生JS模拟JQuery封装Ajax

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

原生js实现滚动条

var SimulateScroll = (function(){ var oParent = document.getElementById('wrap-scroll-bar'), oBox = document.getElementById('scroll-bar'), oWp = document.getElementById('container'), oDiv = document.getElementById('cont'), bDown = true, downFun = func

js模拟滚动条(不依赖jquery)

转载请注明: TheViper http://www.cnblogs.com/TheViper 当页面中有很多滚动条,它们相互嵌套,很不好看,这时就会模拟滚动条,并给这个滚动条好看的样式,使得页面美观. 模拟滚动条很多时候是去用jquery插件,然后写几行代码就搞定了.不过随着mvvm的快速发展,很多时候都懒得用jquery了,这就是本文的动机,本屌力求用简单的不依赖jquery只依赖mvvm(avalon) api的代码,完成一个简易的滚动条. 要求: 1.鼠标滚轮可以让滚动条工作,界面滚动

js模拟滚动条

1 <!DOCTYPE html> 2 <html> 3 <head> 4 5 <title></title> 6 <style type="text/css"> 7 * { margin: 0px; padding: 0px; } 8 .scroll-boxall { width: 312px; height: 500px; overflow: hidden; zoom: 1; border: 1px solid

简单的原生js 模拟jquery方法

仓促的模拟敲一下就上传来保存了. Object.prototype.fadeIn = function(speed) { var that = this; setTimeout(function() { that.style.display = "block" }, speed) return that; } //原生模拟jq中 fadeOut()方法: Object.prototype.fadeOut = function(speed) { var that = this; setT

原生 js 模拟 alert 弹窗

复制头部的 js 代码到你的 js 文件的任何地方,调用Chef.alert方法传入相应的参数即可并没有什么功能,只是一个提示的作用,可能样式比 alert 的弹窗好看点,css是写在js里的,只要你会写 css 就可以自行修改样式. Chef.alert 使用说明: 此方法有6个参数: 1,title 弹出框的标题 2,content 弹出框的提示文字也可以以字符串的形式传入任何html标签, 3,firm 弹出框按钮的文字 4,offset 弹出框距离顶部的位置,左右默认水平居中, 5,wi

js 模拟滚动条

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

原生JS模拟百度搜索关键字与跳转

<style type="text/css"> *{ margin: 0; padding: 0; } #text{ width: 300px; height: 30px; } ul { width: 302px; border: 1px solid #ddd; border-top:0; display: none; } ul li { list-style: none; font-size: 12px; font-family: "微软雅黑"; he