偶然之间发现鲜果网(http://www.xianguo.com), 第一眼就被其首页上的图片新闻幻灯效果所深深吸引。于是决定偷师学艺,截取下来为我所用。
第一步,查看网页源文件,取我所需
用IE进入到鲜果网后,直接右键查看源文件,将其整个拷贝出来慢慢研究。
打开源文件后,看到其内容很清爽,看上去感觉代码很规范,于是想到了去W3C(http://jigsaw.w3.org/css-validator/)验证一下,得到的结果是CSS版本2.1,经过校验后,还是不完全规范。但对于我们学习来说,应该够用了。
通过本人对HTML的了解,先从HEAD区研究起,也就是下面这部分的内容
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>鲜果热点 让阅读流行起来</title> <meta name="keywords" content="RSS RSS阅读器 Feed 阅读器 在线阅读器 博客订阅 Blog 鲜果"/> <meta name="description" content="鲜果 中国领先的RSS阅读分享平台,RSS阅读器"/> <link rel="alternate" type="application/rss+xml" href="http://feed.feedsky.com/xianguoblog" title="鲜果日志" /> <link rel="shortcut icon" type="image/x-icon" href="/static/favicon.ico" /> <link rel="stylesheet" type="text/css" href="http://xgres.com/sns-static/v2/css/common.css?v=36" /> <link rel="stylesheet" type="text/css" href="http://xgres.com/sns-static/v2/css/classic.css?v=52"/> <link rel="stylesheet" type="text/css" href="http://xgres.com/sns-static/v2/css/hot.css?v=26" /> <script type="text/javascript" src="js/jquery-1.6.4.min.js"></script> </head>
首先,这三个CSS是必须的,HEAD区结尾部分的JS代码应该也是必须的,都需要下载下来。
再来研究BODY区的内容。因为本人只需要图片新闻的幻灯效果那部分,所以要去掉其他暂时不需要的内容,需要慢慢剥离。使用EDITPLUS来对BODY区的内容进行分析,29行~67行定义的Header区不是我们需要的。68行开始的那段脚本是搜索框所需要的,这里也不需要。
接下来这段CSS代码是需要的,是用于显示页面背景图的。同时,需要从其网站上下载FOCUS.PNG这张图。
<style type="text/css"> #main{ background:#fff url(/static/v2/images/focus.png) repeat-x scroll 0 -360px; } </style>
再往下来看,这就是我们所需要的图片新闻幻灯效果区的内容了,通过EDITPLUS打开后,是149行~370行中的内容,也就是下面这部分内容。(由于内容较多,只截取了其中两段图片新闻,并加以注释以便分析其结构)
<div id="cycle-slide-wrap"> <div id="cycle-slide-wrapper"> <div id="cycle-slide"> <div id="cycle-slide-show"> <!-- 单个新闻起始处 --> <div class="cycle-item-wrap"> <!-- 新闻图片区 --> <div class="cycle-thumb"><a target="_blank" href="http://item.feedsky.com/~feedsky/dongxinet/~8172838/586585094/6276617/1/item.html"><img src="http://xgres.com/xianguo_com/topitem/82/p_1323832382.jpg" /></a></div> <!-- 结束新闻图片区 --> <div class="cycle-item"> <div class="item"> <div class="with_round_rect"> <!-- 新闻标题区 --> <div class="item_title"> <h4><a target="_blank" href="http://item.feedsky.com/~feedsky/dongxinet/~8172838/586585094/6276617/1/item.html" style="font-size:16px;" title="【纽约时报】北京人,你现在看到烟雾了吗?">【纽约时报】北京人,你现在看到烟雾了吗?</a></h4> </div> <!-- 结束新闻标题区 --> <!-- 新闻摘要区 --> <div class="summary"> <a href="/1078667" class="item-feed" title="东西网" target="_blank">东西网</a> 这个星期,在北京我的房东给我打电话说:北京由于大雾高速关闭,飞机延误。他还说:污染太严重了,别打开窗户,也不要做户外活动。一个月前,我把一个洗衣机大小的空气净化机推进我的客厅时,这个房东还很疑惑的看着我。因为像我这种2000美元一台的空气净化机,在中国人的家中并不是很常见。这几个星期的严重污染使北京的两类人携起手来:住在北京的外国人和坚忍的当地人。我在我的小区也碰到过这样一些中国人。 <a style="color:#c0c0c0;" target="_blank" href="http://item.feedsky.com/~feedsky/dongxinet/~8172838/586585094/6276617/1/item.html">查看原文»</a> <span class="item-time">今天11:13</span> </div> <!-- 结束新闻摘要区 --> <div class="item-operation clearfix"> <a class="icon-add" href="/doing/1go5B#formComment">评论</a> </div> </div> </div> </div> <div class="c"></div> </div> <!-- 单个新闻结束处 --> <div class="cycle-item-wrap"> <div class="cycle-thumb"><a target="_blank" href="http://go.rss.sina.com.cn/redirect.php?url=http://blog.sina.com.cn/s/blog_5054769e0102dvwc.html"><img src="http://xgres.com/xianguo_com/topitem/94/p_1323832294.jpg" /></a></div> <div class="cycle-item"> <div class="item"> <div class="with_round_rect"> <div class="item_title"> <h4><a target="_blank" href="http://go.rss.sina.com.cn/redirect.php?url=http://blog.sina.com.cn/s/blog_5054769e0102dvwc.html" style="font-size:16px;" title="马未都:上海最具人气的老里弄">马未都:上海最具人气的老里弄</a></h4> </div> <div class="summary"> <a href="/1112418" class="item-feed" title="新浪文化博客" target="_blank">新浪文化博客</a> 先只知道时髦的新天地,谁知几年下来,时代在前进,如今时髦的是田子坊了。此地不分老幼中外都爱闲逛,游人如织。田子坊说起来是上海最典型老里弄,还是那种很拥挤里弄,没有一处阔气的地方。与早些年开发的新天地比较起来,一个村姑,一个大家闺秀。用上海话说,不好比的。但就是这个谁也瞧不上的村姑,今天成了上海最具人气的景观,用“摩肩接踵”形容一点儿不过分。朋友和我说这个业态是自然形成的,没有规划和 <a style="color:#c0c0c0;" target="_blank" href="http://go.rss.sina.com.cn/redirect.php?url=http://blog.sina.com.cn/s/blog_5054769e0102dvwc.html">查看原文»</a> <span class="item-time">今天11:11</span> </div> <div class="item-operation clearfix"> <a class="icon-add" href="/doing/1glDv#formComment">评论</a> </div> </div> </div> </div> <div class="c"></div> </div> </div> <div id="cycle-slide-prev"> <div class="cycle-sthumb"></div> <div class="cycle-shadow"></div> <a href="javascript:void(0);"><</a> </div> <div id="cycle-slide-next"> <div class="cycle-sthumb"></div> <div class="cycle-shadow"></div> <a href="javascript:void(0);">></a> </div> <div id="cycle-slide-pager"></div> </div> </div> </div>
做到这一步,新闻幻灯效果区的内容应该已经是完全搞定了。但如果你将上述内容复制到新建的HTML文件中,并不能看到动态效果。其原因在于在BODY区的最后,有两段JS脚本,这个才是动态效果的关键所在。其代码如下:
<script type="text/javascript" src="js/sns-xianguo-release_sns_2011-12-09-16-52-04.js"></script>
<script type="text/javascript"> (function($){ $('#goTopButton').click(function(event){ $('html, body').animate({scrollTop:0}, 300); }); $(window).scroll(function(event){ if($(this).scrollTop() > 0){ if($.browser.ie6){ $('#goTopButton').css('top', $(this).scrollTop() + $(this).height() - 170); } if($('#goTopButton').css('display') == 'none'){ $('#goTopButton').fadeIn(); } }else{ $('#goTopButton').fadeOut(); } //顶部消息框位置 var dis = 10 - $(this).scrollTop(); if( 0<dis && dis<=10 ){ $("#header-noti").css("top",dis+"px"); }else{ $("#header-noti").css("top","0"); } }); })(jQuery); </script> <script type="text/javascript"> (function($){ $doings.init({ nowShowDoingBox:false, defaultValue:'记录瞬间 分享精彩 ...', currentPage:'0', startDoingsId:'', needLogin:true }); })(jQuery); function cycleScroll(currSlideElement, nextSlideElement, options, forwardFlag){ var total = options.slideCount; var currIndex = options.currSlide; var prevIndex = currIndex - 1; var nextIndex = currIndex + 1; if (prevIndex < 0) { prevIndex = total - 1; } if (nextIndex >= total) { nextIndex = 0; } var prevImg = $('#cycle-slide-show .cycle-item-wrap').eq(prevIndex).find('.cycle-thumb img').attr('src'); var nextImg = $('#cycle-slide-show .cycle-item-wrap').eq(nextIndex).find('.cycle-thumb img').attr('src'); $('#cycle-slide-prev .cycle-sthumb').html('<img src="' + prevImg + '" \/>'); $('#cycle-slide-prev .cycle-sthumb img').reflect({ height: 30, opacity: 0.5 }); $('#cycle-slide-next .cycle-sthumb').html('<img src="' + nextImg + '" \/>'); $('#cycle-slide-next .cycle-sthumb img').reflect({ height: 30, opacity: 0.5 }); } (function($){ var idsList = [], descMap = {}, loadDescQueue = [], loading = false, maxWidth = 588; var $hotDoings = window.$hotDoings = { init:function(){ $('#timeline .entry').each(function(){ var doingsId = this.getAttribute('doingsId'); var elem = $(this); var registed = elem.data('registed'); if (registed) { return; } elem.data('registed', true); idsList.push(doingsId); itemClick(elem.find('.text-title-wrap'), elem.find('.entry_content'), doingsId); }); } }; function itemClick(elem, elem2, doingsId){ var desc = $('#doings-desc-' + doingsId), summary = $('#doings-summary-' + doingsId), item = $('#doings-' + doingsId); var oriBgcolor = elem.css('background-color'); elem.mouseover(function(){ this.style.backgroundColor = '#EEF6FF'; }).mouseout(function(){ this.style.backgroundColor = oriBgcolor; }).click(function(event){ if (event.target.tagName.toLowerCase() == 'a') { event.stopPropagation(); return; } if (desc.css('display') == 'none') { //展开全文 if (desc.html() == '') { loadItemDesc(doingsId, function(content){ desc.html(content).find('img').load(resizeImage); summary.hide(); desc.show(); }); } else { summary.hide(); desc.show(); } } else { //合上全文 summary.show(); desc.hide(); var top = item.offset().top; if (top < $(document).scrollTop()) { $(document).scrollTop(top); } } }); elem2.dblclick(function(event){ if (desc.css('display') == 'none') { //展开全文 if (desc.html() == '') { loadItemDesc(doingsId, function(content){ desc.html(content).find('img').load(resizeImage); summary.hide(); desc.show(); }); } else { summary.hide(); desc.show(); } } else { //合上全文 summary.show(); desc.hide(); var top = item.offset().top; if (top < $(document).scrollTop()) { $(document).scrollTop(top); } } }); } function loadItemDesc(doingsId, callback){ if (loading) { if ($.inArray(doingsId, loadDescQueue) == -1) { loadDescQueue.push(doingsId); } return; } if (!(doingsId in descMap)) { loading = true; var loadIds = [], maxNum = 5; var pos = $.inArray(doingsId, idsList); if (pos == -1) { loading = false; return; } var begin = (parseInt(pos / maxNum)) * maxNum; var end = Math.min(begin + maxNum, idsList.length); for (var i = begin; i < end; i++) { loadIds.push(idsList[i]); } if (loadIds.length > 0) { $.ajax({ dataType:'json', type:'post', url:'/hot/ajax', data:{ type:'loadDesc', doingsIds:loadIds.join(',') }, success:function(data){ if(data.c == 0){ $dialog.hint(data.e); return false; } data = data.d; descMap[doingsId] = true; callback(data[doingsId]); delete data[doingsId]; $.each(data, function(key, value){ descMap[key] = value; }); $.each(loadDescQueue, function(i, s){ loadItemDesc(s); }); loading = false; } }); } else { loading = false; } } else { callback(descMap[doingsId]); descMap[doingsId] = true; } } function resizeImage(){ if (this.width > maxWidth) { var _w = this.width; var _h = parseInt(this.height * maxWidth / _w); this.width = maxWidth; this.height = _h; } } })(jQuery); $(document).ready(function($){ $('#cycle-slide-show').cycle({ fx: 'scrollHorz', prev: '#cycle-slide-prev', next: '#cycle-slide-next', timeout: 20000, pager: '#cycle-slide-pager', activePagerClass: 'current', before: cycleScroll, after: cycleScroll }); if (!$.browser.msie) { $('#cycle-slide-prev a,#cycle-slide-next a').mouseover(function(){ $(this).animate({ 'opacity': 0 }); }).mouseout(function(){ $(this).animate({ 'opacity': 1 }); }); } if (screen.width < 1200) { $('#cycle-slide-prev').hide(); $('#cycle-slide-next').hide(); } }); var tagId = '0'; var totalPage = parseInt('2103'); var currPage = 0; var nextPage = 1; var maxAutoload = 2; function _loadMoreItems(times, isScroll){ isScroll = isScroll || 1; if (currPage == nextPage) { return false; } if (nextPage >= totalPage) { return false; } if (isScroll == 1 && currPage >= maxAutoload) { return false; } currPage = nextPage; $('#more-items-loading').show(); $('#more-items-button').hide(); $.ajax({ dataType: 'json', url: "/hot/ajax", data: { type: 'loadMore', tagId: tagId, pi: nextPage }, success: function(data){ if(data.c == 0){ $dialog.hint(data.e); return false; } $('#timeline').append(data.d.html); nextPage += 1; $('#more-items-loading').hide(); if (currPage >= maxAutoload) { $('#more-items-button').css('display', 'block'); } $hotDoings.init(); } }); } (function($){ $hotDoings.init(); $('#more-items-button').click(function(e){ _loadMoreItems(0, 2); }); $(document).endlessScroll({ bottomPixels: 100, callback: _loadMoreItems }); })(jQuery); </script> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-9142976-6']); _gaq.push(['_setDomainName', '.xianguo.com']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script>
其中第一段链接的JS代码用于显示图片新闻,第二段内嵌的JS代码用于显示动态效果。至此,你就能够得到一个完整的图片新闻幻灯效果了。
第二步,分析展示区内容,做自己想做的
通过上述代码可知,图片新闻展示区在CSS中定义为cycle-slide-wrap区域
(未完,待续。。。)