- JavaScript实战-JavaScript、jQuery、HTML5、Node.js实例大全(第2版)
- 张泽娜
- 1232字
- 2025-02-24 19:10:52
3.2 照片加载与定位
根据功能设计,可以先写好HTML结构基础,再配合CSS做出大致效果,最后用JavaScript加上各种动作。首先请看HTML代码结构。
3.2.1 HTML代码
将CSS代码保存到eg3.css文件中,JavaScript代码保存到eg3.js文件中,这样让HTML代码更加干净,详见【范例3-1】。
【范例3-1 照片展示的HTML代码】
1. <! DOCTYPE html> 2. <html> 3. <head> 4. <title>照片展示</title> 5. <link rel="stylesheet" href="eg3.css" type="text/css" /> 6. </head> 7. <body> 8. <div id="bigPhoto"><img id="bigPhotoSrc" src="photo01.jpg" width="620" height="450" border="0" alt=""></div> 9. <div id="smallPhotos"> 10. <span id="prve"></span> 11. <ul id="smallPhotosList"> 12. </ul> 13. <span id="next"></span> 14. </div> 15. <script src="eg3.js"></script> 16. </body> 17. </html>
比前面章节的范例看上去更加简洁了吧?重构的目的在于得到这样的效果,这可以说是开发人员的用户体验。
3.2.2 CSS代码
直接预览【范例3-1】肯定是乱七八糟的,在eg3.css中写好布局和定位的代码之后效果就大不一样了,如图3-2所示,CSS代码见【范例3-2】。
【范例3-2 照片展示的CSS代码】
1. ul, li{ 2. list-style: none; 3. } #smallPhotos{width:620px; margin: 10px 0; } 5. #smallPhotosList{margin: 0 auto; width:580px; float:left; padding: 0; } 6. #smallPhotosList li{ 7. float:left; /*左浮动*/ 8. margin-left: 10px; /*左外边距10 像素*/ 9. _margin-left:8px; /*这是专门针对IE6 间隙太大而设置的*/ 10. } 11. #smallPhotosList img{ 12. border:2px solid #000; 13. cursor:pointer; /*鼠标样式*/ 14. } 15. #prve{ 16. background: url(icon_prve.jpg); 17. height: 40px; 18. width:20px; 19. display: inline-block; /*让span 标签变成块级元素*/ 20. float: left; 21. cursor:pointer; 22. } 23. #next{ 24. background: url(icon_next.jpg); 25. height:40px; 26. width:20px; 27. display: inline-block; 28. float: right; 29. cursor:pointer; 30. }
这些CSS再加上后面【范例3-3】的JavaScript代码,效果就大不一样了,请看图3-2加载CSS代码的前后对比。

图3-2 加载CSS代码前后
针对不同的浏览器写不同的CSS code的过程,就叫CSS hack。CSS hack的存在是因为不同的浏览器(比如IE 6、IE 7等)对CSS的解析认识不一样,会导致页面效果不同,得不到我们所需要的页面效果。这时候需要针对不同的浏览器去写不同的CSS code,让它能够同时兼容不同的浏览器。
CSS hack大致有3种表现形式,CSS类内部hack、选择器hack以及HTML头部引用(if IE)hack, CSS hack主要针对IE浏览器,有一个比较全的CSS hack表,如图3-3所示。

图3-3 比较全的CSS Hack表
图3-3是早期的hack大全,而现在很多标准浏览器(如Firefox、Chrome等)都更新很快,有些hack已经无效。在中国,各版本IE还有大量存留,下面是一些IE 6~IE 9常用CSS hack:
<style> div{ display:none; margin:10px; } /*隐藏div 通过不同的hack 将其显示*/ .IE{display:block\9; } /*IE6 IE7 IE8 IE9 IE10 识别*/ .IE6{_display:block; } /*IE6 识别*/ .IE6{-color:blue; } /*IE6 识别*/ .IE7{*display:block; } /*IE6 IE7 识别*/ .IE7{+color:blue; } /*IE6 IE7 识别*/ .IE7{#color:red; } /*IE6 IE7 识别*/ .IE8910{display:block\0; } /*IE8910 识别*/ :root .IE910{display:block\9; } /*IE9 IE10 识别*/ .other{[display:block; display:block; ]} /*safari Chrome 等识别*/ </style> <div class="IE">所有IE 识别</div> <div class="IE8910">IE8910 识别</div> <div class="IE910">IE910 识别</div> <div class="IE6">IE6 识别</div> <div class="IE7">IE7 识别</div> <div class="IE8">IE8 识别</div> <div class="other">标准浏览器识别</div>
3.2.3 JavaScript代码
随着JavaScript代码越来越长,用EditPlus工具就有些不顺手了,于是笔者改用Sublime Text 3。图3-4就是使用Sublime Text 3声明eg对象及第2章里用过的eg.$、eg.getElementsByClassName和eg.addListener三个公共方法的代码。

图3-4 用Sublime Text 3编写JavaScript代码
只要是写过对象、属性、方法,在Subilime Text 3里都会有自动完成功能,用起来很方便,除此之外,要定义一些相片数据和默认显示的照片,如【范例3-3】所示。
【范例3-3 照片展示的JavaScript代码】
1. //定义数据 2. eg.data = [ 3. ["photo01.jpg", "thumb01.jpg"] 4. , ["photo02.jpg", "thumb02.jpg"] 5. , ["photo03.jpg", "thumb03.jpg"] 6. , ["photo04.jpg", "thumb04.jpg"] 7. , ["photo05.jpg", "thumb05.jpg"] 8. , ["photo06.jpg", "thumb06.jpg"] 9. , ["photo07.jpg", "thumb07.jpg"] 10. , ["photo01.jpg", "thumb01.jpg"] 11. , ["photo02.jpg", "thumb02.jpg"] 12. , ["photo03.jpg", "thumb03.jpg"] 13. , ["photo04.jpg", "thumb04.jpg"] 14. , ["photo05.jpg", "thumb05.jpg"] 15. , ["photo06.jpg", "thumb06.jpg"] 16. , ["photo07.jpg", "thumb07.jpg"] 17. ]; 18. eg.showNumber = 0; //默认显示 19. eg.groupNumber = 1; //当前显示的组 20. eg.groupSize = 6; //每组的数量 21. eg.showThumb = function(group){ 22. var ul = eg.$("smallPhotosList"); 23. ul.innerHTML = ''; //每次显示时要清空旧的内容 24. var start = (group-1)*eg.groupSize; //计算需要的data数据的开始位置 25. var end = group*eg.groupSize //计算需要的data数据的结束位置 26. for(var i=start; (i<end&&i<eg.data.length); i++){ //循环数据,并根据数据生成HTML 后插入小图列表里 27. var li = document.createElement("li"); 28. li.innerHTML = '<img src="'+eg.data[i][1]+'" id="thumb'+ i+'"width="80" height="40"/>'; 29. ul.appendChild(li); //追加元素 30. } 31. }; 32. eg.init = function(){ 33. eg.showThumb(1); //初始化要显示的 34. }; 35. eg.init();
通过eg.init()的调用,首先初始化出第一组照片,并能够让鼠标单击小图而显示大图。eg.showThumb主要的功能就是生成指定某一组的几幅照片。