js无缝滚动只滚动2次就停了是什么原因

lwenbc 2012-08-14 11:28:06
<div id="colee" style="overflow:hidden;height:100px;width:200px;">
<div id="colee1">
我是滚动内容1
我是滚动内容2
我是滚动内容3
我是滚动内容4
我是滚动内容5
我是滚动内容6
我是滚动内容7
我是滚动内容8
我是滚动内容9
</div>
<div id="colee2"></div>
</div>
<script type="text/javascript">
var speed = 30;
var colee2 = document.getElementById("colee2");
var colee1 = document.getElementById("colee1");
var colee = document.getElementById("colee");
colee2.innerHTML = colee1.innerHTML; //克隆colee1为colee2
function Marquee1() {
//当滚动至colee1与colee2交界时
if (colee2.offsetTop <= colee.scrollTop) {
colee.scrollTop -= colee1.offsetHeight; //colee跳到最顶端
} else {
colee.scrollTop++;
}
}
var MyMar1 = setInterval(Marquee1, speed)//设置定时器
//鼠标移上时清除定时器达到滚动停止的目的
colee.onmouseover = function() { clearInterval(MyMar1) }
//鼠标移开时重设定时器
colee.onmouseout = function() { MyMar1 = setInterval(Marquee1, speed) }
</script>

js代码跟html如上,单独放在一个页面运行测试就可以,可当放到实际项目中只滚动2次就停了。我百思不得其解。
请问大家这个问题到底出在哪里?我怎么觉得跟滚动内容的行数或者“colee”的高度有关啊,可是又不知怎么解决
...全文
2382 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
武学鸠摩智 2014-04-23
  • 打赏
  • 举报
回复
11楼!你太给力了,说白了,我们还是对概念理解不彻底,我想学好JS,希望你推荐点课程或者书籍,重复一遍,这个问题你,太给力了
Lunatree 2014-03-07
  • 打赏
  • 举报
回复
感谢11楼,帮我解决大问题了
Amen0702 2013-10-13
  • 打赏
  • 举报
回复
万能的十一楼! 爱死你了 帮了大忙!
aizyou 2013-04-19
  • 打赏
  • 举报
回复
11楼 谢谢
oMoShengDeWeiLai 2012-09-27
  • 打赏
  • 举报
回复
11楼给力!
shanglei005166 2012-09-07
  • 打赏
  • 举报
回复
11楼才是真相帝
lwenbc 2012-08-17
  • 打赏
  • 举报
回复
解决了,查资料得知跟offsetTop有关系:
1、当元素的父容器没有指定定位方式时,指元素与body元素之间的偏移距离;
2、当对父容器指定定位方式(如:position:relative;)时,则指元素与父容器之间的偏移距离;

所以,当没有指定定位方式时,代码中的colee2.offsetTop值已经是元素colee2与body元素之间的偏移距离了。当这部分代码置入页面上方top:0处时,自然没有问题。但是,如果插入到页面下方时,colee2.offsetTop值就已经不再是top:0了,自然就出现位移偏差了,以致滚动执行不正确!

所以只需在colee的css样式中加入"position:absolute"即可。
即:
<div id="colee" style="overflow:hidden;height:100px;width:200px;position:absolute;">
以上希望对遇到同样问题的朋友有所帮助。

杰拉尔 2012-08-15
  • 打赏
  • 举报
回复
if (90 <= colee.scrollTop) { 我这样写就可以成功不过还是要找出原因。。没时间了上班去了。。
杰拉尔 2012-08-15
  • 打赏
  • 举报
回复
上面的代码是可执行的原因在于

colee2.offsetTop <= colee.scrollTop

现在还有个问题就是

colee2.offsetTop 最大只有90 colee.scrollTop确有103
杰拉尔 2012-08-15
  • 打赏
  • 举报
回复
<!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></title>
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
</head>
<body>
<div id="colee" style="overflow:hidden;height:100px;width:200px;">
<div id="colee1">
我是滚动内容1
我是滚动内容2
我是滚动内容3
我是滚动内容4
我是滚动内容5
我是滚动内容6
我是滚动内容7
我是滚动内容8
我是滚动内容9
</div>
<div id="colee2"></div>
</div>
<script type="text/javascript">
var speed = 30;
var colee2 = document.getElementById("colee2");
var colee1 = document.getElementById("colee1");
var colee = document.getElementById("colee");
colee2.innerHTML = colee1.innerHTML; //克隆colee1为colee2
function Marquee1() {
$("#a").html(colee2.offsetTop + "-" + colee.scrollTop+"<br/>")
//当滚动至colee1与colee2交界时
if (90 <= colee.scrollTop) {
colee.scrollTop -= colee1.offsetHeight; //colee跳到最顶端
} else {
colee.scrollTop++;
}
}
var MyMar1 = setInterval(Marquee1, speed)//设置定时器
//鼠标移上时清除定时器达到滚动停止的目的
colee.onmouseover = function () { clearInterval(MyMar1) }
//鼠标移开时重设定时器
colee.onmouseout = function () { MyMar1 = setInterval(Marquee1, speed) }
</script>
<span id="a"></span>
</body>
</html>
H_Gragon 2012-08-15
  • 打赏
  • 举报
回复
直接用marquee不就行了,省了写js代码:

<marquee direction="up" onmousemove="this.stop()" onmouseout="this.start()" scrollAmount="1" scoreDelay="4" style="width: 90%; height: 180px;" >
<div id="colee1">
我是滚动内容1
我是滚动内容2
我是滚动内容3
我是滚动内容4
我是滚动内容5
我是滚动内容6
我是滚动内容7
我是滚动内容8
我是滚动内容9
</div>
</marquee>
myhope88 2012-08-15
  • 打赏
  • 举报
回复
4楼分析得挺正确的了,按照它的思路去弄就行了
yzf86211861 2012-08-15
  • 打赏
  • 举报
回复
上面 已经分析的很详细了 具体还要自己去 测试
杰拉尔 2012-08-15
  • 打赏
  • 举报
回复
1、各浏览器下 scrollTop的差异
IE6/7/8:
对于没有doctype声明的页面里可以使用 document.body.scrollTop 来获取 scrollTop高度 ;
对于有doctype声明的页面则可以使用 document.documentElement.scrollTop ;
Safari:
safari 比较特别,有自己获取scrollTop的函数 : window.pageYOffset ;
Firefox:
火狐等等相对标准些的浏览器就省心多了,直接用 document.documentElement.scrollTop ;
2、获取scrollTop值
完美的获取scrollTop 赋值短语 :
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
通过这句赋值就能在任何情况下获得scrollTop 值。
仔细观察这句赋值,你发现啥了没??
没错, 就是 window.pageYOffset (Safari) 被放置在 || 的中间位置。
因为当 数字0 与 undefine 进行 或运算时,系统默认返回最后一个值。即或运算中 0 == undefine ;
当页面滚动条刚好在最顶端,即scrollTop值为 0 时。 IE 下 window.pageYOffset (Safari) 返回为 undefine ,此时将 window.pageYOffset (Safari) 放在或运算最后面时, scrollTop 返回 undefine , undefine 用在接下去的运算就会报错咯。
而其他浏览器 无论 scrollTop 赋值或运算顺序如何都不会返回 undefine. 可以安全使用..
所以说到头还是IE的问题咯. 杯具…
精神有点恍惚,不知道有没有表达清楚。
不过最后总结出来这句实验过OK,大家放心使用;
杰拉尔 2012-08-15
  • 打赏
  • 举报
回复
colee.scrollTop 没取到
孟子E章 2012-08-15
  • 打赏
  • 举报
回复
没有项目的整个页面代码,无法测试
孟子E章 2012-08-15
  • 打赏
  • 举报
回复
跟dtd设置,内容高度有关系。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧