`
lhx222
  • 浏览: 72306 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

HTML元素随滚动条滚动

阅读更多
比较常见的是一个Div层随滚动条滚动,使Div层位置相对于可视区域不变,其实质就是当滚动条位置改变后,重新定位层的位置。网上有不少的例子,总的思路可以分为两类:
1.CSS样式定位。不同的浏览器及其版本,实现稍有不同。这种方式是利用CSS的expression特性,通过执行绑定的一个计算坐标位置的js表达式,把结果设置为层的坐标值,最终实现Div层位置的滚动。
2.Javascript定位。使用js实现的版本,网上也有很多,利用一些现成的JS组件也可以轻易实现。这种实现方式的原理是监控滚动条的滚动事件,或者设置一个计时器,不断检索滚动条的滚动位置,然后设置层的坐标值,从而实现层的滚动效果。
下面是使用CSS样式定位的方式。简单例子,
方式一:将图片定位在可视区域的左上角
<!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>
    <title>CSS样式定位</title>
    <meta http-equiv="content-type" content="text/html; charset=gbk">
  </head>
<body>
<img src="my.png" style="position:absolute;left:20px;top:expression(parseInt(document.body.scrollTop)+20);" />
<div style="height:2000px;"></div>
</body>
</html>

这种方式很简单,没有考虑浏览器的兼容性。我们可以改变20的值,直接定位某个坐标。
下面的方式对浏览器做了兼容:将图片定位在可视区域内的右下角
<!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>
    <title>CSS样式定位</title>
    <meta http-equiv="content-type" content="text/html; charset=gbk">
  </head>
<body>
<script type="text/javascript">
//兼容xhtml1.0和html4 / 用hack兼容ie6 ie7 ff
var imgHtml = '';
var isIE7 = /MSIE 7/.test(navigator.appVersion);
if(document.compatMode && document.compatMode != 'BackCompat'){
   imgHtml = '<img src="my.png" style="right:10px; bottom:10px;POSITION:fixed;'+(isIE7?'':'_position:absolute; _margin-top:expression(document.documentElement.clientHeight-this.style.pixelHeight+document.documentElement.scrollTop);')+'" />';
}else {
   imgHtml = '<img src="my.png" style="right:10px; bottom:10px;display:none;POSITION:fixed;*position:absolute; *top:expression(eval(document.body.scrollTop)+eval(document.body.clientHeight)-this.style.pixelHeight);" />';
 }
document.write(imgHtml);
</script>
<div style="height:2000px;"></div>
</body>
</html>

网上使用CSS样式定位的方式,基本上和上面的类似。下面看看第二中方式:Javascript定位。
使用js定位,如果是自己写代码,可以按照下面的具体步骤去实现:
1.监控滚动元素(一般的是body元素)的onscroll事件,设置层的坐标。
<!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>
    <title>CSS样式定位</title>
    <meta http-equiv="content-type" content="text/html; charset=gbk">
  </head>
<body>
<div id="myDiv" style="position:absolute;left:20px;background:#555;width:100px;height:100px;" />
<div style="height:2000px;"></div>
<script type="text/javascript">
        var myDivEl = document.getElementById('myDiv');
        var fixpos = myDivEl.style.posTop; 
        document.body.onscroll=function(){ 
          myDivEl.style.posTop = document.body.scrollTop + fixpos;
        } 
</script> 
</body>
</html>

代码说明:
(1)
var myDivEl = document.getElementById('myDiv');
var init_pos = myDivEl.style.posTop; 

初始化变量init_pos为层myDiv的Y坐标值,posTop和pixelTop取到的值是纯数字,而top取到的是带"px"单位的字符串。

(2)
document.body.onscroll=function(){ 
myDivEl.style.posTop=document.body.scrollTop+fixpos 
}

这个是在文档区域拖动滚动条时执行的函数,第二行是重新设置层myDivEl的Y坐标,document.body.scrollTop等于滚动滑块上端离滚动的开始点的距离
myDivEl.style.posTop=document.body.scrollTop+fixpos
就是设置层myDiv的Y坐标为文档区域的滚动条已滚动量加上层的原Y轴坐标值之和。


2.下面改进了myDiv平滑移动
<!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>
    <title>CSS样式定位</title>
    <meta http-equiv="content-type" content="text/html; charset=gbk">
  </head>
<body>
<div id="myDiv" style="position:absolute;left:20px;background:#555;width:100px;height:100px;" />
<div style="height:2000px;"></div>
<script type="text/javascript">
var myDivEl = document.getElementById('myDiv');
//初始化变量fixpos为层myDiv的Y坐标值 
var fixpos = myDivEl.style.posTop 
//文档区域滚动时执行scrollit()函数 
document.body.onscroll=function scrollit(){  
        //层要移动到的目标坐标 
        var target_pos=document.body.scrollTop+fixpos; 
        var step=5; //变量step为步长,层每次移动的距离量 
        //如果是往上拉滚动条,步长应为负值 
        if(myDivEl.style.posTop>target_pos) 
                step*=-1 
        myDivEl.style.posTop+=step //层的Y坐标值增加 
//判断层的当前Y坐标值跟目标距离间的值是否大于一个定值,是的话在50毫秒后继//续执行一次scrollit()函数,否则层停止在当前位置 
if(Math.abs(myDivEl.style.posTop-target_pos)>Math.abs(step)) setTimeout("scrollit()",50) 
} 
</script>
</body>
</html>

3.下面的改进了使myDiv移动更自然点
<!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>
    <title>CSS样式定位</title>
    <meta http-equiv="content-type" content="text/html; charset=gbk">
  </head>
<body>
<div id="myDiv" style="position:absolute;left:20px;background:#555;width:100px;height:100px;" />
<div style="height:2000px;"></div>
<script type="text/javascript">
var myDivEl = document.getElementById('myDiv');
//变量fixpos为层的最初Y坐标值,last_pos为层最后一层移动后的Y坐标值,在下面的函数执行之前它们是相等的 
var fixpos=last_pos=myDivEl.style.posTop; 
/*setInterval(表达式或函数,时间)的作用是每隔一段时间(单位:毫秒)之后执行一次表达式或函数,这里是每1毫秒(千分一秒)执行一次函数*/ 
setInterval(function(){ 
//目标坐标,上两段代码里解释过具体意思了 
var target_pos=document.body.scrollTop+fixpos; 
/*步长,目标位置减上一次移动后的位置的十分一(10是经验数字,换成其它值的话效果会产很远),因为last_pos是不断接近target_pos的,所以step的绝对值也越来越小,这就是产生弹性移动的原因。最后"|0"的意思是把前面的计算结果跟0进行二进制的按位“或”运算,作用等同于Math.floor(),只是效率更高*/ 
var step=(target_pos-last_pos)/10|0; 
//以step为步长移动层 
myDivEl.style.posTop+=step;
//更新变量last_pos的值,没有这步也不可能产生弹性移动效果 
last_pos+=step; 
//这里的1是1毫秒 
},1); 
</script> 
</body>
</html>


在上面的三个例子中,第一个例子代码比较简单,但运动效果非常生硬,直接跳到目标位置;第二个例子稍好一点,层是匀速移动的;第三个例子效果比较好,模拟真实的物体运动,具有运动缓冲的效果,但因为用了setInterval方法,比较耗系统资源。
特别说明:
层的滚动重点在于用onscroll捕获滚动条的滚动事件,并用document.body.scrollTop获取滚动条滚动的距离,最后设置层的posTop和posLeft属性,还有一个非常有用的缓冲运动的实现。
onscroll 当用户滚动对象的滚动条时触发。
scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离。
posTop 设置或获取以 top 标签属性指定的单位的对象上方位置。
posLeft 设置或获取以 left 标签属性指定的单位的对象左侧位置。

除了自己编写滚动的核心代码的方式,JS定位也可以使用其他的一些js组件来辅助完成,很方便,兼容性也好。
下面是一个使用Jquery组件的API来完成滚动的例子
<!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> 
<title>JQUERY-JS定位</title> 
<meta http-equiv="Content-Type" content="text/html; charset=gbk" /> 
<script src="jquery.js" type="text/javascript"></script> 
<script language="javascript"> 
/*
 *设置一个层随滚动条滚动
 */
function scrollDiv(id,duration)
{
        var scrollDivEl = $("#"+id);
        var menuYloc = scrollDivEl.offset().top; 
        $(window).scroll(function (){ 
                var offsetTop = menuYloc + $(window).scrollTop() +"px"; 
                scrollDivEl.animate({top : offsetTop },{ duration:duration || 350 , queue:false }); 
        }); 
}

$(document).ready(function(){ 
     scrollDiv("myDiv",350);
}); 
</script> 
</head> 
<body> 
<div id="myDiv" style="position:absolute;left:20px;background:#555;width:100px;height:100px;" />
<div style="height:2000px;"></div>
</body> 
</html>


最后,网络上也有完整的滚动插件,下面是一个基于JQuery插件,实现HTML元素随滚动条(可以设定滚动范围)滚动,已经相当好用,不用再发明轮子了。
http://www.bbon.cn/2009/07/jquery-scroll-follow.html
http://kitchen.net-perspective.com/open-source/scroll-follow/
分享到:
评论
1 楼 zskangs1126 2012-06-13  
js_大妈么?

相关推荐

    div模块层随页面滚动遇顶固定的两种方法(js&jQuery)

    而当我们下拉滚动条,随着页面向下滚动,当此工具条接触到浏览器的上边缘时,这时就会独立出来固定在顶部,不跟随页面滚动而滚动了,如下图: 类似的例子效果我们在别的网站上都有看到过,例如腾讯微博首页上,当...

    CSS属性

    3. 元素固定在页面中不随滚动条滚动 sticky:黏贴定位 特征: 1. 脱离文档流,页面达到一定高度 2. 效果是吸附在浏览器的顶部 二、浮动元素父元素高度自适应(高度塌陷) 当子元素有浮动并且父元

    div的position属性

    由于视图本身是固定的,它不会随浏览器窗口的滚动条滚动而变化,除非你在屏幕中移动浏览器窗口的屏幕位置,或改变浏览器窗口的显示大小,因此固定定位的元素会始终位于浏览器窗口内视图的某个位置,不会受文档流动...

    html css将表头固定的最直接的方法

    position属性取值为fixed时,则元素的位置将不受滚动条的影响,而是直接依据窗口定位,这就是将表头固定的最直接方法,网上其他途径感觉都是在走弯路。但是与此同时必须解决两个问题。第一:表体将随之不依据表头...

    CSS+JS+Cookie实现页脚固定广告展示(支持关闭、一段时间内不显示)

    经常看到有些网站为了吸引用户注意,在页面底部放置固定横幅广告,用户滚动页面时,横幅广告一直固定在页底,并不随页面滚动而滚动,当然一般允许用户可以关闭广告条,并设置一定时间内不再显示此广告条。...

    JavaScript Table行定位效果

    一开始的需求只是表头部分在滚动时能一直固定在头部,那关键要实现的就是让tr能定位。 首先想到的方法是给tr设置relative,用ie6/7测试以下代码: Code &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional...

    《程序天下:JavaScript实例自学手册》光盘源码

    17.8 窗体滚动条随文字增加自动滚动 17.9 为textarea加横向滚动条 17.10 记录滚动条位置 17.11 彩色滚动条 17.12 Windows XP的滚动条 第18章 在线考题案例 18.1 在线考试代码 18.2 在线考试代码(二) 18.3 在线测试...

    程序天下:JavaScript实例自学手册

    17.8 窗体滚动条随文字增加自动滚动 17.9 为textarea加横向滚动条 17.10 记录滚动条位置 17.11 彩色滚动条 17.12 Windows XP的滚动条 第18章 在线考题案例 18.1 在线考试代码 18.2 在线考试代码(二) 18.3 在线测试...

    dreamweaver网站PHP开发MXP插件

    滚动条主题颜色管理器.mxp 很COOL的可变大小的层插件.mxp 横向数据重复的插件.mxp 换行显示搜索高亮度文本插件.mxp 记录集跳转菜单插件.mxp 检查新元素插件.mxp 检验控制组件插件.mxp 简约版高级分页插件.mxp 截取...

    JavaScript网页特效范例宝典源码

    实例268 广告随滚动条漂移 418 9.4 页面动画效果 419 实例269 下雪 419 实例270 飘落的枫叶 421 实例271 下雨 423 实例272 背景的烟花效果 425 实例273 变色的圆圈 427 实例274 滚动的光环 429 实例275 星空极速飞入...

    JQuery&CSS;&CSS;+DIV实例大全.rar

    41.jquery拖动滚动条控制图片滚动及图片放大特效的示例 42.jquery旋转式图片切换并带图片放大功能 43.jQuery漂亮网页右上角双层撕角广告代码 44.jquery漂亮网页布局综合定时器、切换间隔、滚动时间、滚动图片...

    dreamweaver上PHP网站开发相关插件

    插入一条滚动的文字,并且可以设置它滚动的方向。 Background that Fit.mxp 把一张图片作为背景铺满整个浏览器,可随浏览大小的变化自动调整。 URL into layer.mxp 在你的网页里面插入一个层,并且在这个层里面...

    VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:

    CTLCOLOR_SCROLLBAR 滚动条 CTLCOLOR_STATIC 静态控件 表2 nCtlColor的类型值与含义 作为一个简单的例子,观察以下的代码: BOOL CUi5Dlg::OnInitDialog() { //… //创建字体 //CFont CUi1View::m_Font1, CUi1...

    Tcl_TK编程权威指南pdf

    本地化的按钮和滚动条 文本组件中的图片 destroy不再产生错误 grid rowconfigure 补丁版本 第52章 tcl/tk 8.1 unicode与国际化 线程安全 高级正则表达式 新字符串命令 dde扩展模块 杂类 第53章 tcl/tk...

    PHP动态网站开发插件

    插入一条滚动的文字,并且可以设置它滚动的方向。 Background that Fit.mxp Download 点击下载 把一张图片作为背景铺满整个浏览器,可随浏览大小的变化自动调整。 URL into layer.mxp Download 点击下载 在你的网页...

    flash shiti

    2.选定舞台上的元素,并将选定元素拖到库面板上 3.填写Convert to Symbol 对话框,并点击确定" 10. 某电影中,只有一个layer1,其上放置一个有两个元件(test1 和test2)组合成的组合体, 选择这个组合体执行打散Ctrl...

Global site tag (gtag.js) - Google Analytics