不久前,我做了一个关于 特色内容滑块 的教程。 它很不错,但在自定义可能性方面有点有限。 最常要求的功能是添加/删除“面板”和一个停止/启动按钮。
我很高兴地说,我能够在这个新的滑块中进行一些调整。 它不是插件,所以它不像可能的那样容易,但它容易得多。 文末有一个用于自定义的部分。 滑块确实带有停止/启动按钮,并且动画比简单地向左滑动走得更远。

HTML 标记
标记非常轻巧。 只是一个包装,它包含该区域并隐藏溢出,然后是它内部的“移动器”进行滑动,然后是内部的幻灯片。
请注意,没有用于停止按钮的标记。 因为它不属于标记,因为没有 JavaScript 它将毫无用处。 我们将通过 JavaScript 应用它。 还要注意,第一个幻灯片有一个唯一的 ID。 我们将把它用作我们的“测试幻灯片”,以便使用 JavaScript 收集宽度信息。
<div id="slider">
<div id="mover">
<div id="slide-1" class="slide">
<h1>Garden Rack</h1>
<p>Donec gravida posuere arcu. Nulla facilisi. Phasellus imperdiet. Vestibulum at metus. Integer euismod. Nullam placerat rhoncus sapien. Ut euismod. Praesent libero. Morbi pellentesque libero sit amet ante. Maecenas tellus.</p>
<a href="#"><img src="images/slide-1-image.png" alt="learn more" /></a>
</div>
... additional slides follow format of this one, except no need for ID ...
</div>
</div>
CSS
#slider { background: white url(../images/slider-bg.jpg); height: 227px; overflow: hidden;
position: relative; margin: 50px 0; }
#mover { width: 2880px; position: relative; }
.slide { padding: 40px 30px; width: 900px; float: left; position: relative; }
.slide h1 { font-family: Helvetica, Sans-Serif; font-size: 30px; letter-spacing: -1px;
color: #ac0000; }
.slide p { color: #999; font-size: 12px; line-height: 22px; width: 300px; }
.slide img { position: absolute; top: 20px; left: 400px; }
#slider-stopper { position: absolute; top: 1px; right: 20px; background: #ac0000; color: white;
padding: 3px 8px; font-size: 10px; text-transform: uppercase; z-index: 1000; }
这里没什么好说的,大部分只是演示选择。 在功能上,#mover 上的相对定位很重要,对于滑动效果是必要的。 img 元素上的绝对定位也是如此。 当此 CSS 生效但 JavaScript 关闭时,滑块将显示第一个幻灯片,仅此而已(如果你问我,这是理想的)。
jQuery JavaScript
我们在这里做的 90% 是针对 jQuery 的。 使事情变得容易得多。 我们需要确保在我们的其余脚本之前加载该库。
<script type="text/javascript" src="js/jquery-1.2.6.pack.js"></script>
<script type="text/javascript" src="js/startstop-slider.js"></script>
在我们 的 startstop-slider.js 文件的顶部,是一个单个自解释变量
// SET THIS VARIABLE FOR DELAY, 1000 = 1 SECOND
var delayLength = 4000;
然后,当然,在 DOM 准备好之后,我们将开始我们的操作。 我们要做的第一件事是将停止/启动按钮附加到滑块。 CSS 已经到位以定位和设置它的样式。
$(function() {
$("#slider").append('Stop');
});
接下来,我们需要变得聪明一点,开始弄清楚我们正在处理什么。 幻灯片的数量和它们的宽度是我们滑块的重要信息。 而不是在代码中硬编码它们,我们将使用 jQuery 来计算它们并确定它们的宽度。 计算很容易,宽度稍微复杂一些,因为我们需要提取三个 CSS 值(宽度、paddingLeft、paddingRight)、解析它们并将它们加在一起。
var $slide1 = $("#slide-1");
var panelWidth = $slide1.css("width");
var panelPaddingLeft = $slide1.css("paddingLeft");
var panelPaddingRight = $slide1.css("paddingRight");
panelWidth = parseFloat(panelWidth, 10);
panelPaddingLeft = parseFloat(panelPaddingLeft, 10);
panelPaddingRight = parseFloat(panelPaddingRight, 10);
panelWidth = panelWidth + panelPaddingLeft + panelPaddingRight;
var numPanels = $(".slide").length;
var tooFar = -(panelWidth * numPanels);
现在,我们需要编写代码来处理滑动操作。 我们可能希望在两个地方启动动画。 一个是在页面加载时,另一个是在按下“开始”按钮时。 由于这两个不同的位置,将我们的动画包装在一个函数中并在需要时调用它是有意义的(**DRY**:不要重复自己)。
function doMove(panelWidth, tooFar) {
var leftValue = $("#mover").css("left");
// Fix for IE
if (leftValue == "auto") { leftValue = 0; };
var movement = parseFloat(leftValue, 10) - panelWidth;
if (movement == tooFar) {
$(".slide img").animate({
"top": -200
}, function() {
$("#mover").animate({
"left": 0
}, function() {
$(".slide img").animate({
"top": 20
});
});
});
}
else {
$(".slide img").animate({
"top": -200
}, function() {
$("#mover").animate({
"left": movement
}, function() {
$(".slide img").animate({
"top": 20
});
});
});
}
}
用简单的英语说:检查滑块在哪里。 如果它在最后一个面板,则返回第一个面板。 否则,向前移动一个面板长度。 请注意 .animate() 函数的嵌套。 animate 函数有一个回调事件,当动画完成时它会被运行。 因此,为了使我们的动画一个接一个地运行(而不是全部同时运行),我们使用回调。 因此,现在它依次对图像向上动画、移动器向右动画,然后图像向下动画。
请注意,我们传递了 width 和 “tooFar” 变量,因为该函数需要它们,并且它们不是全局变量。 此外,还有一个针对 IE 的小修复,由 Eric Wendelin 为我修复,其中左值被奇怪地设置为“auto”而不是“0”。
“自动播放”
JavaScript 为像我们这样的“自动播放”小部件提供了完美的内置函数:SetInterval(); 我们将用它来调用我们的函数
sliderIntervalID = setInterval(function(){
doMove(panelWidth, tooFar);
}, delayLength);
“sliderIntervalID” 变量不是必需的,但这使我们以后能够使用该 ID 调用 clearInterval() 来停止它。 这对于我们想要的功能至关重要。
现在剩下要做的就是用我们的小按钮编写停止和启动代码
$("#slider-stopper").click(function(){
if ($(this).text() == "Stop") {
clearInterval(sliderIntervalID);
$(this).text("Start");
}
else {
sliderIntervalID = setInterval(function(){
doMove(panelWidth, tooFar);
}, delayLength);
$(this).text("Stop");
}
});
按钮最初显示“停止”,因为我们在页面加载时启动了动画。 这是有道理的。 因此,当该按钮被点击时,它会检查并查看该文本是否仍然是“停止”,如果是,它会停止正在运行的间隔并将文本更改为“开始”。 魔法。
如果按钮被点击并且它显示的不是“停止”(比如它显示“开始”时),该按钮将再次启动 setInterval 函数并将按钮文本更改回“停止”。 简单而美好。
如何自定义
要添加另一个面板,请在 #mover 内部添加另一个 div
<div class="slide">
<h1>Name of Slide</h1>
...etc
</div>
就是这样! 该代码足够智能,可以识别它并知道该怎么做。 您甚至可以更改 CSS,它应该能够存活。
不错! 干得好,克里斯。 你很棒。
很棒,克里斯! 你能使用 size(); 获取 'numPanels' 变量来自动计算面板数量吗?
Intense Debate 怎么了? 不管用了吗?
很棒的帖子! 幸运的是,你很早就发布了!
另一个很棒的帖子。 不仅要找到使用它的方法。 干杯!
谢谢大家 =)
@Toby: 好主意,绝对可以这样计算面板,可能还可以测量尺寸。
我现在仍在与 Intense Debate 同步,但我会等待并看看他们是否能够解决我的一些同步问题和其他问题,然后再恢复到完整系统。 我真的很喜欢它的大部分内容,可能会在将来恢复。
我的天! 我有一篇跟这类似的帖子,明天就要发布! 我会把它留到下周或者其他时候。
克里斯,干得好,总是很高兴。
很棒,克里斯。 我真的很喜欢这个。 我计划很快使用它。 继续努力。
太棒了! 这对我的公司网站更新非常有用。 非常感谢分享。
我认为“HTML 标记”下的第二段应该是…
“请注意,没有用于停止按钮的标记。 因为它不属于标记,因为没有 JavaScript 它将毫无用处。 我们将通过 JavaScript 应用它。”
另外… 谢谢。 我一直在看 ThemeForest 上的每日 Jquery 视频,这有助于我将学到的知识应用到实际应用中。
哇,太棒了! 谢谢!
简直太漂亮了。
分享很棒,谢谢您!
Chris-
不确定您是否知道,但这在IE7中不起作用。
当您加载页面时,图像会在整个幻灯片移动之前向上滑动,然后我会收到“页面错误”。看起来像可能的JS错误。
无论如何,不确定您是否已经知道以及/或是否关心支持IE。
这很漂亮 - 工作很棒。迫不及待地想看看您在下一个版本中带来的更新!
@Kyle - 谢谢您指出这一点。我看到了完全相同的情况。我不知道为什么。
如果有人擅长跨浏览器JavaScript调试,请伸出援手=)
很棒的工作,这是一个很好的例子,说明如何将javascript和css集成在一起,以产生一些非常专业的视觉效果。将一些图片和内容插入数据库,从数据库中提取,您就拥有一个非常不错的新闻轮播器,没有flash(非常方便)。
这段小代码在Firefox 3.0和Google Chrome 0.4.1上运行完美,但似乎在IE中存在一些问题(一点也不奇怪,因为IE纯粹是垃圾)。在IE6中,面板不会保持包含(所有三个都并排显示)。在IE7中,脚本运行第一个面板,然后冻结。
我的猜测是,一些IE特定的“hack”需要通过css/javascript进行格式化,才能让IE正常工作。如果我今天下午有时间,我会试着玩玩,看看是否可以帮助解决IE问题。
Yo Chris 如果您用未打包的版本替换jQuery打包的版本,我会帮您解决这个问题。调试打包版本有点痛苦。
完成了。我现在将开发版本放在那里。
嗨,Chris - 我在IE 7中也注意到了同样的事情。从您最近的帖子来看,您似乎已经修复了这个问题,但下载上的日期戳仍然是12/4。开发版本是否在其他地方提供?在IE 7.0中,a.now是NaN
感谢您提供如此优雅的代码。
这是修复方法
添加 if (leftValue == “auto”) { leftValue = 0; }
紧接在
var leftValue = $(“#mover”).css(“left”);
这是因为在IE中leftValue是“auto”。
完美!感谢Eric。
我更新了代码和下载。我会过会儿更新文章。
太棒了!
Chris,您写得非常棒!
有一件事,我认为您没有关闭page-wrap div。
很棒的东西...
嘿,Chris,我一直很喜欢您的文章。您是否有一个样本,可以与关闭javascript的我们一起使用,这些用户必须处理教育/政府网站?
@Dan - 我会在几分钟后进行的更新中修复它,谢谢。
@Donna - 它确实可以在JS关闭的情况下工作,只是只显示第一个面板。对于JS关闭来说,这是最好的结果了。
@Chris - 谢谢您及时修复了代码。现在我可以将它用于IE,它将非常有用。您很棒。
您很棒,Chris,我一直在寻找这样的文章...
非常感谢
:)
看起来很不错!继续努力。
非常棒的滑块!非常感谢,太棒了!!!
感谢Chris撰写了如此棒的文章,并感谢Eric Wendelin修复了IE错误。双赢,我爱它...继续努力!
绝对漂亮。Chris,您做得很好。
是的!很棒的演示
我的天,这太酷了。我可以拥有一个吗?!
太棒了...。
嘿,抱歉打扰了,但我注意到文章中有很多错别字...
也许是睡眠不足,但这确实让我感到困惑:)
无论如何,一如既往,出色的工作。
欢呼声,
jon
感谢您发现这些问题,Jon,我已经更新了它们。我需要一个编辑=P
发生了一件奇怪的事情,当我想要超过三个幻灯片时,我需要增加#mover的宽度。否则,div不会放置在一行中,滑动不起作用。您能确认一下吗?
啊,是的,Mariusz,您发现了一个问题。我已经再次更新了代码,以使用JavaScript设置#mover的宽度,因此无需在那里进行调整。
只有我吗?
那些写着“了解更多”的箭头按钮是用来触发幻灯片切换的吗?因为它们没有响应我的疯狂点击...我希望这不是我的计算机!
: O
非常感谢..这正是我一直在寻找的东西。
你好,
我看到当我阻止javascript时,标记的内容是完整的,但我只能看到第一个项目。
是否可以在javascript未激活时降级到一个正常的页面,而没有动画效果?
非常感谢您,并感谢您成为如此优秀的导师。
现在在IE7中看起来不错,但是,它似乎仍然在IE6中同时显示所有标签。不幸的是,我需要有IE6兼容的设计。我一定会将其用于副项目,我也会监视此页面,希望会找到一个IE6修复方法。
必须在某个时候尝试一下!
Chris,您做得很好!
您太棒了。这正是我一直在寻找的东西。但是,我确实需要支持IE 6。我的下一步:在谷歌搜索中搜索启动/停止滑块
我必须再次说您绝对是魔力狂!
这太棒了,弹出,滑入,继续前进。
您能使其更具活力,更具活力,更具活力吗?
真的很棒的工作!不幸的是,它不兼容IE6(漂白剂):(
@sergi 您找到解决方案了吗?
我应该将此代码放在style部分还是body部分?希望很快收到您的回复。我在http://www.designmyspace.org获得了我的布局
很棒的工具!
谢谢您!
太棒了,希望有更多类似的文章!
这个可以做成垂直的吗?很棒的作品,Chris!我之前用过你的东西,很可能也会用这个,但是如果能竖着使用就太好了。相同的尺寸,就像把这个立起来一样…
真的很棒的作品!我尝试更改尺寸,稍微小一点… 目前没有问题 - 但每次重新加载时,第一个幻灯片图像的位置都会稍微偏高。有什么想法吗?
老兄,好棒的作品!
我通常不会费心评论,但我真的很喜欢你所有的作品,所以再次感谢… bb..
Rik
你好,
这是一份很棒的作品。非常感谢。我尝试把它整合到一个 WordPress 主题中。除了 IE-6(不出所料),其他一切都运行良好。在 IE -6 上,整个面板都平铺在屏幕上。有没有什么解决方法?
你好 Chris,
我在 IE-6 上通过更改 CSS 使它运行。我将 #mover 的位置从 relative 更改为 absolute。
# mover {
width: auto;
position: absolute;
}
这对我来说是有效的。还有其他解决方法吗?
下载链接不起作用。你能修复一下吗?
Jinsona… 感谢你提供了 IE6 的修复方案。但是你将宽度更改为“auto”。我用这种方法无法使其生效。我保持所有设置不变,只将位置更改为“absolute”,它就完美运行了。
如何添加按钮来选择下一个和上一个面板?这样就可以按自己的节奏滚动。
添加下一个或上一个按钮以及小幻灯片预览,以便可以直接跳转到特定幻灯片,这有多难?
可以将其作为区块整合到 Drupal 网站中吗?我想在高中在线报纸上使用它。
借鉴 Cameron Moll 的例子,“优秀的设计师抄袭,伟大的设计师窃取”,我直接复制粘贴到我的项目中。有许多脚本/教程与你的类似,但没有一个像这个一样全面且易于理解。
感谢 Chris,你帮我节省了几个小时的工作!
你好,
我喜欢这个滑块,我想再添加一个幻灯片,而不是三个。我该怎么做?感谢你的帮助。
你好 Chris
很棒的文章!
刚刚在 IE6 中查看了演示… 仍然显示 3 个区域都水平排列。
有没有找到针对这个很棒的滑块的 IE6 诅咒的解决方案?
嗨,大家好,很棒的脚本!
但是如果我想在页面加载时停止幻灯片怎么办?
(然后通过按下“开始”按钮来激活它)
你好
我真的很喜欢它,但我有一个问题
可以调整它,使滑动 div 在两侧各有两个箭头,用于手动(而非自动)滑动其内容吗?你能分享一下如何操作吗?
谢谢!
首先感谢你提供这个很棒的教程。
我只有一个问题。
我可以在互联网网站上使用它吗?
因为它在我的本地开发服务器上运行良好,哈哈,但在我的线上服务器中,滑块动作应该发生时却没有任何反应。
谢谢
已修复,错误是我的… 哈哈。
感谢你提供这个很棒的教程!
嗨 Chris,如何添加开始和停止图像,我有点困惑…
你好,
我喜欢这个滑块的外观,但我有一个问题,如何自定义它,使其与页面左侧对齐,而不是居中?我尝试过更改 style.css 文件中的某些内容,但到目前为止还没有找到更改对齐方式的方法。我离目标最近的一次是在 #mover 部分添加了一个负向左属性,(例如,#mover {left: -180px;}),但这在不同大小的浏览器中不能一致地工作。
在 JS 中是否有将它与中心对齐的东西?有什么想法吗?
我需要设计一个网站,其登陆页面上有一个老虎机,它可能只有一个默认的静止图像,数字会显示在那里。然后,我需要该区域在每次有人按下按钮时,都充当一个开始/停止滑块,就像一个真正的老虎机一样。我们将使用简短的一行推荐语代替数字。这段代码看起来与我们需要的很接近,但是有什么帮助吗?