需求:
当页面是由一个巨大的表格构成时,浏览器自动会出现纵向和横向滚动条,这时用户浏览页面会出现很蛋疼的感受,那就是恶心的横向滚动条!
为了减缓这种蛋疼的感觉,我尝试做了这个导航器(不知道如何称呼),类似于地图右下角的缩略图,更形象的说是类似于“英雄联盟”的右下角小地图。
Demo:
大致原理:
根据鼠标在小地图区域的位置,成比例的放大到整个HTML页面中去。然后通过控制滚动条位置,实现页面移动。
更详细原理:
根据HTML页面的长宽比,在右下角创建相同比例的div,然后侦听该div的mouseover和mousemove事件,由此得到鼠标在
小地图中的x,y坐标(以小地图左上角为坐标原点)。再根据鼠标在小地图的位置成比例的放大到页面中,通过JQuery的
$("xxx").animate({scrollTop:123,scrollLeft:456},0),设置滚动条距离顶端123px,左端456px,动画时间为0,即可达到
类似于手动拖拽的效果。(没有弹性回馈,有了更好玩)
主要JQuery函数:
$().outerHeight()
$().css()
$().mouseover()
$().mousemove()
$().animate()
注:代码中的BirdSkan,翻译自中文“鸟瞰”图,后来觉得这个东西不符合“鸟瞰图”,而在文字叙述中国改为小地图,因为它
更类似于游戏“英雄联盟”或“百度地图”右下角的小地图。但代码中命名未改动,依旧是BirdSkan,其中Q是个人姓氏拼音。
效果图:
<!DOCTYPE html> <html> <head> <title> 测试JS鸟瞰图 </title> <meta charset="utf-8" /> <link rel="stylesheet" href="" type="text/css" /> <style type="text/css"> body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, form, fieldset, legend, input, button, textarea, p, th, td { margin: 0;padding: 0; } p{margin:100px; } </style> <script src="js/jquery-1.10.2.min.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function(){ //author: qilei // date: 2014-04-15 // todo: 边缘需要优化 var domEle = "body"; // .class or #id or tagname, but var birdSkanHeight,birdSkanWidth; var maxBSHeight = 250; var minBSHeight = 100; var maxBSWidth = 250; var minBSWidth = 100; var pageHeight = $("body").outerHeight(); var pageWidth = $("body").outerWidth(); var QBirdSkan = $("<div id='QBirdSkan'></div>"); //根据页面比例确定鸟瞰图长宽 var shape = (pageHeight)/(pageWidth); if( shape > 1 || shape == 1 ){ birdSkanHeight = maxBSHeight; birdSkanWidth = birdSkanHeight / shape; birdSkanWidth < minBSWidth ? birdSkanWidth = minBSWidth : birdSkanWidth;//若计算出的宽度过小,用最小宽度代替 }else{ birdSkanWidth = maxBSWidth; birdSkanHeight = birdSkanWidth * shape; birdSkanHeight < minBSHeight ? birdSkanHeight = minBSHeight : birdSkanHeight;//同上 } QBirdSkan.css("position","fixed"); QBirdSkan.css("bottom","0"); QBirdSkan.css("right","0"); QBirdSkan.css("height",birdSkanHeight); QBirdSkan.css("width",birdSkanWidth); QBirdSkan.css("background-color","rgb(D3D3D3)"); QBirdSkan.css("filter","alpha(opacity=20)");//IE,透明度20% QBirdSkan.css("-moz-opacity","0.8)");//Moz+FF,透明度20% QBirdSkan.css("opacity","0.2)");//支持CSS3的浏览器,透明度20% //设计美化 QBirdSkan.css("border","solid 8px rgb(230,230,230) "); QBirdSkan.css("cursor","pointer"); $("body").append(QBirdSkan); //添加鼠标移动相应函数 QBirdSkan.mouseover(function(event){ QBirdSkan.mousemove(function(event){ //根据鸟瞰图中鼠标位置滚动页面位置 var vRatio = event.offsetX / birdSkanWidth; var hRatio = event.offsetY / birdSkanHeight; var pageScrollTopVal = pageHeight * hRatio; pageScrollTopVal > pageHeight ? pageScrollTopVal = pageHeight : pageScrollTopVal; var pageScrollLeftVal = pageWidth * vRatio; pageScrollLeftVal > pageWidth ? pageScrollLeftVal = pageWidth : pageScrollLeftVal; $("html,body").animate({scrollTop:pageScrollTopVal,scrollLeft:pageScrollLeftVal},0); }) }); }) </script> </head> <body> <div> <p>1.鼠标进入有个矩形框,移动即移动页面</p> <p>2.鼠标进入有个矩形框,移动即移动页面</p> <p>3.鼠标进入有个矩形框,移动即移动页面</p> <p>4.鼠标进入有个矩形框,移动即移动页面</p> <p>5.鼠标进入有个矩形框,移动即移动页面</p> <p>6.鼠标进入有个矩形框,移动即移动页面</p> <p>7.鼠标进入有个矩形框,移动即移动页面</p> <p>8.鼠标进入有个矩形框,移动即移动页面</p> <p>9.鼠标进入有个矩形框,移动即移动页面</p> <p>10.鼠标进入有个矩形框,移动即移动页面</p> <p>11.鼠标进入有个矩形框,移动即移动页面</p> <p>12.鼠标进入有个矩形框,移动即移动页面</p> <p>13.鼠标进入有个矩形框,移动即移动页面</p> <p>14.鼠标进入有个矩形框,移动即移动页面</p> <p>15.鼠标进入有个矩形框,移动即移动页面</p> <p>16.鼠标进入有个矩形框,移动即移动页面</p> <p>17.鼠标进入有个矩形框,移动即移动页面</p> <p>18.鼠标进入有个矩形框,移动即移动页面</p> <span>=====================================================</span> <p>1.鼠标进入有个矩形框,移动即移动页面</p> <p>2.鼠标进入有个矩形框,移动即移动页面</p> <p>3.鼠标进入有个矩形框,移动即移动页面</p> <p>4.鼠标进入有个矩形框,移动即移动页面</p> <p>5.鼠标进入有个矩形框,移动即移动页面</p> <p>6.鼠标进入有个矩形框,移动即移动页面</p> </div> </body> </html>