首页 > 语言 > JavaScript > 正文

jQuery插件windowScroll实现单屏滚动特效

2024-05-06 16:23:06
字体:
来源:转载
供稿:网友

本文给大家分享的是一个使用jQuery插件windowScroll实现的单屏滚动的特效,主要参考搜狗浏览器4.2版本首页的上下滚动效果。主要实现整个窗口的上下和左右滚动逻辑,非常的实用。

回首望,曾经洋洋得意的代码现在不忍直视。曾经看起来碉堡的效果现在也能稍微弄点出来。社会在往前发展,人也不得不向前走。

参考于搜狗浏览器4.2版本首页的上下滚动效果。主要实现整个窗口的上下和左右滚动逻辑,还有很多可以拓展的空间。希望大家能多提意见与建议。

代码如下:

HTML

 

 
  1. <!doctype html> 
  2. <html> 
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  4. <meta content="" name="keywords" /> 
  5. <meta content="" name="description" /> 
  6. <meta name="author" content="codetker" /> 
  7. <head> 
  8. <title>window对象滚动插件</title> 
  9. <link href="style/reset.css" rel="stylesheet" type="text/css"
  10. <link href="style/style.css" rel="stylesheet" type="text/css"
  11. <script type="text/javascript" src="js/jquery-1.9.1.min.js"></script> 
  12. <script type="text/javascript" src="js/jquery.codetker.windowScroll.js"></script> 
  13. </head> 
  14.  
  15. <body scroll="no"
  16. <div class="wrap" style="dispaly:block;"
  17. <div class="stageControl"
  18. <ul> 
  19. <li>stage1</li> 
  20. <li>stage2</li> 
  21. <li>stage3</li> 
  22. <li>stage4</li> 
  23. <li>stage5</li> 
  24. </ul> 
  25. </div> 
  26. <div class="stage stage1"
  27. <div class="pageControl"
  28. <ul> 
  29. <li>page1</li> 
  30. <li>page2</li> 
  31. <li>page3</li> 
  32. </ul> 
  33. </div> 
  34. <div class="page page1"></div> 
  35. <div class="page page2"></div> 
  36. <div class="page page3"></div>  
  37. </div> 
  38. <div class="stage stage2"></div> 
  39. <div class="stage stage3"></div> 
  40. <div class="stage stage4"></div> 
  41. <div class="stage stage5"></div> 
  42. </div> 
  43. <script type="text/javascript"
  44. $(document).ready(function(){ 
  45. $(".wrap").windowScroll({ 
  46. 'choose' : 0, 
  47. 'verticalSpeed' : 2, //控制垂直滚动速度 
  48. 'horizontalSpeed' : 1, 
  49. 'objControlUl''.wrap .stageControl' 
  50. }); 
  51. $(".stage1").windowScroll({ 
  52. 'choose': 1, 
  53. 'verticalSpeed' : 1, 
  54. 'horizontalSpeed' : 1,//控制水平滚动速度 
  55. 'objControlUl''.stage1 .pageControl' 
  56. }); 
  57. }); 
  58. </script> 
  59. </body> 
  60. </html> 

CSS

 

 
  1. @charset "utf-8"
  2. /* CSS Document */ 
  3. body{ 
  4. margin:0 0; 
  5. padding:0 0; 
  6. height:100%; 
  7. width:100%; 
  8. overflow: hidden;; 
  9. .wrap{ 
  10. font-family:"微软雅黑","宋体", Times, "Times New Roman", serif; 
  11. font-size:14px; 
  12. margin:0 0; 
  13. padding:0 0; 
  14. height:100%; 
  15. width:100%; 
  16. overflow:hidden; 
  17.  
  18. .stage,.page{ 
  19. width: 100%; 
  20. height: 100%; 
  21. .stage1{ 
  22. background-color:red; 
  23. .stage2{ 
  24. background-color:#fff; 
  25. .stage3{ 
  26. background-color:yellow; 
  27. .stage4{ 
  28. background-color:green; 
  29. .stage5{ 
  30. background-color:blue; 
  31. .page{ 
  32. float: left; 
  33. .page2{ 
  34. background-color: #666; 
  35. .page3{ 
  36. background-color: #ddd; 
  37. .stageControl{ 
  38. position: fixed; 
  39. .stageControl ul li{ 
  40. width: 100px; 
  41. height: 30px; 
  42. line-height: 30px; 
  43. text-align: center; 
  44. cursor: pointer; 
  45. .stageControl ul li:hover{ 
  46. color: blue; 
  47. .pageControl{ 
  48. position: fixed; 
  49. left: 200px; 
  50. .pageControl ul li{ 
  51. float: left; 
  52. width: 50px; 
  53. height: 25px; 
  54. line-height: 25px; 
  55. text-align: center; 
  56. cursor: pointer; 
  57. .pageControl ul li:hover{ 
  58. color: blue; 

JavaScript

 

 
  1. /* 
  2. * windowScroll 0.1 
  3. * window滚动插件,上下左右,可选择是否回弹。参考搜狗欢迎页面 
  4. * 兼容IE,FF,Chrome等常见浏览器 
  5. * 借鉴搜狗4.2版http://ie.sogou.com/features4.2.html 
  6. */ 
  7. ;(function($,window,document,undefined){ 
  8. //定义构造函数 
  9. var WindowObj=function(ele,opt){ 
  10. this.$element=ele; //最外层对象 
  11. this.defaults={ 
  12. 'choose' : 0,//默认为上下 
  13. 'verticalSpeed' : 1, 
  14. 'horizontalSpeed' : 1, 
  15. 'objControlUl'null 
  16. }, 
  17.  
  18. this.options=$.extend({},this.defaults,opt ); 
  19.  
  20. //阻止默认行为和冒泡,这里可以定义多个方法都要用到的函数 
  21. this.stopDefaultAndBubble=function(e){ 
  22. e=e||window.event; 
  23. if (e.preventDefault) { 
  24. e.preventDefault(); 
  25. e.returnValue=false
  26.  
  27. if (e.stopPropagation) { 
  28. e.stopPropagation(); 
  29. e.cancelBubble=true
  30.  
  31. this.setSize=function(ele){ 
  32. $(ele).css({ 
  33. 'width':$(window).outerWidth()+'px' 
  34. }); 
  35. //自动判断元素是否存在,对undefined赋css属性无意义 
  36. $(ele).children('.stage').css({ 
  37. 'width':$(window).outerWidth()+'px'
  38. 'height':$(window).outerHeight()+'px' 
  39. }); 
  40. $(ele).children('.page').css({ 
  41. 'width':$(window).outerWidth()+'px'
  42. 'height':$(window).outerHeight()+'px' 
  43. }); 
  44.  
  45. //给构造函数添加方法 
  46. WindowObj.prototype={ 
  47.  
  48. //上下滚动的方法 
  49. verticalMove:function(){ 
  50. var obj=this.$element; //最外层对象 
  51. var speed=this.options.verticalSpeed; 
  52. var objControl=this.options.objControlUl;//控制按钮 
  53.  
  54. var windowHeight=$(window).height(); 
  55. var list=$(obj).children('.stage'); 
  56. var listMax=$(list).length; 
  57.  
  58. var is_chrome=navigator.userAgent.toLowerCase().indexOf('chrome')>-1; 
  59. if(is_chrome){ 
  60. //判断webkit内核,供scrollTop兼容性使用 
  61. windowobject='body'
  62. }else
  63. //支持IE和FF 
  64. windowobject='html'
  65. var stop=0; 
  66.  
  67. //均设置为windows大小 
  68. this.setSize(obj); 
  69.  
  70. //得到当前的垂直位置 
  71. var stageIndex; 
  72. function getIndex(){ 
  73. stageIndex=Math.round($(window).scrollTop()/windowHeight); 
  74. }  
  75.  
  76. //绑定键盘上下按键事件 
  77. $(document).keydown(function(event) { 
  78. /* 绑定keycode38,即向上按钮 */ 
  79. if (event.keyCode==38) { 
  80. getIndex(); 
  81. setTimeout(function(){ 
  82. scrollStage(windowobject,stageIndex,1); //stageIndex为当前页码 
  83. },100); 
  84. }else if (event.keyCode==40) {//绑定40,即向下按钮 
  85. getIndex(); 
  86. setTimeout(function(){ 
  87. scrollStage(windowobject,stageIndex,-1); //stageIndex为当前页码 
  88. },100); 
  89. }); 
  90.  
  91. //绑定滑轮功能的函数 
  92. function handle(delta){ 
  93. getIndex(); 
  94. if (delta<0) { 
  95. setTimeout(function(){ 
  96. scrollStage(windowobject,stageIndex,-1); //stageIndex为当前页码 
  97. },100); 
  98. }else
  99. setTimeout(function(){ 
  100. scrollStage(windowobject,stageIndex,1); //stageIndex为当前页码 
  101. },100); 
  102.  
  103.  
  104. //判断滑轮,解决兼容性 
  105. function wheel(event){ 
  106. var delta = 0; 
  107. if (!event) event = window.event; 
  108. if (event.wheelDelta) { 
  109. delta = event.wheelDelta;  
  110. if (window.opera) delta = -delta; 
  111. else if (event.detail) { 
  112. delta = -event.detail; 
  113. if (delta) 
  114. handle(delta); //调用执行函数 
  115.  
  116. //注册事件 
  117. if (window.addEventListener) { 
  118. window.addEventListener('DOMMouseScroll', wheel, false); 
  119. window.onmousewheel = document.onmousewheel = wheel; 
  120.  
  121. //绑定鼠标滚轮事件 
  122. $(document).bind('mousedown'function(event) { 
  123. if (e.which==2) {//which=2代表鼠标滚轮,即为中键 
  124. this.stopDefaultAndBubble(e); 
  125. //bugfix 搜狗浏览器的ie内核只有在定时器触发这个函数才生效 
  126. setTimeout(function(){ 
  127. this.stopDefaultAndBubble(e); 
  128. },10); 
  129. }); 
  130.  
  131. //如果有ul li控制按钮 
  132. if (objControl!=null) { 
  133. $(objControl).delegate('li''click'function() { 
  134. stageIndex=$(this).index(); 
  135. setTimeout(function(){ 
  136. scrollStage(windowobject,stageIndex,0); 
  137. },100); 
  138. }); 
  139.  
  140. function scrollStage(obj,stIndex,dir){//如果用scrollStage=function来指定的话没有声明提前,然后就会找不到这个函数了 
  141. //obj为操作滚动的对象 
  142. //stIndex为点击调用时应该滚动到的页面页码,按键和滚轮调用时默认为1(传入0) 
  143. //dir传入滚动时的方向,0代表不滚动,1代表向上,-1代表向下 
  144. var sIndex=stIndex;//!(dir)则stageIndex为要到的页码,否则为当前页码 
  145. var windowobject=obj; 
  146. var direction=0||dir; //接收参数封装,没有传入时暂时认为为0 
  147. var target=windowHeight*sIndex; //目标页面距离文档顶部距离 
  148.  
  149. if ( !$(windowobject).is(':animated') ) {//当没有在滚动时 
  150. if(!direction){ ////响应guider,此时stageIndex为目标页面页码 
  151. if ($(window).scrollTop() > target) { //内容下移,窗口上移,上方出现弹痕 
  152. direction=-1; 
  153. $(windowobject).animate({ 
  154. "scrollTop": target +"px" 
  155. },1000*speed,function(){ 
  156. crash_bottom(1,target,20,150); //调用撞击函数,先撞顶部,target变成当前页面了 
  157. }); 
  158. }else if($(window).scrollTop() == windowHeight*sIndex){ //当前页面时 
  159. direction=0; 
  160. crash_bottom(1, target ,20,150); //模拟撞底部 
  161. }else
  162. direction=1; 
  163. $(windowobject).animate({ 
  164. "scrollTop": target +"px" 
  165. },1000*speed,function(){ 
  166. crash(1,target,20,150); //调用撞击函数,先撞底部 
  167.  
  168. }); 
  169. }else{//响应鼠标滚轮和键盘上下,sindex为当前页面 
  170. if(direction==1){ 
  171. if(sIndex==0){ 
  172. crash(1,target,20,150); 
  173. }else//往上翻 
  174. sIndex-=1; 
  175. $(windowobject).animate({ 
  176. "scrollTop":windowHeight*sIndex+"px" 
  177. },1000*speed,function(){ 
  178. crash_bottom(1,windowHeight*sIndex,20,150); //调用撞击函数,往下翻内容往上,先撞顶部 
  179. ); 
  180. }else
  181. if(sIndex==listMax){ 
  182. crash_bottom(1,target,20,150); 
  183. }else//往下翻 
  184. sIndex+=1; 
  185. $(windowobject).animate({ 
  186. "scrollTop":windowHeight*sIndex+"px" 
  187. },1000*speed,function(){ 
  188. crash(1,windowHeight*sIndex,20,150); //调用撞击函数,往上翻内容往下,先撞底部 
  189. }); 
  190.  
  191.  
  192. //撞击函数 
  193. function crash_bottom(direction,termin,distant,time){ 
  194. if (!stop) { 
  195. var scrollTop=$(window).scrollTop(); 
  196. if (direction==1) { 
  197. direction=0; 
  198. $(windowobject).animate({"scrollTop":"+="+distant+"px"},time,function(){ 
  199. crash_bottom(direction,termin,distant*0.6,time); 
  200. if (distant<=15||time>150) { 
  201. stop=1;//停止碰撞 
  202.  
  203. $(windowobject).animate({"scrollTop":termin+"px"},time,function(){ 
  204. stop=0; 
  205. }); 
  206. }); 
  207. }else if (direction==0) { 
  208. direction=1; 
  209. $(windowobject).animate({"scrollTop":termin+"px"},time,function(){ 
  210. crash_bottom(direction,termin,distant*0.6,time); 
  211. if (distant<=15||time>150) { 
  212. stop=1;//停止碰撞 
  213.  
  214. $(windowobject).animate({"scrollTop":termin+"px"},time,function(){ 
  215. stop=0; 
  216. }); 
  217. }); 
  218. function crash(direction,termin,distant,time){ 
  219. if (!stop) { 
  220. var scrollTop=$(window).scrollTop(); 
  221. if (direction==1) { 
  222. direction=0; 
  223. $(windowobject).animate({"scrollTop":"-="+distant+"px"},time,function(){ 
  224. crash(direction,termin,distant*0.6,time); 
  225. if (distant<=15||time>150) { 
  226. stop=1;//停止碰撞 
  227.  
  228. $(windowobject).animate({"scrollTop":termin+"px"},time,function(){ 
  229. stop=0; 
  230. }); 
  231. }); 
  232. }else if (direction==0) { 
  233. direction=1; 
  234. $(windowobject).animate({"scrollTop":termin+"px"},time,function(){ 
  235. crash(direction,termin,distant*0.6,time); 
  236. if (distant<=15||time>150) { 
  237. stop=1;//停止碰撞 
  238.  
  239. $(windowobject).animate({"scrollTop":termin+"px"},time,function(){ 
  240. stop=0; 
  241. }); 
  242. }); 
  243.  
  244. }, 
  245. //左右滚动的方法 
  246. horizontalMove:function(){ 
  247. var obj=this.$element; //最外层对象 
  248. var speed=this.options.horizontalSpeed; 
  249. var objControl=this.options.objControlUl;//控制按钮 
  250.  
  251. var windowWidth=$(window).width(); 
  252. var list=$(obj).children('.page'); 
  253. var listMax=$(list).length; 
  254.  
  255. var is_chrome=navigator.userAgent.toLowerCase().indexOf('chrome')>-1; 
  256. if(is_chrome){ 
  257. //判断webkit内核,供scrollTop兼容性使用 
  258. windowobject='body'
  259. }else
  260. //支持IE和FF 
  261. windowobject='html'
  262. var stop=0; 
  263.  
  264. //均设置为windows大小 
  265. this.setSize(obj); 
  266. $(obj).css({'width':windowWidth*listMax+'px'}); 
  267.  
  268. var pageIndex; //当前页面页码(负数) 
  269. function getPageIndex(){ 
  270. pageIndex=Math.round(parseInt($(obj).css("margin-left")) / windowWidth); 
  271.  
  272. //绑定键盘左右按键事件 
  273. $(document).keydown(function(event){ 
  274. //判断event.keyCode为39(即向右按钮) 
  275. if (event.keyCode==39) { 
  276. getPageIndex(); 
  277. scrollPage($(obj),pageIndex,-1);  
  278. //判断event.keyCode为37(即向左按钮 
  279. else if (event.keyCode==37) { 
  280. getPageIndex(); 
  281. scrollPage($(obj),pageIndex,1); 
  282. }); 
  283.  
  284. //如果有ul li控制按钮 
  285. if (objControl!=null) { 
  286. $(objControl).delegate('li''click'function() { 
  287. pageIndex=$(this).index(); 
  288. setTimeout(function(){ 
  289. scrollPage(obj,pageIndex,0); 
  290. },100); 
  291. }); 
  292.  
  293. function scrollPage(obje,pIndex,dir){ 
  294. var windowobject=obje; 
  295. var direction=0||dir; 
  296. var pageIndex=pIndex; 
  297. var dist=Math.round(parseInt($(obj).css("margin-left"))); //当前页距离左边的margin(负值) 
  298. var aim=pageIndex*windowWidth*(-1); 
  299.  
  300. if (!$(windowobject).is(":animated")) { 
  301. if(!direction){ //响应nav 
  302.  
  303. if (dist != aim) { //此时pageIndex为yearID.非负值 
  304. $(windowobject).animate({"margin-left": aim + "px"}, 
  305. 1000*speed); 
  306. }else
  307. direction=0; 
  308. $(windowobject).animate({"margin-left":"+="+"50px"},500).animate({"margin-left":"-="+"100px"},500).animate({"margin-left":"+="+"50px"},500); 
  309. }else//响应键盘左右键 
  310. if(direction==1){ //pageIndex为负值 
  311. if(pageIndex==0){ 
  312. $(windowobject).animate({"margin-left":"+="+"50px"},500).animate({"margin-left":"-="+"100px"},500).animate({"margin-left":"+="+"50px"},500);  
  313. }else
  314. pageIndex+=1; //显示左边内容,左键 
  315. $(windowobject).animate({"margin-left":"+=" + windowWidth + "px"}, 
  316. 1000*speed); 
  317. }else
  318. if(pageIndex== ((-1)*(listMax-1))){ 
  319. $(windowobject).animate({"margin-left":"-="+"50px"},500).animate({"margin-left":"+="+"100px"},500).animate({"margin-left":"-="+"50px"},500);  
  320. }else
  321. pageIndex-=1; 
  322. $(windowobject).animate({"margin-left":"-=" + windowWidth + "px"}, 
  323. 1000*speed); 
  324.  
  325.  
  326.  
  327.  
  328. //在插件中使用windowObj对象的方法,0为vertical,1为horizontal 
  329. $.fn.windowScroll=function(options){ 
  330. //创建实体 
  331. var windowObj=new WindowObj(this,options); 
  332. //根据选择调用方法 
  333. if (windowObj.options.choose==0) { 
  334. return windowObj.verticalMove(); 
  335. }else if(windowObj.options.choose==1){ 
  336. return windowObj.horizontalMove(); 
  337. }else{//2之后的留扩展吧 
  338. //add some functions 
  339. })(jQuery,window,document); 

详细的代码下载见https://github.com/codetker/myWindowScroll

以上所述就是本文的全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选