javascript图片轮换2
图片轮换是一种相当复杂的技术,早些年基本用flash实现。这里有一个链接,教大家如何用flash实现它的。之所以用flash,是因为flash是基于帧的,这与图片轮换的原理相当接近。为了模拟帧的效果,我们要用到overflow把多余的部分遮罩掉,也就是flash中常说的遮罩层。在Flash中,连时间轴都是可视的,而我们则全凭想象力与数学来计算现在是到了哪一张图。加之,flash有Robert Penner大神的缓动公式,那实在太耀眼,直到script.aculo.us类库搞出自己的缓动公式,才扭转局面。
我们来看一看图片轮换的结构层。它应该包含框体,图片展示区,图片滑动层与分页栏。原谅我制造这么多词汇,因为没有个名词讲解就难以为继了,前人也没有做这样的总结,个个都不愿意分享一下。框体就是一个div元素,作用有两个:提供相册的边框与作为分页栏的包含块。如果不清楚什么叫包含块(containing block)的话,自己查阅CSS权威指南吧。接着下来图片展示区与图片滑动层,也就是我实现新式无缝滚动的那一种结构,一个很干净的无序列表,所有难点都转移到设置它的CSS上。至于图片展示区就是ul元素,大小为一张图片的大小;图片滑动层就是那个li元素,也只有一个li元素而已,利用CSS强制把它里面的图片不换行向左浮动,并设置li元素一个很大很大的宽度,好让它一行容纳所有图片。分页栏就是一个包含许多链接的span元素,和普通的水平菜单差不多,只不过要用绝对定位它安置到框体的右下角。
< div id="album"> < ul > < li > < a href="http://www.cnblogs.com/rubylouvre" id="index1"> < img alt="月光下的花瓣" src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s001.jpg" /> </ a > < a href="http://www.cnblogs.com/rubylouvre" id="index2"> < img alt="清澈的湖水" src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s002.jpg" /> </ a > < a href="http://www.cnblogs.com/rubylouvre" id="index3"> < img alt="荒漠上的植物" src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s003.jpg" /> </ a > < a href="http://www.cnblogs.com/rubylouvre" id="index4"> < img alt="末日霓虹" src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s004.jpg" /> </ a > < a href="http://www.cnblogs.com/rubylouvre" id="index5"> < img alt="绿·生意" src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s005.jpg" /> </ a > < a href="http://www.cnblogs.com/rubylouvre" id="index6"> < img alt="又是收获的季节" src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_s006.jpg" /> </ a > </ li > </ ul > < span > < a href="#index1">1</ a > < a href="#index2">2</ a > < a href="#index3">3</ a > < a href="#index4">4</ a > < a href="#index5">5</ a > < a href="#index6">6</ a > </ span > </ div > |
#album { position : relative ; /*为分页栏准备的*/ width : 400px ; /*必须设置,为分页栏准备*/ height : 300px ; /*必须设置,为分页栏准备*/ border : 10px solid #8080C0 ; } #album ul ,#album li { /*消除默认样式*/ padding : 0 ; margin : 0 ; list-style : none ; } #album ul{ position : relative ; /*为图片滑动区*/ height : 300px ; /*必须设置,用于隐藏图片滑动区多余的部分*/ width : 400px ; /*必须设置,用于隐藏图片滑动区多余的部分*/ overflow : hidden ; background : transparent url (http://images.cnblogs.com/cnblogs_com/rubylouvre/ 199042 /o_s 001 .jpg) no-repeat 0 0 ; } #album li { /*图片滑动区*/ position : absolute ; width : 1000% ; /*让里面的所有图片并列显示*/ } #album a { float : left ; } #album img { display : block ; border : 0 ; } #album span { /*分页栏*/ position : absolute ; right : 0 ; bottom : 10px ; } #album span a{ display : block ; /*让其拥有盒子模型*/ margin-right : 10px ; /*错开格子*/ width : 15px ; /*呈正方形*/ height : 15px ; line-height : 15px ; text-align : center ; /*居中显示*/ text-decoration : none ; /*消除下划线*/ color : #808080 ; background : transparent url (http://images.cnblogs.com/cnblogs_com/rubylouvre/ 199042 /o_button.gif) no-repeat -15px 0 ; } #album span a:hover ,#album span a.hover{ color : #F8F8F8 ; background-position : 0 0 ; } |
这个和我以前的系列一样,不用JS也可以点击实现切换。不过以前是用锚点来改变scrollTop的值,现在是改变scrollLeft的值。
如果不使用缓动效果,很简单。
var Rotate = function (id){ try {document.execCommand( "BackgroundImageCache" , false , true );} catch (e){}; var container = document.getElementById(id), slide = container.getElementsByTagName( "li" )[0]; slide.innerHTML += slide.innerHTML; var item = slide.getElementsByTagName( "a" ), critical = item[item.length/2].offsetLeft, //临界值 distance = critical/(item.length/2), delta = - distance; ( function (){ //实现自动轮换图片 setTimeout( function (){ delta = delta - distance; if (delta < -critical){ delta = - distance; } slide.style.left = delta + "px" ; //★★★★★★★★ setTimeout(arguments.callee,1500) },1500) })() } |
要使用缓动,就要动用我的缓动公式与transition函数,在星号的位置中调用。
我们也可以像第一部分那样加入一个信息栏,这样程序就拥有三个定时器了,看起来让人有点头晕,现实中不提倡这样做,这里只是试范一下如何使用transition的回调函数罢了。
//动态生成li元素并把它插入到DOM树中。 var tip = document.createElement( "li" ); //信息栏 tip.style.cssText = "position:absolute;bottom:0;width:400px;height:40px;line-height:40px;text-indent:2em;" ; slide.parentNode.appendChild(tip); if (!+ "\v1" ){ tip.style.cssText += "color:#369;background:#fff;filter:alpha(opacity=50)" ; } else { tip.style.cssText += "color:#fff;background: rgba(164, 173, 183, .65);" ; } |
最后为信息栏上的按钮绑定点击事件就行了。
有的人很懒,不喜欢点击,想在按钮上一掠而过也能看到效果。这简单,我们把绑定函数独立出来,分别绑定到onclick事件与onmouseover事件上就行了。现在我们换一个缓动公式,反正这东西多着呢。比如这个pulse,像蛇信子一样来回多次振动(默认5次,有第二个参数可以自己调,我调到10次),非常有意思。你们可以试试一下子掠过所有按钮,效果是何等的炫目!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义