话说前端 (1)

Dec 1st, 2009 Add Comment

在平时工作中, 我们环绕需求设计页面结构, 样式和效果, 做成 DEMO, 再交付开发工程师套用并做成动态页面. 但是在交付工程师时, 我发现自己的思维方式和别的前端有点不一样. 我有时会在自身角度去思考, 误认为对方也熟知某些技巧, 其实不然.

上星期, 我在找 "奇迹 MU" 游戏中出宝石的声音文件, 想用这个作为铃声. 我找遍了整个网络, 人们都告诉我, 可以在游戏的安装文件夹内找到某某文件, 将这个文件转格式就可以用了. 我很纠结, 好像除此之外再没有可以得到这个文件的办法了, 但我又不愿意为了不到 1KB 的一个文件去安装 G 量级的软件. (最后, 我在某国外网站找到了这个文件.)

对工程师来说, 他们或许对这个并不熟悉, 如果你告诉他需要学很多与其核心工作不相关的东西, 他们同样会很纠结. 所以作为前端, 应该尽量将前台的处理进行封装. 可能我说得不是很明白, 下面用 Rating Stars 举例说明一下.

演示

这是演示页面, 可以看到效果其实是一样的, 却是两种不同的处理风格.

方法 1

HTML

<div class="rating">
	<span class="light"></span>
	<span></span>
	<span></span>
	<span></span>
	<span></span>
</div>
<div style="clear:both;"></div>
<div class="rating">
	<span class="light"></span>
	<span class="light"></span>
	<span></span>
	<span></span>
	<span></span>
</div>
<div style="clear:both;"></div>
<div class="rating">
	<span class="light"></span>
	<span class="light"></span>
	<span class="light"></span>
	<span></span>
	<span></span>
</div>
<div style="clear:both;"></div>
<div class="rating">
	<span class="light"></span>
	<span class="light"></span>
	<span class="light"></span>
	<span class="light"></span>
	<span></span>
</div>
<div style="clear:both;"></div>
<div class="rating">
	<span class="light"></span>
	<span class="light"></span>
	<span class="light"></span>
	<span class="light"></span>
	<span class="light"></span>
</div>
<div style="clear:both;"></div>

CSS

.rating{
	padding:10px 0 0 10px;
}
.rating span{
	background:url(star_off.gif) no-repeat;
	display:block;
	float:left;
	width:14px;
	height:13px;
	margin-right:2px;
}
.rating span.light{
	background-image:url(star_on.gif);
}

方法 2

HTML

<div class="rating-1">
	<span class="star-1"></span>
	<span class="star-2"></span>
	<span class="star-3"></span>
	<span class="star-4"></span>
	<span class="star-5"></span>
</div>
<div style="clear:both;"></div>
<div class="rating-2">
	<span class="star-1"></span>
	<span class="star-2"></span>
	<span class="star-3"></span>
	<span class="star-4"></span>
	<span class="star-5"></span>
</div>
<div style="clear:both;"></div>
<div class="rating-3">
	<span class="star-1"></span>
	<span class="star-2"></span>
	<span class="star-3"></span>
	<span class="star-4"></span>
	<span class="star-5"></span>
</div>
<div style="clear:both;"></div>
<div class="rating-4">
	<span class="star-1"></span>
	<span class="star-2"></span>
	<span class="star-3"></span>
	<span class="star-4"></span>
	<span class="star-5"></span>
</div>
<div style="clear:both;"></div>
<div class="rating-5">
	<span class="star-1"></span>
	<span class="star-2"></span>
	<span class="star-3"></span>
	<span class="star-4"></span>
	<span class="star-5"></span>
</div>
<div style="clear:both;"></div>

CSS

.rating-1,
.rating-2,
.rating-3,
.rating-4,
.rating-5{
	padding:10px 0 0 10px;
}
.rating-1 span,
.rating-2 span,
.rating-3 span,
.rating-4 span,
.rating-5 span{
	background:url(star_off.gif) no-repeat;
	display:block;
	float:left;
	width:14px;
	height:13px;
	margin-right:2px;
}
.rating-1 span.star-1,
.rating-2 span.star-1,
.rating-2 span.star-2,
.rating-3 span.star-1,
.rating-3 span.star-2,
.rating-3 span.star-3,
.rating-4 span.star-1,
.rating-4 span.star-2,
.rating-4 span.star-3,
.rating-4 span.star-4,
.rating-5 span.star-1,
.rating-5 span.star-2,
.rating-5 span.star-3,
.rating-5 span.star-4,
.rating-5 span.star-5{
	background-image:url(star_on.gif);
}

方法 1 是我以前的编写风格, 相对于方法 2 其优点是标签少, 代码量少, 但要依赖后台程序生成页面的时候处理更多逻辑. 但是方法 2 已经将所有结构化的内容封装在内层, 尽管代码比较繁琐, 但调用方法简单.

实例说明

方法 1 中显示 3 颗星的页面代码是

<div class="rating">
	<span class="light"></span>
	<span class="light"></span>
	<span class="light"></span>
	<span></span>
	<span></span>
</div>

方法 1 中显示 4 颗星的页面代码是

<div class="rating">
	<span class="light"></span>
	<span class="light"></span>
	<span class="light"></span>
	<span class="light"></span>
	<span></span>
</div>

方法 2 中显示 3 颗星的页面代码是

<div class="rating-3">
	<span class="star-1"></span>
	<span class="star-2"></span>
	<span class="star-3"></span>
	<span class="star-4"></span>
	<span class="star-5"></span>
</div>

方法 2 中显示 4 颗星的页面代码是

<div class="rating-4">
	<span class="star-1"></span>
	<span class="star-2"></span>
	<span class="star-3"></span>
	<span class="star-4"></span>
	<span class="star-5"></span>
</div>

对后台开发人员来说, 方法 1 需要做循环处理, 并清楚这段代码内部的显示效果 (有可能是比较复杂的内容); 但方法 2 只需修改外层的标识字段. 在本例中, 如果从数据中取出的评分是 {$count}, 那么只需在外层做点手脚, 写成: rating-{$count}. 方法 2 就是把表示相似的东西尽量做成结构相同的整体, 并通过外层的标识来控制内部的表示.

总结

这里不能简单断言哪种方法更好, 但是在大型项目的团队开发中, 交流成本往往是很高的, 当执行效率起不到关键作用时, 对协作有利的方法明显更有价值. 好的用户体验不仅是让你的客户开心, 还要令你的搭档快乐.

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: 话说前端 (1)

  1. http://0.gravatar.com/avatar/c55cd68c4d1e8ebd567953e28c602195?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    怎么你回复这里 GMAIL 的地址输不了的?

  2. http://0.gravatar.com/avatar/c55cd68c4d1e8ebd567953e28c602195?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    呵呵,模块化的CSS,讲的跟CSS森里里一篇文章http://www.cssforest.org/blog/index.php?id=146 道理是一样的

  3. http://1.gravatar.com/avatar/58be12971823af5c6520597bd6d3a552?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    感觉做前台的至少懂一门后台语言是必须的,做后台也可以适当了解下前端~~
    这样协作起来比较方便~~

  4. http://1.gravatar.com/avatar/38fb899ccb151e5313adbc14ed35d842?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    觉得很深奥,估计自己还没到这个层次吧.

  5. http://0.gravatar.com/avatar/af726891b29f5f6a3aedd81d136d5417?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    额~~~完全看不懂~~ :???:

  6. http://0.gravatar.com/avatar/67e0f0e48258ee87d76aed4a84e33197?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    看了前辈的文章,收获颇丰...关于其中的星级评价实例,在下觉得也许有更加节约代码量,而且也将代码封装的方法,以下是我的实例演示网址。
    http://www.bingo929.com/mytest/star-test/star_test.html

    封装原理和前辈的实例2类似,后台仅需修改class中的number即可,8过我没有再嵌套任何代码,而是使用CSS Sprites技术完成不同星级的显示,在不提高流浪的同时减少了图片的http请求次数。没有使用空标签,而是在标签内使用文字来让搜索引擎和屏幕阅读器了解标签内容...CSS被禁用也能让用户了解自己等级...

    如有疏忽之处还请各位指正...

  7. http://0.gravatar.com/avatar/4012a2d0c4a0e6cd32cf4f8b8c72fdcd?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    深有体会,团队的沟通就是站在对方的角度做自己的事情

  8. http://1.gravatar.com/avatar/94edba5ccaf4f54d0891cf3a7b1e1280?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这些细节确实应该注意~

  9. http://0.gravatar.com/avatar/cab963ed5a8f34ea97a0769184715808?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @mg12
    没啥,那天以为你上了GFW光荣榜,结果只是疑似病例 :grin:

  10. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Calcifer
    什么光荣榜?

    @mars
    是啊, 经验得慢慢积累.

  11. http://0.gravatar.com/avatar/c5358cbd114bff6a794c2454038e74ef?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    以前觉得方法一简洁方便,没考虑都居然还有这些问题没考虑到

  12. http://1.gravatar.com/avatar/7821ab1bfda6eaa639a9eb7ea05cac25?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    好文章,慢慢琢磨

  13. http://0.gravatar.com/avatar/cab963ed5a8f34ea97a0769184715808?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    Oh,我一回来你就上光荣榜了

  14. http://1.gravatar.com/avatar/fa7f6e086d0164f7a5c41a79df6bd3ee?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    来这里就是学习来了
    ;-)

  15. http://1.gravatar.com/avatar/177500713458dc0f070fbf65bdc4b42a?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    确实思路不一样,其实还是第一种比较好吧。

  16. http://0.gravatar.com/avatar/81d49c68f3288b8e5f62ca32310283a7?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    虽然对这个一窍不通,但是你的贡献精神值得钦佩,赞一个,~\(≧▽≦)/~

  17. http://1.gravatar.com/avatar/365cff6a854db037729c4cafebe11645?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    雷锋啊,把简单带给别人,把麻烦留给自己……
    不过,如果把调用方法说清楚的话,给方法1写程序也并不麻烦呀,而方法1还有方法2难以比拟的灵活性
    不过,这只是个例子,实践遇到的情况可能比这个复杂的多,那时就要好好权衡了

  18. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @bolo
    如果 CSS 可以带逻辑处理, 那该多好呢.

    @JAY
    其实 1 0 1 0 1 这样的效果也可以简单做好, 怕就怕内部结构右边, 比如本来 5 星的, 但后来要做成 10 星的.

    @evlos
    确实如此, 人件是软件开发中最难管理的.

  19. http://1.gravatar.com/avatar/1cfd6b67e61a959b431aa1bc3e4f6736?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    说得很对啊,所谓的最佳方案永远都只是相对的。

  20. http://0.gravatar.com/avatar/6ae83ef4bfaa6f98356a5187b6f171f6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    好东西。。。收藏了 呵呵

  21. http://0.gravatar.com/avatar/e549b2b110cf887f11f21cfb41d5de09?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    对于评级插件的总结的确不错

  22. http://0.gravatar.com/avatar/28d10aaed83b0ef981dd2fbdee2e68ec?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    嘎嘎 写得灰常清楚 ~
    我要把"好的用户体验不仅是让你的客户开心, 还要令你的搭档快乐."加到我的关于页面收藏 ~
    http://www.evlos.org/about/
    O(∩_∩)O哈哈~

  23. http://0.gravatar.com/avatar/c1834913e0459af48c2bcb63a641b223?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    最后一句话真是点睛之笔~读了这篇文章,得到了一些收获

  24. http://1.gravatar.com/avatar/10e5731d1a8aed7f69f55e9f6dbc92d7?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    嗯嗯,大约简单来说,方法一注重更细小单位的复用,也提供更多的组合方式,适用于需求还在验证的情况。

    比如要做成“1 0 1 0 1”的效果方法2估计是很难办到的(当然前提是你是希望这样诡异的使用)。

    方法二则适用于需求已经确定的情况,简单的来说类似于HardCode。提供的扩展和灵活性很小,但是使用方便效率高。

    如果是在试验探索阶段,方法一会优于方法二。但如果是在开发生成阶段的话,方法二也是一种不错的优化的处理方式。

  25. http://0.gravatar.com/avatar/2a9c4f525050372a6fe0b10ce4fe8957?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    方法二在后台处理起来更加简单,但CSS比较烦

  26. http://0.gravatar.com/avatar/490cf262668eebb0f0f1a50d9d48d702?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @chisdy
    哈~

    @齐林
    在这个例子中, 我把庞大的游戏程序比作一种自己具备, 而可能其他人需要耗费一定时间才能掌握的技能; 而出宝石的声音文件却是一个唾手可得, 易于传递的小应用. 如果为了小小一个声音文件, 花费很多时间去下载和安装游戏, 那是相当的脑残.

    @QiQiBoY
    这个可能我没说明白, 所以我又加了一段. 实例说明, 你可以看一下.

  27. http://1.gravatar.com/avatar/b473c1fcea946fc810bb2d93084c67cd?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    做得不错!学习中!

  28. http://0.gravatar.com/avatar/cf2a51d1073cf5a78821a947b9b2ed0e?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个想法很有创意啊

  29. http://1.gravatar.com/avatar/d4efbdaa43e9202a96df023ae758a9bf?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    Good,但是这两种貌似都是浏览器客户端在处理的吧

  30. http://1.gravatar.com/avatar/9015f3770c11541a4636daf1ed2b48ed?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    理念学习了
    代码在学习中,感觉都是给某些元素加上一些CSS类么...看来我对前端的理解太不足了

  31. http://0.gravatar.com/avatar/c3038985d14574a70af9aa76594eafcf?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    没有绝对的事物.

  32. http://1.gravatar.com/avatar/3fb2a66e82fc52526ca963d5046a097e?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    在阿里巴巴这样的公司,效率才是第一位啊!如果我找MU的叮宝石的声音肯定会按照你同事教的方法,因为我电脑就装着MU和转换软件!哈哈

  33. http://1.gravatar.com/avatar/71981550e606563e4f569c420b2276cf?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    “好的用户体验不仅是让你的客户开心, 还要令你的搭档快乐.” 这话说得真好。

  34. http://1.gravatar.com/avatar/fcaaac8897c004ad5876f751a83bc2f3?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不错~~ 学习了~~~

  35. http://1.gravatar.com/avatar/bb05acb5b9b70b8886b356d190d3bb4a?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    学习一下:)

  36. http://0.gravatar.com/avatar/8f2e713e8af78b41918e0fc3f0e13eb2?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    学习啦,呵呵,非常棒。