Der folgende Beitrag ist ein Gastbeitrag von Alex Young (@the_alexyoung). Alex hat eine einfache Technik entwickelt, um das Motiv eines Fotos zu „drehen“, indem einfach mehrere übereinander liegende Fotografien, die aus verschiedenen Blickwinkeln aufgenommen wurden, ein- und ausgeblendet werden. Viel Spaß!
Webdesigner und -entwickler haben uns schon immer mit unterhaltsamen und ansprechenden Möglichkeiten fasziniert, wie wir mit ihren Websites interagieren. Ich liebe es, neue Techniken zu entdecken, die sich diese Designer/Entwickler ausgedacht haben. Eine Technik, die mein Interesse besonders geweckt hat, ist etwas, das ich auf der Website von Warby Parker gesehen habe. Sie konnten einen coolen Effekt erzielen, bei dem ein Model der Maus des Benutzers folgt und dabei die verschiedenen Blickwinkel der Brillengestelle zeigt.
Ich habe diese Technik hauptsächlich für die Präsentation von Sonnenbrillen gesehen, aber ich bin gespannt, was Sie für andere reale Anwendungen entwickeln können.
Bevor wir beginnen, benötigen Sie ein paar Dinge. Genauer gesagt, sieben Dinge. Sie benötigen sieben Fotos von etwas, das aus sieben verschiedenen Blickwinkeln aufgenommen wurde.
HTML-Setup
Was wir einrichten, ist ein Container namens „faces“ und dann ein Bereich, den wir zur Anzeige der Fotos verwenden werden – „face-area“. Wir haben auch ein div, um jedes der sieben einzelnen Bilder aufzunehmen.
<div id="faces">
<div id="face-area">
<div id="image-1" style="display: none;">
<img src="/images/look-left-3.jpg">
</div>
<div id="image-2" style="display: none;">
<img src="/images/look-left-2.jpg">
</div>
<div id="image-3" style="display: none;">
<img src="/images/look-left-1.jpg">
</div>
<div id="image-4" style="display: none;">
<img src="/images/look-center.jpg">
</div>
<div id="image-5" style="display: none;">
<img src="/images/look-right-1.jpg">
</div>
<div id="image-6" style="display: none;">
<img src="/images/look-right-2.jpg">
</div>
<div id="image-7" style="display: none;">
<img src="/images/look-right-3.jpg">
</div>
Nun erstellen wir ein div, das genau das tut, was der Name vermuten lässt. Es wird auf den anderen divs liegen. Wir können dieses div in 7 kleine Spalten unterteilen und diese gleichmäßig darauf verteilen. Diese 7 Spalten werden verwendet, um zu erkennen, wann die Maus über eine bestimmte Spalte schwebt. Durch das Hinzufügen von „data-number“ zu jedem div können wir später in jQuery auf jedes einzelne verweisen.
<div id="the_faces_overlay">
<div class="the_faces" data-number="1"></div>
<div class="the_faces" data-number="2"> </div>
<div class="the_faces" data-number="3"></div>
<div class="the_faces" data-number="4"></div>
<div class="the_faces" data-number="5"></div>
<div class="the_faces" data-number="6"></div>
<div class="the_faces" data-number="7"></div>
</div>
</div><!-- END #face-area -->
</div> <!-- END #faces -->
CSS-Setup
Der Großteil des CSS ist selbsterklärend. Eine Sache, die ich erwähnen muss und die wichtig ist: Stellen Sie sicher, dass die 7 Spalten perfekt zusammenpassen und den gesamten span des div abdecken.
body {
background: #333
}
#faces {
height: 333px;
width: 500px;
margin: 0 auto;
border: 8px solid white;
}
#face-area {
height: 500px;
width: 333px;
position: relative;
}
#the_faces_overlay {
position: absolute;
width: 500px;
top: 0;
left: 0;
}
#faces .the_faces {
height: 333px;
width: 14.2857143%;
float: left;
margin: 0;
padding: 0;
}
jQuery-Setup
Wir müssen darauf reagieren, wenn über eine der Spalten geschwebt wird. Hier kommen die „data-numbers“ ins Spiel. Wenn wir später weitere Spalten hinzufügen wollten, müssten wir kein zusätzliches JavaScript schreiben.
// Reveal the "center" image
var centerImage = $("#image-4").show();
// Bind hovers to each column
$(".the_faces").each(function() {
$(this).on("mouseover", function() {
$("#image-" + $(this).attr("data-number")).show();
}).on("mouseout",function() {
$("#image-" + $(this).attr("data-number")).hide();
});
});
// Reset center image
$("#face-area").on("mouseleave", function() {
centerImage.show();
}).on("mouseenter", function() {
centerImage.hide();
});
Tada!
Check out this Pen!
Da haben Sie es! Jetzt haben Sie Ihr eigenes, aufsehenerregendes Modell. Nutzen Sie es, um Ihre eigenen Produkte zu präsentieren. Es gibt unzählige Anwendungsmöglichkeiten dafür. Lassen Sie mich wissen, was Sie sich einfallen lassen.
Hinweis des Herausgebers: Das wäre eine lustige Demo, um Touch-Unterstützung hinzuzufügen, nicht wahr? Folgen Sie einem Wisch oder so etwas.
Sehr nett Chris, ich liebe das einfache JavaScript, das alles zum Laufen bringt.
Es wäre cool, wenn wir Code hinzufügen könnten, um das mittlere Bild zu erkennen.
Netter Effekt.
Um das HTML zu vereinfachen, könnten die IDs und Inline-Stile auf die Bilder selbst angewendet werden, anstatt ein div um jedes zu benötigen. Diese divs sind meiner Meinung nach hier unnötige Markup.
Ich frage mich, ob Sie nicht auch etwas Kluges tun könnten, wie z. B. die Cursorposition über dem übergeordneten div zu verfolgen und basierend darauf, über welchen Bruchteil des Bildes sich die Maus befindet, zu ermitteln, welches Bild angezeigt werden soll. Gleiches Prinzip wie hier gezeigt, aber es könnte wieder die Entfernung von mehr leeren divs ermöglichen, die eigentlich nur zur visuellen Unterstützung dienen.
Ich habe meinen Vorschlag umgesetzt (sorry Chris, ich benutze JSFiddle >.<)
http://jsfiddle.net/dilapper/BQjBm/
Entfernt effektiv das gesamte Markup für Hover-Events und ermittelt das Segment des Bildes, über dem sich der Cursor befindet, und lädt das entsprechende Bild. Meine Variablennamen sind etwas fragwürdig, und ein Teil von mir fragt sich, ob es eine prägnantere Möglichkeit gibt, die Mathematik durchzuführen, aber es funktioniert trotzdem!
@Eduardo: Nur CSS, ziemlich cool
@David: http://jsfiddle.net/jsdev/X2y9f/2/
zwischengespeicherte jQuery-Objekte .., ID-Attribute nicht nötig, wenn nur sequenziell .. .eq() genutzt
Großartig.
Ich dachte, ich würde das mit einer etwas anderen Methode ausprobieren.
http://codepen.io/JTParrett/pen/AlEgF
Es funktioniert, aber in Chrome 26 flackert das Bild jedes Mal, wenn es sich ändert, was ziemlich unerwünscht ist.
Das tat es tatsächlich. Ich habe gerade ein einfaches Vorladen von Bildern hinzugefügt. Besser?
Ein weiterer Ansatz. Findet die Cursorposition, die auf das entsprechende Hintergrundbild angewendet wird: http://codepen.io/JTParrett/pen/bHqjp
Das*
Das ist besser. Jetzt müssen Sie die Bilder nur noch per AJAX vorladen.
Danke Kumpel :D
Ich habe gerade ein paar Updates am Pen vorgenommen. Können Sie mir sagen, ob das Laden besser erscheint und ob ich es richtig gemacht habe? Ich bin ziemlich neu bei AJAX-Sachen :P
Ich habe vor einiger Zeit ein ähnliches Problem gelöst.
Es wäre großartig, Ihre Meinungen zu hören (ich bin kein Profi)
http://codepen.io/ahoiii/pen/yraze
Das Touchswipe-Plugin (http://labs.rampinteractive.co.uk/touchSwipe/demos/) sollte eine touchzentrierte Benutzeroberfläche sehr gut ermöglichen.
Ich werde damit vielleicht etwas herumspielen.
Nettes Effekt. Ich habe nicht viel Zeit damit verbracht, aber es sieht so aus, als könnte es wahrscheinlich etwas aufgeräumter gestaltet werden, um weniger Markup zu verwenden. Auch das JavaScript kann etwas effizienter und besser lesbar sein und sollte $.data verwenden, um die data-Attribute zu erhalten.
Eine alternative Methode, um das „Flackerproblem“ in einigen Browsern zu vermeiden, ist die Verwendung von absoluter Positionierung und z-index zum Ein- und Ausblenden der Bilder.
http://codepen.io/anon/pen/IsBHG
Kompromiss: Diese Methode eignet sich am besten für kleine, leichte Bilder, da Sie warten müssen, bis die Bilder geladen sind.
Der einzige CSS-Ansatz
http://jsfiddle.net/coma/BZajk/11/
Das ist großartig, Mann!
Gefällt mir! Sehr gut. Semantisches Markup auch. Natürlich wird es wahrscheinlich nicht in IE8 oder darunter, oder Opera, oder Android-Browsern funktionieren… aber trotzdem ist es eine gute Lösung.
Gut gemacht.
Eduardo, deine ist etwa 100 Mal besser. Der Code in dieser Demo lehrt Leute, nicht wiederverwendbares JS mit überall fest codierten IDs zu schreiben, während Ihr Ansatz anpassbar und vielseitiger ist, gute Arbeit.
Wow! Danke Jungs! Das war mein erster Kommentar hier!
Das ist eine wohlverdiente Anerkennung.
Ich habe mich beim Lesen des Posts gefragt, ob das mit HTML & CSS allein gemacht werden könnte, und siehe da, Eduardo beweist, dass es das kann. Großartige Arbeit!
Das ist großartig! Ich würde JS gerne überall vermeiden, wo es geht.
Danke fürs Teilen.
Gute Arbeit, Eduardo. Mach weiter so! ;)
Flackert in Chrome, aber das funktioniert http://jsfiddle.net/coma/BZajk/11/
Ich liebe dieses Feedback! Welche anderen Verwendungsmöglichkeiten gibt es dafür?
Auch vielen Dank für all die Verbesserungen daran. Ich suche immer nach neuen und besseren Wegen, Dinge zu tun.
Ich bin mir nicht sicher, ob dies eine andere Verwendung ist (es ist eine radikale Änderung), aber das Erste, was mir einfiel, war der Ersatz von Karussells durch benutzergesteuerte Wechsel. In diesem Fall würde ich jedoch empfehlen, die „Auswahl“-Divs deutlich zu kennzeichnen, zu beschriften und das Bild nicht zu verdecken. Der Vorteil ist, dass dadurch die Frustration durch automatische Karussells vermieden würde.
Erstaunlicher Effekt…wenn wir ein transparentes GIF oder PNG mit dem gut platzierten Motiv und CSS3-Übergängen verwenden würden, könnten wir einen 3D-ähnlichen Effekt erzielen…saubere Sache!
Wie bereits auf Twitter diskutiert, kann dies durch die Verwendung semantischeren HTML erheblich verbessert werden und JavaScript das tun lassen, was es am besten kann – Dinge für uns berechnen – in diesem Fall die Mausposition und sehen, welches Bild entsprechend angezeigt werden soll. Ich arbeite gerade an einem Screencast, der die Hauptprobleme erklärt, aber hier ist eine reine Vanilla-Demo, die mit Tastatur, Maus und auf Touch-Geräten funktioniert (getestet auf Android in Firefox und Chrome) http://vanillawebdiet.com/demos/imageswivel/index.html . Das Flackerproblem ist auch verschwunden, dies war nicht nur ein Vorlastproblem, sondern auch viel zu viele Event-Handler und DOM-Interaktionen während der Mausbewegung.
Artikel fertig: http://christianheilmann.com/2013/05/17/giving-image-swivel-the-vanilla-web-diet-treatment/
Danke, aber ich denke, das könnte mit reinem HTML & CSS und ohne jQuery implementiert werden.
Cooler Effekt! Wäre eine großartige Anwendung für eine Schmuck- oder Skulpturengalerie. Danke!
Eduardo = Genie
Respekt an dich +1
Ich frage mich, ob das mit CSS-Übergängen geglättet werden könnte.
Wie Alex versprochen, hier ist ein langer Beitrag und ein 25-minütiges Screencast, der die Performance- und Wartungsprobleme des Demo-Codes erklärt und wie man dies ohne Bibliotheksabhängigkeit neu schreibt und Tastatur- und Touch-Unterstützung hat, während es vollständig wartbar ist, indem man das HTML ändert: http://christianheilmann.com/2013/05/17/giving-image-swivel-the-vanilla-web-diet-treatment/
Clevere Sache. Ich habe ähnliche Dinge schon früher ohne jQuery gesehen, mit normalen JavaScript-Funktionen, die beim onmouseover-Ereignis ausgelöst werden. Ich frage mich, wie es mit doppelt so vielen Bildern aussehen würde, für einen sanfteren Effekt. Vielleicht könnte dies besser durch Videomaterial anstelle von Standbildern erreicht werden, aus denen einzelne JPEG-Frames extrahiert werden könnten.