
很简单的一个应用,实现方式当然也是多种多样,最直接的,通过<img>的src属性,但我想这是最废材的方法了,这样一个效果,你至少需要两张图片,然后是更多的DOM操作,你还要面对图片下载延迟的问题。还有啥性能(1,2)可言?
于是我写了以下的实现方式(DEMO):
function star(id){
var star = $(id);
var stars = $(id).getElementsByTagName("li");
for(var i=0; i<stars.length; i++){
stars[i].starNum = i+1;
stars[i].onmouseover = function(){
star.star = this.starNum;
star.style.backgroundPosition = 'left '+(-parseInt(this.starNum)*30)+'px';
}
stars[i].onclick = function(){
alert(star.star);
}
}
star.onmouseout = function(){
star.star = 0;
this.style.backgroundPosition = 'left top';
}
}
function $(id){return document.getElementById(id);}
当然要依据特定的DOM,这种方式通过改变背景图片的位置来实现,看起来似乎已经很完美了,可惜这只是较之于src的实现方法而言。
再看一个TZ的改进的版本(DEMO):
function $(element){
return document.getElementById(element) ;
}
var obj = $('outter').getElementsByTagName("li") ;
for (var i=0,k;k=obj[i];i++ ) {
k.no = i ;
k.onmouseover = function () {
for (var i=0;i<=this.no;i++ ) {
obj[i].style.backgroundPosition = 'left -30px' ;
}
}
k.onmouseout = function () {
for (var i=0;i<=this.no;i++ ) {
obj[i].style.backgroundPosition = 'left top' ;
}
}
}
很显然,这个写法比我的又更优化了一些。虽然都是通过改变背景图片的坐标来实现,但是,我使用了一个30K的jpg图片,TZ使用的却是一个只有599B的gif图片,但即使不使用gif,他的图片也会比我的小很多,大概是15倍左右~···,因为具体的实现方式决定了。虽然他的方法增加了更多的DOM操作,但是最大限度地优化网络传输方面的性能,总体性能是最佳的!
只有一个感概:只要有可能,就要最大限度的减少页面下载量,就要最大限度的提升代码性能!

2009-05-31 14:31:59reply
对星级评分,设计出来的版式可能会出现好几种。制作时变化会比较多。
最近工作需要刚好碰到这个,我就把效果摘出来。是通过CSS实现hove的效果。然后这个效果是考虑游客是行评论,所以是以记录cookie来表现。。当然登录过后的用户对cookie会进行限制不使用。
我觉得如果有些星级设计可以用CSS做的话。就不需要用DOM可能会更佳些。
http://byzuo.com/demo/mousebox/rating/
2009-06-01 15:39:45reply
如果那么注意图片大小,那为什么不做一个横向十颗星的图片呢,那样应该会更小吧.
2009-06-01 21:47:21reply
@游山玩水: 恩,非常好的办法~···
2009-06-03 18:13:12reply
嗯 能不用Js的尽量不用css
佐给的做法不错
2009-06-03 18:13:44reply
sun 说错了“能不用Js的尽量不用Js”