Vor einiger Zeit habe ich ein Tutorial zu einem Featured Content Slider gemacht. Es war gut, aber die Anpassungsmöglichkeiten waren etwas begrenzt. Die zwei am häufigsten gewünschten Funktionen waren das Hinzufügen/Entfernen von „Panels“ und eine Stopp/Start-Schaltfläche.
Ich freue mich, sagen zu können, dass ich mit diesem neuen Slider etwas dazu beitragen konnte. Es ist kein Plugin, daher ist es nicht so einfach, wie es sein könnte, aber es ist viel einfacher. Am Ende gibt es einen Abschnitt zur Anpassung. Der Slider verfügt über eine Stopp/Start-Schaltfläche, und die Animation geht etwas über das einfache Schieben nach links hinaus.

Das HTML-Markup
Das Markup ist extrem schlank. Einfach ein Container, der den Bereich umschließt und Überlauf ausblendet, dann ein „Mover“ darin, der das Schieben bewirkt, und darin dann die Slides.
Beachten Sie, dass es kein Markup für eine Stopp-Schaltfläche gibt. Diese gehört nicht ins Markup, denn ohne JavaScript wäre sie nutzlos. Wir werden sie über JavaScript anwenden. Beachten Sie auch, dass die erste Folie eine eindeutige ID hat. Wir werden diese als unsere „Testfolie“ verwenden, um mit JavaScript Breiteninformationen zu sammeln.
<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>
Das 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; }
Hier gibt es nicht viel zu besprechen, vieles davon sind lediglich darstellerische Entscheidungen. Funktional ist die relative Position von #mover wichtig und für den Schiebeeffekt notwendig. Ebenso ist die absolute Positionierung der img-Elemente wichtig. Mit diesem CSS und ausgeschaltetem JavaScript wird der Slider die erste Folie anzeigen und das war's (ideal, wenn Sie mich fragen).
Das jQuery JavaScript
90% dessen, was wir hier tun, ist spezifisch für jQuery. Das macht die Dinge viel einfacher. Wir müssen sicherstellen, dass diese Bibliothek vor dem Rest unseres Skripts geladen wird.
<script type="text/javascript" src="js/jquery-1.2.6.pack.js"></script>
<script type="text/javascript" src="js/startstop-slider.js"></script>
Ganz oben in unserer Datei startstop-slider.js befindet sich eine einzelne, selbsterklärende Variable
// SET THIS VARIABLE FOR DELAY, 1000 = 1 SECOND
var delayLength = 4000;
Dann beginnen wir mit unserer Bearbeitung, nachdem das DOM bereit ist, natürlich. Als Erstes hängen wir die Stopp/Start-Schaltfläche an den Slider an. CSS ist bereits vorhanden, um sie zu positionieren und zu gestalten.
$(function() {
$("#slider").append('Stop');
});
Als Nächstes müssen wir ein wenig schlau werden und anfangen herauszufinden, womit wir es zu tun haben. Die Anzahl der Folien und ihre Breiten sind entscheidende Informationen für unseren Slider. Anstatt sie fest zu codieren, verwenden wir jQuery, um sie zu zählen und ihre Breite zu ermitteln. Das Zählen ist einfach, die Breite ist etwas komplizierter, da wir drei CSS-Werte (Breite, paddingLeft, paddingRight) abrufen, parsen und addieren müssen.
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);
Jetzt müssen wir Code schreiben, der die Schiebeaktion handhabt. Es gibt zwei Stellen, an denen wir die Animation potenziell starten möchten. Eine ist direkt beim Laden der Seite, die andere, wenn auf die Schaltfläche „Start“ geklickt wird. Aufgrund dieser beiden unterschiedlichen Stellen ist es sinnvoll, unsere Animation in eine Funktion zu verpacken und sie nach Bedarf aufzurufen (DRY: Don't Repeat Yourself).
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
});
});
});
}
}
In einfacher Sprache: Überprüfen Sie, wo sich der Slider befindet. Wenn er sich im letzten Panel befindet, gehen Sie zurück zum ersten Panel. Andernfalls bewegen Sie sich um eine Panel-Länge nach vorne. Beachten Sie die Verschachtelung der .animate()-Funktionen. Die animate-Funktion hat ein Callback-Ereignis, das ausgeführt wird, wenn die Animation abgeschlossen ist. Damit unsere Animationen nacheinander (statt alle auf einmal) ablaufen, verwenden wir die Callbacks. So animiert es zuerst das Bild hoch, dann den Mover nach rechts und dann das Bild wieder nach unten, in dieser Reihenfolge.
Beachten Sie, dass wir die Variablen width und „tooFar“ übergeben, da die Funktion diese benötigt und sie keine globalen Variablen sind. Außerdem gibt es eine kleine Korrektur für IE, die Eric Wendelin für mich behoben hat, wo der linke Wert auf bizarre Weise wieder auf „auto“ anstatt auf „0“ gesetzt wird.
„Auto Play“
JavaScript bietet die perfekte integrierte Funktion für ein „automatisch abspielendes“ Widget wie unseres: SetInterval(); Wir werden es verwenden, um unsere Funktion aufzurufen
sliderIntervalID = setInterval(function(){
doMove(panelWidth, tooFar);
}, delayLength);
Die Variable „sliderIntervalID“ ist nicht zwingend erforderlich, ermöglicht uns aber später, clearInterval() mit dieser ID aufzurufen, um sie zu stoppen. Entscheidend für die gewünschte Funktionalität.
Alles, was jetzt noch übrig ist, ist das Stoppen und Starten mit unserer kleinen Schaltfläche zu codieren
$("#slider-stopper").click(function(){
if ($(this).text() == "Stop") {
clearInterval(sliderIntervalID);
$(this).text("Start");
}
else {
sliderIntervalID = setInterval(function(){
doMove(panelWidth, tooFar);
}, delayLength);
$(this).text("Stop");
}
});
Die Schaltfläche beginnt mit der Aufschrift „Stop“, da wir die Animation direkt beim Laden der Seite gestartet haben. Das ist sinnvoll. Wenn also auf diese Schaltfläche geklickt wird, prüft sie und sieht, ob der Text weiterhin „Stop“ lautet. Wenn ja, stoppt sie das laufende Intervall und ändert den Text in „Start“. Magie.
Wenn auf die Schaltfläche geklickt wird und sie etwas anderes als „Stop“ anzeigt (wie wenn sie „Start“ anzeigt), startet die Schaltfläche die setInterval-Funktion erneut und ändert den Schaltflächentext zurück zu „Stop“. Einfach und schön.
Anpassung
Um ein weiteres Panel hinzuzufügen, fügen Sie einen weiteren Div innerhalb des #mover hinzu
<div class="slide">
<h1>Name of Slide</h1>
...etc
</div>
Das ist alles! Der Code ist intelligent genug, um ihn zu erkennen und zu wissen, was zu tun ist. Sie können sogar das CSS ändern, und es sollte überleben.
Schön! Tolle Arbeit, Chris. Du rockst.
Sehr schön, Chris! Könntest du die Variable ‚numPanels‘ mit size(); ermitteln, um die Anzahl der Panels automatisch zu zählen?
Was ist mit Intense Debate passiert? Funktioniert nicht?
Toller Beitrag! Glück für uns, dass du frühzeitig veröffentlichst!
Noch einer großartig. Nicht nur eine Möglichkeit finden, ihn zu nutzen. Prost!
Danke euch allen =)
@Toby: Gute Idee, man könnte die Panels definitiv auf diese Weise zählen und wahrscheinlich auch die Größe messen.
Ich synchronisiere vorerst weiterhin mit Intense Debate, werde aber abwarten, ob sie einige meiner Synchronisierungsprobleme und anderes Zeug lösen können, bevor ich zum vollständigen System zurückkehre. Ich mag die meisten Dinge daran, wahrscheinlich werde ich es zu einem späteren Zeitpunkt wieder aufnehmen.
Mann! Ich habe einen Beitrag genau wie diesen, der morgen live gehen soll! Ich lasse ihn bis nächste Woche oder so stehen.
Gute Arbeit Chris, immer eine Freude.
Sehr schön, Chris. Das gefällt mir wirklich gut. Ich plane, es bald zu verwenden. Mach weiter so.
Fantastisch! Das wird großartig für ein Update funktionieren, das ich für die Website meines Unternehmens mache. Vielen Dank fürs Teilen.
Ich denke, der 2. Absatz unter „HTML Markup“ sollte lauten…
„Beachten Sie, dass es kein Markup für eine Stopp-Schaltfläche gibt. Diese gehört nicht ins Markup, denn ohne JavaScript wäre sie nutzlos. Wir werden sie über JavaScript anwenden.“
Apropos… DANKE. Ich habe die täglichen jQuery Screencasts auf Themeforest durchgesehen und das hier hilft für eine reale Anwendung dessen, was ich gelernt habe.
wow super!!!!!!! danke
Einfach wunderschön.
Schöne Teilung, danke
Chris-
Ich bin mir nicht sicher, ob du es wusstest oder nicht, aber das funktioniert in IE7 nicht.
Wenn du die Seite lädst, gleitet das Bild hoch, kurz bevor die gesamte Folie verschoben werden soll, und dann erhalte ich eine Fehlermeldung auf der Seite. Sieht mir nach einem möglichen JS-Fehler aus.
Jedenfalls bin ich mir nicht sicher, ob du das schon wusstest und/oder ob du IE unterstützen willst.
Das ist wunderschön – sehr gute Arbeit. Ich kann die Updates, die du im nächsten Version bringen wirst, kaum erwarten!
@Kyle – Danke, dass du darauf aufmerksam gemacht hast. Ich sehe genau dasselbe. Ich habe keine Ahnung, warum.
Wenn jemand gut in diesem plattformübergreifenden JavaScript-Debugging ist, bitte helft mit =)
Gute Arbeit, dies ist ein gutes Beispiel dafür, wie JavaScript und CSS integriert werden können, um sehr professionell aussehende Ergebnisse zu erzielen. Stecken Sie Bilder und Inhalte in eine Datenbank, ziehen Sie sie heraus, und Sie haben einen ziemlich schicken Nachrichten-Rotator ohne Flash (sehr praktisch).
Dieses kleine Snippet funktioniert fehlerfrei unter Firefox 3.0 und Google Chrome 0.4.1, hat aber unter IE einige Probleme (überrascht überhaupt nicht, da IE reiner Müll ist). In IE6 bleiben die Panels nicht enthalten (alle 3 werden nebeneinander angezeigt). In IE7 führt das Skript das erste Panel aus und friert dann ein.
Ich vermute, einige IE-spezifische „Hacks“ müssen über CSS/JavaScript formatiert werden, damit IE richtig funktioniert. Wenn ich heute Nachmittag etwas Zeit habe, werde ich herumspielen und sehen, ob ich zur Behebung des IE-Problems beitragen kann.
Hey Chris, wenn du die gepackte Version von jQuery durch die ungepackte Version ersetzt, repariere ich das für dich. Es ist etwas mühsam, die gepackte Version zu debuggen.
Erledigt. Ich habe jetzt die Entwicklungsversion hochgeladen.
Hallo Chris – Ich habe dasselbe bei IE 7 bemerkt. Aus deinem letzten Beitrag geht hervor, dass du dies behoben hast, aber die Zeitstempel der Downloads sind immer noch der 04.12. Ist die Entwicklungsversion woanders verfügbar? In IE 7.0 ist a.now NaN
Danke für diesen eleganten Code.
Hier ist die Lösung
Füge hinzu: if (leftValue == „auto“) { leftValue = 0; }
Direkt nach
var leftValue = $(„#mover“).css(“left”);
Das liegt daran, dass leftValue in IE „auto“ ist.
Perfekt! Danke Eric.
Ich habe den Code und den Download aktualisiert. Ich werde den Artikel in Kürze aktualisieren.
Toll!
Fantastische Ausarbeitung, Chris!
Eine Sache: Ich glaube nicht, dass du den page-wrap div schließt.
Gute Sache…
Hallo Chris, ich genieße deine Artikel immer. Hast du ein Beispiel, das ohne JavaScript funktioniert, für uns, die wir mit Bildungs-/Regierungsinstitutionen arbeiten müssen?
@Dan – Das werde ich in der Aktualisierung beheben, die ich in ein paar Minuten vornehme, danke.
@Donna – Es funktioniert mit deaktiviertem JS, zeigt nur das erste Panel an. Das ist ungefähr das Beste, was mit deaktiviertem JS möglich ist.
@Chris – Danke für die prompte Reaktion bei der Fehlerbehebung. Das wird jetzt großartig funktionieren, da ich es in IE verwenden kann. Du bist großartig.
Du bist großartig Chris, ich habe nach so einem Artikel gesucht…
Vielen Dank
:)
Sieht ziemlich gut aus! Mach weiter so.
So ein toll aussehender Slider! Vielen Dank, wunderschön!!!
Danke an Chris für diesen großartigen Artikel und an Eric Wendelin für die Behebung des IE-Bugs. Win-Win, ich liebe es… mach weiter so!
absolut umwerfend. gute arbeit chris.
Yeah! Schöne Demo
Mein Gott, das ist cool. Kann ich einen haben?!
Es ist super….
Hey, sorry, dass ich nerve, aber ich habe bisher eine Reihe von Tippfehlern im Artikel bemerkt…
Vielleicht ist es nur der Schlafmangel, aber sie haben mich tatsächlich verwirrt :)
Jedenfalls brillante Arbeit wie immer.
Schöne Grüße,
jon
Danke für diese Korrekturen Jon, ich habe sie aktualisiert. Ich brauche einen Lektor =P
Seltsames passiert, wenn ich mehr als drei Folien haben möchte, muss ich die Breite in #mover erhöhen. Sonst sind die Divs nicht in einer Reihe und das Schieben funktioniert nicht. Können Sie das bestätigen?
Ah ja, gute Beobachtung Mariusz. Ich habe den Code noch einmal aktualisiert, um die #mover-Breite mit JavaScript festzulegen, sodass dort keine Anpassungen erforderlich sind.
nur ich?
sollen diese Pfeiltasten, die „mehr erfahren“ sagen, einen Folienwechsel auslösen? denn sie reagieren nicht auf mein manisches Klicken… ich hoffe, es liegt nicht an **meinem Compu**!
: O
Vielen Dank… das ist genau das, was ich gesucht habe.
Hallo,
Ich habe gesehen, dass, wenn ich JavaScript blockiere, der Inhalt des Markups vollständig ist, aber ich kann nur das erste Element sehen.
Ist es möglich, zu einer normalen Seite ohne Animation zu degradieren, wenn JavaScript nicht aktiviert ist?
Vielen Dank, und meine Komplimente dafür, dass Sie ein so guter Mentor sind.
Sieht in IE7 jetzt gut aus, aber in IE6 werden immer noch alle Tabs gleichzeitig angezeigt. Leider bin ich verpflichtet, IE6-kompatible Designs zu haben. Ich werde dies auf jeden Fall für Nebenprojekte verwenden und diese Seite beobachten, hoffentlich wird eine IE6-Korrektur auftauchen.
Ich werde das irgendwann ausprobieren müssen!
Gute Arbeit, Chris!
du rockst. das ist genau das, wonach ich gesucht habe. Allerdings muss ich auch IE 6 unterstützen. Mein nächster Schritt: eine Google-Suche nach Start/Stop-Slider.
Ich stimme der Meinung zu, dass du total mojo verrückt bist!
Das ist wahnsinnig genial, ausfliegend, reinschiebend, weiterziehend.
Kannst du es ein bisschen whikkety, whickeddy wicked machen?
Wirklich, wirklich gute Arbeit! Leider ist es nicht IE6 (ätzend) konform :(
@sergi, hast du eine Lösung gefunden?
Wo soll ich diesen Code einfügen, in den Style- oder Body-Bereich? Ich hoffe, bald von Ihnen zu hören. Mein Layout habe ich unter http://www.designmyspace.org
tolles Werkzeug!
Danke!
Erstaunlich, mehr Artikel wie dieser :)
Kann das vertikal gemacht werden? Tolle Arbeit, Chris! Ich habe deine Sachen schon früher benutzt und werde sie wahrscheinlich auch verwenden, aber es wäre großartig, wenn ich sie vertikal verwenden könnte. Gleiche Abmessungen, so wie diese aufrecht stehend…
Wirklich tolle Arbeit! Ich habe versucht, die Abmessungen zu ändern, ein wenig kleiner... Bisher keine Probleme – aber bei jedem Neuladen ist die Position des ersten Slider-Bildes etwas zu hoch. Irgendwelche Ideen, was das Problem ist?
Alter, gute Arbeit!!
Ich mache mir normalerweise nicht die Mühe zu kommentieren, aber ich mag deine Arbeit wirklich sehr, also nochmals vielen Dank… bb..
Rik
Hallo,
Es ist ein schönes Werk. Vielen Dank. Ich habe versucht, es in ein WordPress-Theme zu integrieren. Alles funktioniert gut, außer unter IE-6 (keine Überraschung). Unter IE-6 werden alle Panels flach auf dem Bildschirm angezeigt. Gibt es eine Lösung dafür?
Hallo Chris,
Ich habe es unter IE-6 zum Laufen gebracht, indem ich die CSS geändert habe. Ich habe die Position von #mover von relativ auf absolut geändert.
# mover {
width: auto;
position: absolute;
}
Das funktioniert für mich. Gibt es eine andere Lösung für dieses Problem?
Der Download-Link funktioniert nicht. Können Sie ihn bitte reparieren.
Jinsona…..Danke für die IE6-Korrektur. Allerdings hast du die Breite auf „auto“ geändert. Ich konnte es auf diese Weise nicht zum Laufen bringen. Ich habe alles gleich gelassen und nur die Position auf „absolut“ geändert, und es funktioniert großartig.
Wie würden Sie Schaltflächen hinzufügen, um die nächsten und vorherigen Panels auszuwählen? So könnte man in seinem eigenen Tempo scrollen.
Wie schwierig wäre es, dieses Ding mit Schaltflächen für das nächste oder vorherige Panel und kleinen Slider-Vorschauen zu versehen, damit man direkt zu einem bestimmten Slide wechseln könnte?
Ist es möglich, dies in eine Drupal-Seite als Block zu integrieren? Ich möchte es auf einer Online-Zeitung für eine High School verwenden.
Nach dem Beispiel von Cameron Moll, „Gute Designer kopieren, großartige Designer stehlen“, habe ich das einfach in mein Projekt kopiert und eingefügt. Es gibt viele Skripte/Tutorials, die Ihrem ähneln, aber keines ist so umfassend und so leicht erklärt wie dieses.
Danke Chris, du hast mir ein paar Stunden Arbeit erspart!
Hallo,
Ich liebe diesen Slider, ich möchte eine weitere Folie statt drei hinzufügen. Wie mache ich das? Danke für Ihre Hilfe.
Hallo Chris
Toller Artikel!!!!
Habe gerade die Demo in IE6 angesehen, mmm…. zeigt immer noch alle 3 Bereiche horizontal an.
Wurde ein Heilmittel für den IE6-Fluch für diesen großartigen Slider gefunden?
Hallo Leute, tolles Skript!
aber was ist, wenn ich möchte, dass die Diashow beim Laden der Seite gestoppt ist?
(und sie durch Drücken der Schaltfläche „Start“ aktivieren)
Hallo
Es gefällt mir sehr gut, aber ich habe eine Frage
Könnte dies so angepasst werden, dass das gleitende Div auf jeder Seite zwei Pfeile hat, um seinen Inhalt manuell (und nicht automatisch) zu verschieben? Können Sie bitte mitteilen, wie?
Danke!
Hallo, zuerst einmal vielen Dank für das großartige Tutorial.
Ich habe nur ein Problem/eine Frage.
Kann ich das auf einer Internetseite verwenden?
Denn es funktioniert großartig auf meinem lokalen Dev-Server haha, aber auf meinem Live-Online-Server passiert nichts, wenn die Slider-Aktion stattfinden soll.
Danke
Habe es behoben, der Fehler lag bei mir hahaha.
Danke für das großartige Tutorial!
Hallo Chris, wie füge ich Start- und Stoppbilder hinzu? Ich bin verwirrt…
Hallo,
Ich liebe das Aussehen dieses Sliders, aber meine Frage ist, wie passe ich ihn so an, dass er links auf der Seite ausgerichtet ist und nicht in der Mitte? Ich habe versucht, einige Dinge in der style.css-Datei zu ändern, aber bisher keine Möglichkeit gefunden, die Ausrichtung zu ändern. Am nächsten kam ich, indem ich ein negatives linkes Attribut im #mover-Bereich hinzufügte (z.B. #mover {left: -180px;}), aber das funktioniert nicht wirklich konsistent mit unterschiedlich großen Browsern.
Gibt es etwas im JS, das ihn in der Mitte ausrichtet? Irgendwelche Gedanken?
Ich muss eine Website mit einem Spielautomaten auf der Startseite entwerfen, der vielleicht nur ein standardmäßiges statisches Bild hat, wo die Zahl erscheinen würde. Dann muss dieser Bereich wie ein echter Spielautomat als Start/Stopp-Slider fungieren, jedes Mal, wenn jemand einen Knopf drückt. Wir werden kurze einzeilige Testimonials anstelle von Zahlen anzeigen. Diese Codierung sieht dem, was wir brauchen, ziemlich ähnlich, aber gibt es Hilfe?