转载自: http://blog.csdn.net/ibm_hoojo/article/details/5790372
一、csdn博客中的招聘广告效果:
二、以下是代码实现
注意:这段代码在有的浏览器中会变为乱码,此时得把里面的下面部分去掉即可:
<meta http-equiv="author" content="hoojo">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>csdn 博客 招聘滚动信息广告特效</title>
<meta http-equiv="author" content="hoojo">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">
.recruit {
border:1px solid #C1AE9E;
display:inline;
float:left;
margin-left:15px;
padding:1px;
text-align:left;
width:200px;
font-size:12px;
}
dd.recruit ul {
float:none;
height:252px;
margin:10px 5px;
overflow:hidden;
padding:0;
width:auto;
}
body {
color:#000000;
font-family:verdana,sans-serif;
font-size:75%;
font-size-adjust:none;
font-style:normal;
font-variant:normal;
font-weight:normal;
line-height:150%;
text-align:center;
}
dd {
float:left;
margin:0;
padding:0;
width:474px;
}
a:link {
font-size: 12px;
text-decoration: none;
color: black;
}
a:hover {
font-size: 12px;
text-decoration: none;
color: red;
}
a:active {
font-size: 12px;
text-decoration: none;
color: blue;
}
a:visited {
font-size: 12px;
text-decoration: none;
color: black;
}
* {
font-size: 12px;
}
</style>
<script>
function startmarquee(lh, speed, delay, index) {
var t;
var p = false;
var o = document.getElementById("marqueebox" + index);
o.innerHTML += o.innerHTML;
o.onmouseover = function () { p = true }
o.onmouseout = function () { p = false }
o.scrollTop = 0;
function start() {
t = setInterval(scrolling, speed);
if (!p)
o.scrollTop += 2;
}
function scrolling() {
if (o.scrollTop % lh != 0) {
o.scrollTop += 2;
if (o.scrollTop >= o.scrollHeight / 2)
o.scrollTop = 0;
} else {
clearInterval(t);
setTimeout(start, delay);
}
}
setTimeout(start, delay);
}
function addEventHandler(target, type, func) {
if (target.addEventListener)
target.addEventListener(type, func, false);
else if (target.attachEvent)
target.attachEvent("on" + type, func);
else
target["on" + type] = func;
}
addEventHandler(window, "load", function () {
startmarquee(42, 50, 3000, 0);
});
</script>
</head>
<body>
<dd class="recruit" id="recommended">
<h5>
热门招聘职位
</h5>
<ul id="marqueebox0">
<li>
<a target="_blank" href="#">2010支付宝技术专场招聘</a>
</li>
<li>
<a target="_blank" href="#">【惠普】研发中心诚聘 .NET Tech
Lead(Quality Center)</a>
</li>
<li>
<a target="_blank" href="#">【东方通】中间件第一品牌:高薪.急聘!</a>
</li>
<li>
<a target="_blank" href="#">【惠普】研发中心诚聘 C++资深开发工程师</a>
</li>
<li>
<a target="_blank" href="#">北京明天高软科技 高级需求分析师</a>
</li>
<li>
<a target="_blank" href="#">北京明天高软科技有限公司 高级java工程师</a>
</li>
<li>
<a target="_blank" href="#">北京明天高软科技 JAVA开发工程师</a>
</li>
<li>
<a target="_blank" href="http://g.csdn.net/5149674">北京明天高软科技
测试工程师</a>
</li>
<li>
<a target="_blank" href="http://g.csdn.net/5149688">【惠普】研发中心诚聘
QA Tech Lead(LoadRunner)</a>
</li>
<li>
<a target="_blank" href="http://g.csdn.net/5149690">【惠普】研发中心诚聘
.NET Senior Developer (Quality Center)</a>
</li>
<li>
<a target="_blank" href="http://g.csdn.net/5149693">【惠普】研发中心诚聘
R&D Tech Lead(LoadRunner or QTP)</a>
</li>
<li>
<a target="_blank" href="http://g.csdn.net/5149691">【CSDN】招聘:Ruby
工程师、Java搜索工程师、运营编辑、兼职编辑</a>
</li>
<li>
<a target="_blank" href="#">2010支付宝技术专场招聘</a>
</li>
<li>
<a target="_blank" href="#">【惠普】研发中心诚聘 .NET Tech
Lead(Quality Center)</a>
</li>
<li>
<a target="_blank" href="#">【东方通】中间件第一品牌:高薪.急聘!</a>
</li>
<li>
<a target="_blank" href="#">【惠普】研发中心诚聘 C++资深开发工程师</a>
</li>
<li>
<a target="_blank" href="#">北京明天高软科技 高级需求分析师</a>
</li>
<li>
<a target="_blank" href="#">北京明天高软科技有限公司 高级java工程师</a>
</li>
<li>
<a target="_blank" href="#">北京明天高软科技 JAVA开发工程师</a>
</li>
<li>
<a target="_blank" href="#">北京明天高软科技 测试工程师</a>
</li>
<li>
<a target="_blank" href="#">【惠普】研发中心诚聘 QA Tech
Lead(LoadRunner)</a>
</li>
<li>
<a target="_blank" href="#">【惠普】研发中心诚聘 .NET Senior
Developer (Quality Center)</a>
</li>
<li>
<a target="_blank" href="#">【惠普】研发中心诚聘 R&D Tech
Lead(LoadRunner or QTP)</a>
</li>
<li>
<a target="_blank" href="http://g.csdn.net/5149691">【CSDN】招聘:Ruby
工程师、Java搜索工程师、运营编辑、兼职编辑</a>
</li>
</ul>
</dd>
</body>
</html>
三、原理分析
1、在<head></head>里有<script>,而<script></script>间有
addEventHandler(window, "load", function () {
startmarquee(42, 50, 3000, 0);
});
它不是一个函数定义,而是一个运行表达式,参数分别为:window、"load",function () { startmarquee(42, 50, 3000, 0);}。
2、接下来我们来看看addEventHandler函数的定义:
function addEventHandler(target, type, func) {
if (target.addEventListener)
target.addEventListener(type, func, false);
else if (target.attachEvent)
target.attachEvent("on" + type, func);
else
target["on" + type] = func;
}
按它的定义,1、里的运行式的意思是给调用window的属性中的addEventListener方法,此方法的目的是告诉window在"load"时调用方法startmarquee(42, 50, 3000, 0);
3、以上只是安装一个动作而已,接下来我们开始实现startmarquess,它是实现文件滚动的真正所在。
3、1 首先获得Id为"marqueebox"+index的文档元素,然后设置此元素的onmouseover事件、onmouseout事件的处理、scrollTop属性为0(即指它的顶部一开始为0)、
这些属性及变量是为了控制滚动而定义的。
3、2 声明两个函数,一个是开始滚动,一个是滚动动作的实现。
3、3 接下来是用setTimeout启动定时器,表delay时间后动行start函数(此定时器只触发一次)。
start函数就是设置一个中断,此中断每speed运行一次scrolling,然后根据鼠标是否放在上面来决定是否把o.scroolTop的属性加2。
在scrolling函数里,判断加了2的值是否超出,如果滚动的高度大于了总高度的一半,那么就重新置0;
function startmarquee(lh, speed, delay, index) {
var t;
var p = false;
var o = document.getElementById("marqueebox" + index);
o.innerHTML += o.innerHTML;
o.onmouseover = function () { p = true }
o.onmouseout = function () { p = false }
o.scrollTop = 0;
function start() {
t = setInterval(scrolling, speed);
if (!p)
o.scrollTop += 2;
}
function scrolling() {
if (o.scrollTop % lh != 0) {
o.scrollTop += 2;
if (o.scrollTop >= o.scrollHeight / 2)
o.scrollTop = 0;
} else {
clearInterval(t);
setTimeout(start, delay);
}
}
setTimeout(start, delay);
}