<marquee>不属于w3c标准,在XHTML1.0以后就完全被抛弃了,只有IE5 / IE6能够支持,在FF和IE7里头被彻底遗弃。但是,局部完全统计,十个网站有6、7个都用到滚动信以到达增强页面的动态效果的目的。
既然marquee不能用为我们所用,故此不得不找寻相应的替代品。Flash不那么通用,一般大家会首选javascript。研究了很多别人写的JS,效果都不如人意,要不是浏览器兼容性不行,或者就是不能实现无缝滚动的效果;能做到无缝滚动和很好的浏览器兼容性的也存在着不尽如人意的问题:如果滚动内容小于滚动区域的话,便静止了下来。简单的来说就是不能实现有间隙的滚动,或者无法判断滚动内容的长度是否达到无缝滚动的要求,从而只能选者滚动方式。
数天的研究和反复地实践,在前些日子自己写了一个JS类,终于把“滚”的问题解决了。并且已经运用到几个项目中,完完全全替代了<marquee>标签。今天发布出来与大家分享,希望大家能多给点意见,我将继续改进!
下载地址:JsMarquee.rar
演示地址:http://blog.chenreal.com/demo/marquee/index.html
JS代码:
<!--
/*JS Marquee Version 1.2(Javascript实现Marquee的效果,实现无缝/有间隙的二维滚动效果)*/
/*Author : ChenReal
Email : chenreal@21cn.com
Date : 2007-10-22*/
function Marquee(MarName)
{
this.ID = document.getElementById(MarName);
this.Speed = 30; //数字越大速度越慢
this.Direction = 0;//滚动方向:0代表左;1代表右;2代表上;3代表下
this.Width = 0;//高度
this.Height = 0;//宽度
this.Space = 0;//是否有间隙:0代表否;1代表是
this.Tag = "p";//滚动内容的标签,默认是<p>,也可以是<ul>,实践证明:<p>与<ul>不能嵌套使用。其他标签暂时不推荐。
//开始滚动
this.Start = function(){
MarqueeStart(this,this.Direction,this.Width,this.Height,this.Speed,this.Space,this.Tag);
}
//停止滚动并释放对象
this.End = function(){
MarqueeEnd(this);
}
}
/*JS Marquee Version 1.2(Javascript实现Marquee的效果,实现无缝/有间隙的二维滚动效果)*/
/*Author : ChenReal
Email : chenreal@21cn.com
Date : 2007-10-22*/
function Marquee(MarName)
{
this.ID = document.getElementById(MarName);
this.Speed = 30; //数字越大速度越慢
this.Direction = 0;//滚动方向:0代表左;1代表右;2代表上;3代表下
this.Width = 0;//高度
this.Height = 0;//宽度
this.Space = 0;//是否有间隙:0代表否;1代表是
this.Tag = "p";//滚动内容的标签,默认是<p>,也可以是<ul>,实践证明:<p>与<ul>不能嵌套使用。其他标签暂时不推荐。
//开始滚动
this.Start = function(){
MarqueeStart(this,this.Direction,this.Width,this.Height,this.Speed,this.Space,this.Tag);
}
//停止滚动并释放对象
this.End = function(){
MarqueeEnd(this);
}
}
function MarqueeStart(Mar,Direction,Width,Height,Speed,Space,Tag){
var msobj;
if(typeof(Mar) == "string"){
msobj = new Marquee(Mar);
}
if(typeof(Mar) == "object"){
msobj = Mar;
}
if(!msobj.ID) return;
msobj.ID.style.width = Width + "px";
msobj.ID.style.height = Height + "px";
msobj.ID.style.overflow = msobj.ID.style.overflowX = msobj.ID.style.overflowY = "hidden";
msobj.Direction = Direction;
msobj.Width = Width;
msobj.Height = Height;
msobj.Speed = Speed;
msobj.Space = Space;
msobj.Tag = Tag;
msobj.InnerDiv = msobj.ID.getElementsByTagName("div")[0];
if(!msobj.InnerDiv) return;
msobj.InnerDiv.innerHTML += msobj.InnerDiv.innerHTML;
msobj.Inner = msobj.ID.getElementsByTagName(Tag);
if(!msobj.Inner) return;
switch(Direction)
{
case 2:
msobj.InnerDiv.style.width = Width + "px";
msobj.Inner[0].style.width =Width + "px";
msobj.Inner[1].style.width =Width + "px";
if(Height>=msobj.Inner[1].offsetHeight || msobj.Space ==1){
msobj.Inner[0].style.paddingTop = Height + "px";
msobj.Inner[1].style.paddingTop = Height + "px";;
}
break;
case 3:
msobj.InnerDiv.style.width = Width + "px";
msobj.Inner[0].style.width =Width + "px";
msobj.Inner[1].style.width =Width + "px";
if(Height>=msobj.Inner[1].offsetHeight || msobj.Space ==1){
msobj.Inner[0].style.paddingBottom = Height + "px";
msobj.Inner[1].style.paddingBottom = Height + "px";
}
break;
default:
msobj.InnerDiv.noWrap = true;
if(Width >= msobj.Inner[1].offsetWidth || msobj.Space ==1){
msobj.Inner[0].style.paddingLeft = Width + "px";
msobj.Inner[1].style.paddingLeft = Width + "px";
}
break;
}
msobj.ID.onmouseover = function(){
clearInterval(msobj.TimerID);
}
msobj.ID.onmouseout = function(){
clearInterval(msobj.TimerID);
msobj.TimerID = funcInterval(MarqueeScroll,msobj.Speed,msobj);
}
msobj.TimerID = funcInterval(MarqueeScroll,msobj.Speed,msobj);
}
var msobj;
if(typeof(Mar) == "string"){
msobj = new Marquee(Mar);
}
if(typeof(Mar) == "object"){
msobj = Mar;
}
if(!msobj.ID) return;
msobj.ID.style.width = Width + "px";
msobj.ID.style.height = Height + "px";
msobj.ID.style.overflow = msobj.ID.style.overflowX = msobj.ID.style.overflowY = "hidden";
msobj.Direction = Direction;
msobj.Width = Width;
msobj.Height = Height;
msobj.Speed = Speed;
msobj.Space = Space;
msobj.Tag = Tag;
msobj.InnerDiv = msobj.ID.getElementsByTagName("div")[0];
if(!msobj.InnerDiv) return;
msobj.InnerDiv.innerHTML += msobj.InnerDiv.innerHTML;
msobj.Inner = msobj.ID.getElementsByTagName(Tag);
if(!msobj.Inner) return;
switch(Direction)
{
case 2:
msobj.InnerDiv.style.width = Width + "px";
msobj.Inner[0].style.width =Width + "px";
msobj.Inner[1].style.width =Width + "px";
if(Height>=msobj.Inner[1].offsetHeight || msobj.Space ==1){
msobj.Inner[0].style.paddingTop = Height + "px";
msobj.Inner[1].style.paddingTop = Height + "px";;
}
break;
case 3:
msobj.InnerDiv.style.width = Width + "px";
msobj.Inner[0].style.width =Width + "px";
msobj.Inner[1].style.width =Width + "px";
if(Height>=msobj.Inner[1].offsetHeight || msobj.Space ==1){
msobj.Inner[0].style.paddingBottom = Height + "px";
msobj.Inner[1].style.paddingBottom = Height + "px";
}
break;
default:
msobj.InnerDiv.noWrap = true;
if(Width >= msobj.Inner[1].offsetWidth || msobj.Space ==1){
msobj.Inner[0].style.paddingLeft = Width + "px";
msobj.Inner[1].style.paddingLeft = Width + "px";
}
break;
}
msobj.ID.onmouseover = function(){
clearInterval(msobj.TimerID);
}
msobj.ID.onmouseout = function(){
clearInterval(msobj.TimerID);
msobj.TimerID = funcInterval(MarqueeScroll,msobj.Speed,msobj);
}
msobj.TimerID = funcInterval(MarqueeScroll,msobj.Speed,msobj);
}
function MarqueeScroll(Mar){
switch(Mar.Direction)
{
case 0:
if(Mar.Inner[1].offsetWidth-Mar.ID.scrollLeft<=0)
Mar.ID.scrollLeft-=Mar.Inner[0].offsetWidth;
else{
Mar.ID.scrollLeft++;
}
break;
case 1:
if(Mar.ID.scrollLeft==0)
Mar.ID.scrollLeft=Mar.Inner[1].offsetWidth;
else{
Mar.ID.scrollLeft--;
}
break;
case 2:
if(Mar.Inner[1].offsetHeight-Mar.ID.scrollTop<=0)
Mar.ID.scrollTop-=Mar.Inner[0].offsetHeight;
else{
Mar.ID.scrollTop++;
}
break;
case 3:
if(Mar.ID.scrollTop<=0)
Mar.ID.scrollTop = Mar.Inner[1].offsetHeight;
else{
Mar.ID.scrollTop--;
}
break;
}
}
switch(Mar.Direction)
{
case 0:
if(Mar.Inner[1].offsetWidth-Mar.ID.scrollLeft<=0)
Mar.ID.scrollLeft-=Mar.Inner[0].offsetWidth;
else{
Mar.ID.scrollLeft++;
}
break;
case 1:
if(Mar.ID.scrollLeft==0)
Mar.ID.scrollLeft=Mar.Inner[1].offsetWidth;
else{
Mar.ID.scrollLeft--;
}
break;
case 2:
if(Mar.Inner[1].offsetHeight-Mar.ID.scrollTop<=0)
Mar.ID.scrollTop-=Mar.Inner[0].offsetHeight;
else{
Mar.ID.scrollTop++;
}
break;
case 3:
if(Mar.ID.scrollTop<=0)
Mar.ID.scrollTop = Mar.Inner[1].offsetHeight;
else{
Mar.ID.scrollTop--;
}
break;
}
}
function MarqueeEnd(Mar){
if(!Mar)return;
if(typeof(Mar.TimerID) == "number") {
clearInterval(Mar.TimerID);
Mar = null;
}
}
if(!Mar)return;
if(typeof(Mar.TimerID) == "number") {
clearInterval(Mar.TimerID);
Mar = null;
}
}
function funcInterval(funcName,time){
var args=[];
for(var i=2;i<arguments.length;i++){
args.push(arguments[i]);
}
return window.setInterval(function(){
funcName.apply(this,args);
},time);
}
//-->
var args=[];
for(var i=2;i<arguments.length;i++){
args.push(arguments[i]);
}
return window.setInterval(function(){
funcName.apply(this,args);
},time);
}
//-->
HTML:
a<!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>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<script src="js/marquee.js" language="javascript" type="text/javascript"></script>
<script language="javascript">
window.onload = function(){
var mar = new Marquee("marquee");
mar.Direction = 0;
mar.Width = 270;
mar.Height = 16;
mar.Speed = 20;
mar.Space = 0;
mar.Start();
MarqueeStart("marquee1",1,70,16,30,0,"p");
MarqueeStart("marquee2",2,150,100,30,1,"p");
MarqueeStart("marquee3",3,20,62,30,0,"p");
MarqueeStart("marquee4",0,70,50,30,0,"ul");
}
</script>
<style>
.marquee {border:1px solid #999999;}
.marquee div{width:1000%;}
.marquee div p{display:block; float:left; margin:0px;}
.marquee div ul{display:block; float:left; margin:0px;padding:0px;}
.marquee div ul li{float:left; display:block; border:solid 1px #666666; padding:14px 21px 14px 21px; margin:1px 10px 1px 10px; list-style:none;}
</style>
<title>Marquee Test</title>
</head>
<body>
<br /><br />
<div id="marquee" class="marquee">
<div>
<p>横向有间隙从左到右滚动</p>
</div>
</div>
<br /><br />
<div id="marquee1" class="marquee">
<div>
<p>间无向横 ~~~~~动滚左到右从隙</p>
</div>
</div>
<br /><br />
<div id="marquee2" class="marquee">
<div>
<p>从上到下<br>有间隙滚动</p>
</div>
</div>
<br /><br />
<div id="marquee3" class="marquee">
<div>
<p>从<br>下<br>到<br>上<br>有<br>间<br>隙<br>滚<br>动</p>
</div>
</div>
<br /><br />
<div id="marquee4" class="marquee">
<div>
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
</div>
</div>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<script src="js/marquee.js" language="javascript" type="text/javascript"></script>
<script language="javascript">
window.onload = function(){
var mar = new Marquee("marquee");
mar.Direction = 0;
mar.Width = 270;
mar.Height = 16;
mar.Speed = 20;
mar.Space = 0;
mar.Start();
MarqueeStart("marquee1",1,70,16,30,0,"p");
MarqueeStart("marquee2",2,150,100,30,1,"p");
MarqueeStart("marquee3",3,20,62,30,0,"p");
MarqueeStart("marquee4",0,70,50,30,0,"ul");
}
</script>
<style>
.marquee {border:1px solid #999999;}
.marquee div{width:1000%;}
.marquee div p{display:block; float:left; margin:0px;}
.marquee div ul{display:block; float:left; margin:0px;padding:0px;}
.marquee div ul li{float:left; display:block; border:solid 1px #666666; padding:14px 21px 14px 21px; margin:1px 10px 1px 10px; list-style:none;}
</style>
<title>Marquee Test</title>
</head>
<body>
<br /><br />
<div id="marquee" class="marquee">
<div>
<p>横向有间隙从左到右滚动</p>
</div>
</div>
<br /><br />
<div id="marquee1" class="marquee">
<div>
<p>间无向横 ~~~~~动滚左到右从隙</p>
</div>
</div>
<br /><br />
<div id="marquee2" class="marquee">
<div>
<p>从上到下<br>有间隙滚动</p>
</div>
</div>
<br /><br />
<div id="marquee3" class="marquee">
<div>
<p>从<br>下<br>到<br>上<br>有<br>间<br>隙<br>滚<br>动</p>
</div>
</div>
<br /><br />
<div id="marquee4" class="marquee">
<div>
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
</div>
</div>
</body>
</html>