JavaScript一个鼠标滚动事件的实例

<script type="text/javascript" src="./whenReady.js"></script> <!-- 使用了whenReady文件中的函数 -->
<body>
<script type="text/javascript">
/**
 * 把内容元素装到一个指定大小(最小是 50*50)的窗体或视口内
 * 可选参数contentX和contentY指定内容相对窗体的初始便宜量
 * 如果指定,他们必须 <= 0
 * 这个窗体有mousewheel事件处理程序
 * 它允许用户平移元素和缩放窗体
 */
function enclose(content,framewidth,frameheight,contentX,contentY){
	//这些参数不仅仅是初始值
	//他们保存当前状态,能被mousewheel处理程序使用和修改
	console.log("begin");
	framewidth 	= Math.max( framewidth,50);
	frameheight = Math.max( frameheight,50);
	contentX 	= Math.min(contentX, 0) || 0;
	contentY 	= Math.min(contentY, 0) || 0;

	//创建frame元素,且设置css类名和样式
	var frame = document.createElement("div");
	frame.className = "enclosure";			//这样我们能在样式表中定义样式
	frame.style.width = framewidth + "px";	//设置frame的尺寸
	frame.style.height = frameheight + "px";
	frame.style.overflow = "hidden";		//没有滚动条,不能溢出
	frame.style.boxSizing = "border-box";	//border-box简化了调整frame大小的计算
	frame.style.webkitBoxSizing = "border-box";
	frame.style.MozBoxSizing = "border-box";

	//把frame放入文档中,并把内容移入frame中
	content.parentNode.insertBefore(frame,content);
	frame.appendChild(content);

	//确定元素相对于frame的位置
	content.style.position = "relative";
	content.style.left 		= contentX + "px";
	content.style.top 		= contentY + "px";

	//我们将需要针对下面的一些特定浏览器怪癖进行处理
	var isMacWebkit = (navigator.userAgent.indexOf("Macintosh") !== -1 &&
					navigator.userAgent.indexOf("WebKit") !== -1 );
	var isFirefox 	= (navigator.userAgent.indexOf("Gecko") !== -1);

	//注册mousewheel事件处理程序
	frame.onwheel = wheelHandler;		//未来浏览器
	frame.onmousewheel = wheelHandler;	//大多数当前浏览器
	if(isFirefox)		//仅火狐浏览器
		frame.addEventListener("DOMMouseScroll",wheelHandler,false);

	function wheelHandler(event){
		var e = event || window.enent; 	//标准或IE事件对象

		//查找wheel事件对象、mousewheel事件对象(包括2D和1D形式)
		//和Firefox的DOMMouseScroll事件对象的属性
		//从事件对象中提取旋转量
		//绽放deltal一遍一次鼠标滚轮"单机"相对于屏幕的缩进增量的是30px
		//如果未来浏览器在同一事件上同时触发“wheel”和“mousewheel”
		//这个最终会重复计算
		//所以,希望取消wheel事件将阻止mousewheel事件的产生
		var deltaX = e.deltaX*-30 || //wheel事件
					e.wheelDeltaX/4 || //mousewheel
					0;			//属性未定义

		var deltaY = e.deltaY*-30 || //wheel事件
				e.wheelDeltaY/4 ||		//Webkit中的mousewheel事件
				(e.wheelDeltaY === undefined &&	//如果没有2D属性
					e.wheelDelta/4 ||		//那么就用1D的滚轮属性
					e.detail*-10 ||  		//Firefox的DOMMouseScroll事件
					0				//属性未定义
					);

		//在大多数浏览器中,每次鼠标滚轮单机对应的delta是120
		//但是,在mac中,鼠标滚轮似乎对速度更敏感,
		//其delta值通常要打120倍,使用Apple鼠标至少如此
		//使用浏览器测试解决这个问题
		if( isMacWebkit){
			deltaY/=30;
			deltaX/=30;
		}

		//如果在Firefox(未来版本)中得到mousewheel或wheel事件
		//那么就不在需要DOMMouseScroll
		if( isFirefox && e.type !== "DOMMouseScroll")
			frame.removeEventListener("DOMMouseScroll" , wheelHandler ,false);

		//获取内容元素的当前尺寸
		var contentbox = content.getBoundingClientRect();
		var contentwidth = contentbox.right - contentbox.left;
		var contentheight = contentbox.bottom - contentbox.top;

		if(e.altKey){ //如果按下Alt键,就可以调整frame大小
			if(deltaX){
				framewidth -= deltaX;	//新宽度,但不能比内容大
				framewidth 	= Math.min(framewidth, contentwidth);
				framewidth 	= Math.max(framewidth,50);	//且也不能比50小
				frame.style.width = framewidth+"px";	//在frame上设置它
			}
			if(deltaY){
				frameheight -= deltaY; 		//同样的操作对frame的高度做一遍
				frameheight = Math.min(frameheight,contentheight);
				frameheight = Math.max(frameheight-deltaY,50);
				frame.style.height = frameheight+"px";
			}
		}
		else{		//如果没有按Alt辅助键,就可以平移frame中的内容
			if(deltaX){
				//不能再滚动了
				var minoffset = Math.min(framewidth - contentwidth,0);
				//把deltaY添加到contentX,但不能小于minoffset
				contentY = Math.max(contentX+deltaX,minoffset);
				contentY = Math.min(contentX,0);	//或比0大
				content.style.left = contentX + "px";	//设置新的偏移量
			}		
			if(deltaY){
				var minoffset = Math.min(frameheight - contentheight,0);
				//把deltaY添加到contentY,但不能小于minoffset
				contentY = Math.max(contentY+deltaY,minoffset);
				contentY = Math.min(contentY,0);	//或比0大
				content.style.top = contentY + "px";	//设置新的偏移量
			}
		}
		//不让这个事件冒泡,阻止任何默认操作
		//这回阻止浏览器使用mousewheel事件滚动文档
		//希望对于相同的鼠标滚动
		//调用wheel事件上的preventDefault()也能阻止mousewheel事件的产生
		if(e.preventDefault)
			e.preventDefault();
		if(e.stopPropagation)
			e.stopPropagation();
		e.cancelBubble = true;	//IE事件
		e.returnValue = false;	//IE事件
		return false;
	}
}

whenReady(function(){
	enclose(document.getElementById('content'),400,200,-200,-300);
});
</script>
<style type="text/css">div.enclosure{border: solid black 10px;margin:10px;}</style>
<img id="content" src="./37178802_25568731.jpg"> <!--换成自己的图片 ->
</body>

  

posted @ 2017-05-30 19:01  newAdmin  阅读(1495)  评论(0编辑  收藏  举报