2005-4-11 00:42
阿米的眼泪
无间断滚动marquee的详细用法解析
[url]http://www.xiaoerhei.com/showlog.asp?log_id=707&cat_id=37[/url][/b]
记得前阵子有个朋友(锅边)问我 无间断滚动
我也忘记了我当时在做什么了
随便上网拷了一段代码给他
实现是可以实现
但是太麻烦了
一大堆的代码
不静下心来是看不懂的
趁着 今天有空
就来研究下 marquee 的终极用法
嘿嘿 ```
先看下 marquee 的html 属性
<MARQUEE ALIGN="…"
BEHAVIOR="…"
BGCOLOR="…"
DIRECTION="…"
HEIGHT="…"
WIDTH="…"
HSPACE="…"
VSPACE="…"
LOOP="…"
SCROLLAMOUNT="…"
SCROLLDELAY="…"
>…
</MARQUEE>
align: --对其方式 LEFT,CENTER,RIGHT,TOP,BOTTOM (不用多说咯)
Behavior:--用于设定滚动的方式,主要由三种方式:
behavior="scroll"--表示由一端滚动到另一端;
behavior="slide":--表示由一端快速滑动到另一端,且不再重复;
behavior="alternate" 默认值 --表示在两端之间来回滚动。
看下例子把:
[code]
<marquee behavior="scroll">behavior="scroll"表示由一端滚动到另一端;</marquee>
<marquee behavior="slide">behavior="slide":表示由一端快速滑动到另一端,且不再重复;;</marquee>
<marquee behavior="alternate">behavior="alternate"表示在两端之间来回滚动。</marquee>
[/code]
direction:--left(默认值) 左; right 右;up 上;down 下;
bgcolor--背景颜色
height--高度
weight--宽度
Hspace和vspace--分别用于设定滚动字幕的左右边框和上下边框的宽度。 作用大概和 css中的 margin 差不多`
scrollamount--用于设定每个连续滚动文本后面的间隔,该间隔用像素表示,
以上是官方说法,其实就是滚动的速度,
值不能太大,要不从视觉角度来说,是没反映的
值越大速度越快 反之越慢咯 ```
scrolldelay--延迟时间
loop--这个属性大家也很熟悉把,循环次数; loop=-1的时候 一直重复循环 默认值
[code]
<marquee scrollamount="15">scrollamount="15" 15的时候 就很快了 </marquee>
<marquee scrollamount="5">scrollamount="5" </marquee>
<marquee scrollamount="5" direction="up">scrollamount="5"direction="up" </marquee>
<marquee scrollamount="3" direction="right">scrollamount="3"direction="right" </marquee>
<marquee scrollamount="3" direction="left" loop="10">scrollamount="3" direction="left" loop="10" </marquee>
[/code]
好 现在我们再来接触一些 Dcode 的一些知识
首先是两个鼠标事件
onmouseover 鼠标触发事件---当用户将鼠标指针移动到对象内时触发
onmouseout 鼠标滑出事件---当用户将鼠标指针移出对象边界时触发
这里要用到的是 this.start() 与this.stop()
onmouseover="this.stop();" onmouseout="this.start
意思就是 鼠标移到marquee的内容上的时候 停止循环
鼠标移开 marquee 又开始移动
[code]
<marquee direction="up" onmouseover="this.stop();" onmouseout="this.start();">
阿米的眼泪<br>
眼泪的阿米<br>
amily<br>
</marquee>
[/code]
继续
innercode--设置或获取位于对象起始和结束标签内的 code
innerText--设置或获取位于对象起始和结束标签内的文本
scrollLeft-- 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离
scrollTop --设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
PS:呵呵 大家不要和我以前一样想当然的还以为有scrollRigh和scrollDown
scrollDelay-- 设置或获取字幕滚动的速度
要创建垂直滚动的字幕,请将其 scrollLeft 属性设定为 0。
要创建水平滚动的字幕,请将其 scrollTop 属性设定为 0,这将覆盖任何脚本设置
scrollHeight-- 获取对象的滚动高度
scrollAmount--设置或获取介于每个字幕绘制序列之间的文本滚动像素数
offsetTop--获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置
offsetLeft--获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置
offsetHeight--获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度。
setInterval(表达式,交互时间)则不一样,它从载入后,每隔指定的时间就执行一次表达式
clearInterval 使用 setInterval 方法取消先前开始的间隔事件。
好 现在我们先看看 我佛山人(前辈呀)的一段程序
[code]
<div id=ami style=overflow:hidden;height:50;width:150>
<div id=ami1>
我是打头的<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动
</div>
<div id=ami2></div>
</div>
<script>
var speed=30;
ami2.innercode=ami1.innercode
function Marquee()
{
if(ami2.offsetTop-ami.scrollTop<=0)
ami.scrollTop-=ami1.offsetHeight;
else
ami.scrollTop++;
}
var MyMar=setInterval(Marquee,speed)
ami.onmouseover=function() {clearInterval(MyMar)}
ami.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</script>
[/code]
好 上面的就是不间断滚动了
小子无才
只好翻译下 这段代码
<script>
var speed=30; //设变量 滚动速度变量speed =30
ami2.innercode=ami1.innercode //复制ami1的code代码给ami2
function Marquee()
{
if(ami2.offsetTop-ami.scrollTop<=0) //如果ami2.offset-ami.scrolltop<=0(也就是ami1的内容滚动结束)则ami2开始滚动
ami.scrollTop-=ami1.offsetHeight; //ami.scrolltop此时的值为ami2滚动的长度
else
ami.scrollTop++;//否则ami1继续滚动咯
}
var MyMar=setInterval(Marquee,speed)//每隔30毫秒 执行一次
ami.onmouseover=function() {clearInterval(MyMar)} //鼠标移过 停止执行
ami.onmouseout=function() {MyMar=setInterval(Marquee,speed)}//滑出 继续执行
</script>
大家不理解的话
看这个例子
[code]
<MARQUEE id=m1 direction=up style="border-width:2px;border-style:solid;"
width=200 height=200>向上</MARQUEE><BR>
<!-- 单击此按钮可在字幕滚动时读取 scrollLeft 和 scrollTop 属性的值。 -->
<BUTTON onclick="alert('scrolltop: ' + m1.scrollTop + ' scrollLeft: ' + m1.scrollLeft)">读取</BUTTON>
<!-- 当字幕停止时,你可以设置水平字幕的 scrollLeft,或者设置垂直字幕的 scrollTop。 -->
<BUTTON onclick="m1.stop();m1.scrollTop = 100;">停止并设置 scrollTop=30</BUTTON>
<BUTTON onclick="m1.start();">开始</BUTTON>
[/code]
好的 接下来 同理可得
[code]
<div id=demo style=overflow:hidden;height:85 onmouseover="ii=1" onmouseout="ii=0" >
<div id=demo1>
我是打头的<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动
</div>
<div id=demo2></div>
<script>
var ii=0;t=demo.scrollTop
demo2.innercode=demo1.innercode
function qswhMarquee(){
if (ii==1)return
if(demo2.offsetTop-demo.scrollTop<=0)
demo.scrollTop-=demo1.offsetHeight
else
demo.scrollTop++
}
setInterval(qswhMarquee,60)
</script></div>
[/code]
再同理......嘿嘿
[code] <div style="width:200px;height:150px;overflow:hidden" onmouseover="try{clearTimeout(timer1)}catch(e){;}" onmouseout="timer1=setInterval('newsScroll()',10)">
<table cellspacing=0 cellpadding=5 bgcolor=#F8F8F8 style="position:relative;top:0px;width:200px;table-layout:fixed" id=news>
<tbody>
<tr>
<td valign=top height=150>
<b>新闻一</b><br>
我是打头的<br>
我向上运动<br>
我向上运动<br>
我向上运动
</td>
</tr>
<tr>
<td valign=top height=150>
<b>新闻二</b><br>
我是打头的<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
</td>
</tr>
<tr>
<td valign=top height=150>
<b>新闻三</b><br>
我是打头的<br>
我向上运动<br>
我向上运动<br>
</td>
</tr>
</tbody>
<script language=javascript>
//重复一次新闻内容
document.write(news.tBodies[0].innercode)
</script>
</table>
</div>
<script language=javascript>
//实现不间断滚动
function newsScroll()
{
news.style.pixelTop=(news.style.pixelTop-1)%(news.clientHeight/2);
}
timer1=setInterval('newsScroll()',10) //更改第二个参数可以改变速度,值越小,速度越快。
</script>
[/code]
以上都是 向上无间断的
接着给出向下的`````
[code]
<div id=ami style=overflow:hidden;height:50;width:150>
<div id=ami1>
我是打头的<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动
</div>
<div id=ami2></div>
</div>
<script>
var speed=30
ami2.innercode=ami1.innercode
ami.scrollTop=ami.scrollHeight
function Marquee(){
if(ami1.offsetTop-ami.scrollTop>=0)
ami.scrollTop+=ami2.offsetHeight
else{
ami.scrollTop--
}
}
var MyMar=setInterval(Marquee,speed)
ami.onmouseover=function() {clearInterval(MyMar)}
ami.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</script>
[/code]
2005-4-22 20:12
zlsunnan
超强 谢谢了已经收藏
2005-4-23 13:00
wolf_198
对不起,有bug
[code]<div id=ami style=overflow:hidden;height:50;width:150>
<div id=ami1>
我是打头的<br>
我向上运动<br>
</div>
<div id=ami2></div>
</div>
<script>
var speed=30;
ami2.innercode=ami1.innercode
function Marquee()
{
if(ami2.offsetTop-ami.scrollTop<=0)
ami.scrollTop-=ami1.offsetHeight;
else
ami.scrollTop++;
}
var MyMar=setInterval(Marquee,speed)
ami.onmouseover=function() {clearInterval(MyMar)}
ami.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</script>
[/code]
[ 本帖由 wolf_198 最后编辑于 2005-4-23 13:03 ]
2005-4-23 13:06
wolf_198
在我的机器上调试发现!!
在我的机器上调试发现,如果是两行的话,ami.scrollTop最多到22的时候就不在增加了,望高手更正
2005-4-23 14:19
wolf_198
看下面的代码
[code]
<div id=ami style=overflow:hidden;height:50;width:150>
<div id=ami1>
我是打头的<br>
我向上运动<br>
</div>
<div id=ami2></div>
</div>
<script>
var speed=30;
ami2.innerHTML=ami1.innerHTML
function Marquee()
{scrollTop1.value=ami.scrollTop;
scrollHeight1.value=ami.scrollHeight;
offsetTop1.value=ami.offsetTop;
offsetHeight1.value=ami.offsetHeight;
scrollTop2.value=ami1.scrollTop;
scrollHeight2.value=ami1.scrollHeight;
offsetTop2.value=ami1.offsetTop;
offsetHeight2.value=ami1.offsetHeight;
scrollTop3.value=ami2.scrollTop;
scrollHeight3.value=ami2.scrollHeight;
offsetTop3.value=ami2.offsetTop;
offsetHeight3.value=ami2.offsetHeight;
if(ami2.offsetTop-ami.scrollTop<=0)
ami.scrollTop-=ami1.offsetHeight;
else
ami.scrollTop++;
}
var MyMar=setInterval(Marquee,speed)
ami.onmouseover=function() {clearInterval(MyMar)}
ami.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</script>
<nobr>ami.scrollTop:<input type=text id="scrollTop1">ami.scrollHeight:<input type=text id="scrollHeight1">ami.offsetTop<input type=text id="offsetTop1">ami.offsetHeight:<input type=text id="offsetHeight1"></nobr>
<nobr>ami1.scrollTop:<input type=text id="scrollTop2">ami1.scrollHeight:<input type=text id="scrollHeight2">ami1.offsetTop<input type=text id="offsetTop2">ami1.offsetHeight:<input type=text id="offsetHeight2"></nobr>
<nobr>ami2.scrollTop:<input type=text id="scrollTop3">am2.scrollHeight:<input type=text id="scrollHeight3">ami2.offsetTop<input type=text id="offsetTop3">ami2.offsetHeight:<input type=text id="offsetHeight3"></nobr>
[/code]
2005-4-23 21:43
wolf_198
怎么没人回答,我顶!!!
2005-4-24 15:43
阿米的眼泪
代码更正如下:
[code]
<div id=ami style=overflow:hidden;height:50;width:150>
<div id=ami1>
我是打头的<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动
</div>
<div id=ami2></div>
</div>
<script>
var speed=30;
ami2.innerHTML=ami1.innerHTML
function Marquee()
{
if(ami2.offsetTop-ami.scrollTop<=0)
ami.scrollTop-=ami1.offsetHeight;
else
ami.scrollTop++;
}
var MyMar=setInterval(Marquee,speed)
ami.onmouseover=function() {clearInterval(MyMar)}
ami.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</script>
[/code]
[ 本帖由 阿米的眼泪 最后编辑于 2005-4-24 15:47 ]
2005-4-24 15:56
阿米的眼泪
[quote]
只有两行不能显示 [/quote]
呵呵```
原来代码设定的div的高时 50px
但是你只两行字 加起来的高远小于50px
所以 不可以实现
现在我们把高度调小点 就可以实现了
[code]<div id=ami style=overflow:hidden;height:30;width:150>
<div id=ami1>
我是打头的<br>
我向上运动
</div>
<div id=ami2></div>
</div>
<script>
var speed=30;
ami2.innerHTML=ami1.innerHTML
function Marquee()
{
if(ami2.offsetTop-ami.scrollTop<=0)
ami.scrollTop-=ami1.offsetHeight;
else
ami.scrollTop++;
}
var MyMar=setInterval(Marquee,speed)
ami.onmouseover=function() {clearInterval(MyMar)}
ami.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</script>
[/code]
[ 本帖由 阿米的眼泪 最后编辑于 2005-4-24 15:59 ]
2005-4-24 19:16
wolf_198
谢谢回贴,研究中
2005-11-19 01:10
xhychinaboy
[quote]引用内容由 [i]阿米的眼泪[/i] 发表于 2005-4-24 15:56
呵呵```
原来代码设定的div的高时 50px
但是你只两行字 加起来的高远小于50px
所以 不可以实现
现在我们把高度调小点 就可以实现了
[code]<div id=ami style=overflow:hidden;height:30;width:150&g ... [/quote]
好,不错,如果向左或向右呢!!
还有,代码放html代码的什么位置呢
2006-1-25 17:57
m++
请问楼主,如果是,两个同在一个页面的,每个都具有相同的功能,只是方向跑得不一样,当鼠标移上去时停止,如何让它们互不影响。。
2006-1-30 16:04
windowspp
不错啊。
2006-2-6 10:51
ansonvili
不错
2006-2-12 11:34
jiaxueq
[quote]引用内容由 [i]m++[/i] 发表于 2006-1-25 17:57
请问楼主,如果是,两个同在一个页面的,每个都具有相同的功能,只是方向跑得不一样,当鼠标移上去时停止,如何让它们互不影响。。 [/quote]
设置ID不同就行了,如
把ami改为xx
把ami1改为xx1
把ami2改为xx2
2006-3-9 17:30
raid1
好创意。
修正了下滚完一次后停顿一小次的bug.
[code]
<div id=ami style=overflow:hidden;height:50;width:150>
<div id=ami1>
我是打头的<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动
</div>
<div id=ami2></div>
</div>
<script>
var speed=30;
ami2.innerHTML=ami1.innerHTML
function Marquee()
{
if(ami2.offsetTop-ami.scrollTop<=0)
ami.scrollTop-=(ami1.offsetHeight-1); //修改
else
ami.scrollTop++;
}
var MyMar=setInterval(Marquee,speed)
ami.onmouseover=function() {clearInterval(MyMar)}
ami.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</script>
[/code]
2006-3-10 01:21
阿米的眼泪
哈 去年的帖子还在呀
2006-3-10 08:30
raid1
好帖常在呀.
2006-3-12 10:03
raid1
再完善一下程序
[code]
<html>
<head>
<style type="text/css">
<!--
.test {
font-size: 12px;
line-height: normal;
text-decoration: none;
}
-->
</style>
<head>
<body>
<div id="layer1" style="overflow-y:hidden;width:50;">
<div id="layer2">
<table width="130" height="70" border="0" align="center" cellpadding="0" cellspacing="0" class="test">
<tr>
<td width="150" height="70" valign="top" bgcolor="#FFFFFF" class="nav1style style46">
<center>第(1)条</center>
<a href="aspfile/show_article.asp?id=3038" title="关于<<电气工程自动化>>研究生班授课的通知" class="none_underline" target="_blank"><font color=#ff0000>关于<<电气工程自动化>>研究生班授课的通知 2006-3-9</font></a><br><br>
<center>第(2)条</center>
<a href="aspfile/show_article.asp?id=3036" title="关于企业管理研究生班授课的通知" class="none_underline" target="_blank"><font color=#ff0000>关于企业管理研究生班授课的通知 2006-3-8</font></a><br><br>
</td>
</tr>
</table>
</div>
<div id="layer3">
</div>
</div>
<script language="javascript">
var layerHeight = 100; // 定义滚动区域的高度.
var iFrame = 1; // 定义每帧移动的象素.
var iFrequency = 50; // 定义帧频率.
var timer; // 定义时间句柄.
if(document.getElementById("layer2").offsetHeight >= layerHeight)
document.getElementById("layer1").style.height = layerHeight;
else
document.getElementById("layer1").style.height = document.getElementById("layer2").offsetHeight;
document.getElementById("layer3").innerHTML = document.getElementById("layer2").innerHTML;
function move(){
if(document.getElementById("layer1").scrollTop >= document.getElementById("layer2").offsetHeight)
document.getElementById("layer1").scrollTop -= (document.getElementById("layer2").offsetHeight - iFrame)
else
document.getElementById("layer1").scrollTop += iFrame
}
timer = setInterval("move()",iFrequency);
document.getElementById("layer1").onmouseover=function() {clearInterval(timer);}
document.getElementById("layer1").onmouseout=function() {timer=setInterval("move()",iFrequency);}
</script>
</body>
</html>
[/code]
2006-3-14 09:37
szhln_dinasour
7楼、15楼、18楼的代码都是可行的。
2009-3-26 22:39
kugemachen
自己写的一个,带注释,绝对可用。
[code]<div id="marquees">
<div style="line-height:19px;">
我是打头的<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动<br>
我向上运动
</div>
</div>
<script language="javascript">
<!--
marqueesHeight=150; //内容区高度
stopscroll=false; //这个变量控制是否停止滚动
with(marquees){
noWrap=true; //这句表内容区不自动换行
style.width=0; //于是我们可以将它的宽度设为0,因为它会被撑大
style.height=marqueesHeight;
style.overflowY="hidden"; //滚动条不可见
onmouseover=new Function("stopscroll=true"); //鼠标经过,停止滚动
onmouseout=new Function("stopscroll=false"); //鼠标离开,开始滚动
}
//这时候,内容区的高度是无法读取了。下面输出一个不可见的层"templayer",稍后将内容复制到里面:
document.write('<div id="templayer" style="position:absolute;z-index:1;visibility:hidden"></div>');
function init(){ //初始化滚动内容
//多次复制原内容到"templayer",直到"templayer"的高度大于内容区高度:
while(templayer.offsetHeight<marqueesHeight){
templayer.innerHTML+=marquees.innerHTML;
} //把"templayer"的内容的“两倍”复制回原内容区:
marquees.innerHTML=templayer.innerHTML+templayer.innerHTML;
//设置连续超时,调用"scrollUp()"函数驱动滚动条:
setInterval("scrollUp()",20);
}
document.body.onload=init;
preTop=0; //这个变量用于判断滚动条是否已经到了尽头
function scrollUp(){ //滚动条的驱动函数
if(stopscroll==true) return; //如果变量"stopscroll"为真,则停止滚动
preTop=marquees.scrollTop; //记录滚动前的滚动条位置
marquees.scrollTop+=1; //滚动条向下移动一个像素
//如果滚动条不动了,则向上滚动到和当前画面一样的位置
//当然不仅如此,同样还要向下滚动一个像素(+1):
if(preTop==marquees.scrollTop){
marquees.scrollTop=templayer.offsetHeight-marqueesHeight+1;
}
}
-->
</script>[/code]
2009-4-16 09:45
jlmqq
蛮不错,收藏了。不过最好出个左右不间断的:loveliness:
页:
[1]
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.