使用JavaScript和CSS实现异步移动侧边栏
2012-11-28 14:21
477 查看
什么是异步移动?当可视区域下移(即滚动条下移)时,左侧的侧边栏会同时向下移动,这样无论什么时候都不会出现侧边栏留白的现象。同时还可以发现,当可是区域在页面最上方时,侧边栏的顶部靠近浏览器顶部;但当显示区域在页面底部时,侧边栏的底部正好完全显示出来。这一点也在代码中有所体现。
首先要获得浏览器相关参数
返回值分别为:
scrollTop:垂直滚动条位置
scrollLeft:水平滚动条位置
scrollHeight:页面总高度
scrollWidth:页面总宽度
scrollWidth:可见区域高度
clientWidth:可见区域宽度
这些参数对侧边栏位置的计算起到重要的作用。Simoll.us页面布局(div的id)如下:
为了实现侧边栏的位移,我们可以用JavaScript改变CSS中的padding-top值(使用jQuery库),代码如下:
在这段代码中,我们设置window.onscroll监听器来更新滚动条位置,用asyncSidebar函数更新侧边栏CSS。这样的好处是便于控制侧边栏的重绘,不因onscroll监听器的调用导致卡顿。
在重绘CSS的代码中,将单帧时间乘以常数0.95,避免由于CPU计算能力导致jQuery队列过长(但改方法并未完全解决此问题,希望能找到更好的解决办法)
如果要移植这段代码非常简单,只需要根据主题修改各div的id即可。
首先要获得浏览器相关参数
function getPagePos() { var st, sl, sw, sh, cw, ch; if (document.documentElement && document.documentElement.scrollTop) { st = document.documentElement.scrollTop; sl = document.documentElement.scrollLeft; sw = document.documentElement.scrollWidth; sh = document.documentElement.scrollHeight; } else if (document.body) { st = document.body.scrollTop; sl = document.body.scrollLeft; sw = document.body.scrollWidth; sh = document.body.scrollHeight; } cw = document.documentElement.clientWidth; ch = document.documentElement.clientHeight; return { scrollTop : st, scrollLeft: sl, scrollWidth: sw, scrollHeight: sh, clientWidth : cw, clientHeight : ch }; }
返回值分别为:
scrollTop:垂直滚动条位置
scrollLeft:水平滚动条位置
scrollHeight:页面总高度
scrollWidth:页面总宽度
scrollWidth:可见区域高度
clientWidth:可见区域宽度
这些参数对侧边栏位置的计算起到重要的作用。Simoll.us页面布局(div的id)如下:
为了实现侧边栏的位移,我们可以用JavaScript改变CSS中的padding-top值(使用jQuery库),代码如下:
varnowPt = 0; varaimPt = 0; varasSteps = 12; varpagePos; varminDeltaPt = 3; functionasyncSidebar() { if (Math.abs(aimPt - nowPt) < 1) { setTimeout(function(){asyncSidebar();}, 500); } else { vardeltaPt = (aimPt - nowPt) / asSteps; if (Math.abs(deltaPt) < minDeltaPt) { if (deltaPt > 0) { deltaPt = minDeltaPt; } else { deltaPt = -minDeltaPt; } } vargotoPt = nowPt + deltaPt; $("#sidebar").animate({paddingTop:gotoPt + "px"}, 1000 / asSteps * 0.95); nowPt = gotoPt; setTimeout(function(){asyncSidebar();}, 1000 / asSteps); } } functionasyncSidebarUpdate() { varpagePos = getPagePos(); aimPt = ($("#content").height() - $("#sidebar").height()) * pagePos.scrollTop / (pagePos.scrollHeight - pagePos.clientHeight); } $(function() { window.onscroll = asyncSidebarUpdate; asyncSidebar(); });
在这段代码中,我们设置window.onscroll监听器来更新滚动条位置,用asyncSidebar函数更新侧边栏CSS。这样的好处是便于控制侧边栏的重绘,不因onscroll监听器的调用导致卡顿。
在重绘CSS的代码中,将单帧时间乘以常数0.95,避免由于CPU计算能力导致jQuery队列过长(但改方法并未完全解决此问题,希望能找到更好的解决办法)
如果要移植这段代码非常简单,只需要根据主题修改各div的id即可。
文章来自:使用JavaScript和CSS实现异步移动侧边栏
相关文章推荐
- javascript真的是异步的吗?且看setTimeout的实现原理以及setTimeout(0)的使用场景
- 使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
- [JavaScript]使用JavaScript+CSS实现注册页面中检验两次密码输入是否相同
- 使用javascript实现单选及多选的向右和向左移动
- 使用javascript实现两个listbox中list的移动
- Web移动应用的未来:使用HTML5,CSS和JavaScript
- 使用javascript和css来实现textbox水印效果
- 使用基于关系的选择器和伪类选择器创建纯CSS无JavaScript的鼠标移动到上面即可显示的下拉菜单
- 使用JavaScript和CSS实现文本隔行换色的方法
- javascript真的是异步的吗?且看setTimeout的实现原理以及setTimeout(0)的使用场景
- 使用javascript操作多选列表框,实现动态增加删除,左右移动,上下排序移动等功能。
- 使用html5+css3来实现slider切换效果告别javascript+css
- 完整的html+css+javascript实现跟随鼠标移动显示选中效果
- JavaScript中使用Async实现异步控制
- javascript中使用定时函数实现移动的方块
- 使用JavaScript 和 CSS 实现图像缩放和剪裁(转)
- 使用CSS+JavaScript实现可拖动的窗口的源代码(推荐)
- 使用JavaScript和CSS实现文本隔行换色的方法
- javascript 使用FormData实现图片/文件异步上传
- 使用javascript实现单选及多选的向右和向左移动