Der folgende Beitrag stammt von Joshua Bader. Joshua hat festgestellt, dass bestimmte 3D-Effekte im Web von einer Anpassung der Perspektive profitieren könnten, während die Webseite gescrollt wird. Ich überlasse es ihm, es zu erklären.
Leute lieben es, flache Dinge so erscheinen zu lassen, als wären sie dreidimensional. Es gibt zwei Möglichkeiten, diesen Effekt in einer 2D-Umgebung zu erzielen: Form und Bewegung.
Indem wir einer flachen Form das Aussehen von Kanten oder Seiten verleihen, können wir Schaltflächen oder andere Objekte so erscheinen lassen, als wären sie vom Bildschirm angehoben oder in ihn versenkt. Dies ist sogar hier auf CSS-Tricks zu sehen.

Der Bewegungseffekt ist etwas kniffliger. In einer dreidimensionalen Welt bewegen sich Objekte, die näher sind, schnell, während die weiter entfernten Objekte langsam sind. Je weiter ein Objekt entfernt ist, desto langsamer bewegt es sich. Das nennt man den Parallax-Effekt. Der Parallax-Effekt wird seit einigen Jahren an allen möglichen Orten eingesetzt.
Die erste Methode, Form, funktioniert, weil sie Dinge erscheinen lässt, als würden sie hervorstechen oder von Ihnen weg gedrückt werden. Die zweite Methode, Bewegung, funktioniert, weil sie Dinge so erscheinen lässt, als wären sie in Bezug zueinander positioniert. Aber was, wenn wir sie kombinieren würden? Ein Objekt, das in den Bildschirm eingesunken aussieht, wie ein Regal, und dessen Kanten schrumpfen und wachsen, unter Verwendung des Parallax-Effekts, wodurch das Objekt so erscheint, als wäre es wirklich in 3D-Raum.
Zuerst müssen wir etwas Markup auf unserer Seite hinzufügen und den Elementen, die wir beeinflussen möchten, die Klasse inset geben. Jedes Block-Level-Element ist in Ordnung. Hier ist ein einfaches Formular mit Eingabefeldern, auf die der Effekt angewendet wird.
<form>
<label>
First Name:
<input class="inset" type="text" placeholder="Enter First Name" />
</label>
<label>
Last Name:
<input class="inset" type="text" placeholder="Enter Last Name" />
</label>
<label>
Email Address:
<input class="inset" type="text" placeholder="Enter Email Address" />
</label>
<label>
Address:
<input class="inset" type="text" placeholder="Enter Address" />
</label>
<label>
Phone Number:
<input class="inset" type="text" placeholder="Enter Phone Number" />
</label>
</form>
Als nächstes müssen wir unsere inset-Elemente stylen. Indem wir dem Element leicht unterschiedliche farbige Rahmen geben, können wir dem Element die Illusion von Tiefe verleihen. Das liegt daran, dass die Verbindung zwischen den Rahmen ein Winkel ist und mit den unterschiedlichen Farben der Eindruck entsteht, als würde Licht auf verschiedene „Seiten“ eines 3D-Bereichs treffen. Das ist die von uns erwähnte „Form“-Methode.
.inset {
width: 100%;
box-sizing: border-box;
background: #f9f9f9;
border-style: solid;
border-width: 30px;
border-top-color: #e5e5e5;
border-right-color: #eee;
border-bottom-color: #e5e5e5;
border-left-color: #eee;
}
Nachdem die Form, die wir manipulieren wollen, gestylt ist, können wir etwas einfaches jQuery verwenden, um die ursprüngliche Rahmenbreite des Elements, die Fensterhöhe, die Scroll-Position, die Position des Zielelements auf dem Bildschirm zu ermitteln und diese Position in einen Prozentsatz für den oberen und unteren Rand umzuwandeln.
var origBorderWidth = parseInt($('.inset').css('border-top-width')),
win = $(window),
windowHeight = win.height();
$('.inset').each(function() {
var self = $(this),
scrollHeight = win.scrollTop(),
elementPosition = self.position(),
positionPercentTop = Math.round((elementPosition.top - scrollHeight) / windowHeight * 100);
positionPercentBottom = Math.round((elementPosition.top + self.outerHeight() - scrollHeight) / windowHeight * 100);
});
Sobald wir all diese Zahlen als Variablen haben, können wir die oberen und unteren Rahmenbreiten jedes Elements basierend auf seiner Position auf dem Bildschirm ändern.
var origBorderWidth = parseInt($('.inset').css('border-top-width')),
win = $(window),
windowHeight = win.height();
$('.inset').each(function() {
var self = $(this),
scrollHeight = win.scrollTop(),
elementPosition = self.position(),
positionPercentTop = Math.round((elementPosition.top - scrollHeight) / windowHeight * 100);
positionPercentBottom = Math.round((elementPosition.top + self.outerHeight() - scrollHeight) / windowHeight * 100);
self.css({
'border-top-width' : origBorderWidth - (origBorderWidth * (positionPercentTop / 100)) + 'px',
'border-bottom-width' : origBorderWidth * (positionPercentBottom / 100) + 'px'
});
});
Nun kommt der spaßige Teil – Neuberechnung der oberen und unteren Rahmenbreiten jedes Elements, während die Seite gescrollt wird. Dies gibt uns den gewünschten Parallax-Bewegungseffekt.
var origBorderWidth = parseInt($('.inset').css('border-top-width')),
win = $(window);
function set3D() {
var windowHeight = win.height();
$('.inset').each(function() {
var self = $(this),
scrollHeight = win.scrollTop(),
elementPosition = self.position(),
positionPercentTop = Math.round((elementPosition.top - scrollHeight) / windowHeight * 100);
positionPercentBottom = Math.round((elementPosition.top + self.outerHeight() - scrollHeight) / windowHeight * 100);
self.css({
'border-top-width' : origBorderWidth - (origBorderWidth * (positionPercentTop / 100)) + 'px',
'border-bottom-width' : origBorderWidth * (positionPercentBottom / 100) + 'px'
});
});
};
win.on('load scroll resize', function() {
set3D();
});
Da haben Sie es. Um den Effekt zu sehen, behalten Sie ein einzelnes Element im Auge, während es beim Scrollen auf und ab der Seite bewegt wird. Sie werden sehen, wie sich seine obere und untere Rahmenbreite je nach Position auf der Seite ändert. Es ist subtil, aber effektiv.
Check out this Pen!
Wirklich tolle Technik. Ich habe nie wirklich darüber nachgedacht, einen Parallax-Effekt auf diese Weise zu verwenden. Vielleicht wäre als „lustigere“ Anwendung davon ein Paar Augen auf einem Gemälde, das dem Benutzer folgt :P Gruselig!
Wirklich cool. Und es sieht auch in IE gut aus! :-) Danke
Ziemlich verdammt cool.
Kitschig für meinen Geschmack.
Ja, sieht toll aus!! In IE getestet, sieht auch toll aus! Danke für den Beitrag
Sieht großartig aus!
Aber ich sehe nicht, wo es in einer realen Kundenwebsite verwendet werden könnte.
Cool! Obwohl ich denke, dass Leute, die den Effekt nicht verstehen, denken werden: „Wow, die Textfelder sind jedes Mal kaputt, wenn ich scrolle!“
Wunderbarer Effekt! Ich bin kein großer Fan von diesen 3D-Elementen auf dieser Seite und bevorzuge flache Elemente in meinem Design, aber dieser Code würde auf einer Art 3D-Bücherregal fantastisch aussehen.
Ich habe nur eine Frage: In Ihrem Code „greifen“ Sie zweimal auf das Fensterelement zu, ohne es zwischenzuspeichern – wäre es nicht besser, es außerhalb des Funktionsblocks zwischenzuspeichern? Oder ist das kein großes Leistungsproblem, es jedes Mal (und zweimal) abzurufen?
Sie meinen so…
http://cdpn.io/xhzFC
Und ja, die Fensterhöhe kann außerhalb der jeweiligen Funktion festgelegt werden. Ich habe den Pen aktualisiert.
Ich habe das Fensterelement auch oben in eine Variable umgewandelt.
Ich denke, Sie sollten auch die Insets zwischenspeichern, anstatt sie bei jedem Scroll-Ereignis erneut auszuwählen
http://codepen.io/anon/pen/Ddhnz
Gute Idee.
Oh, und wenn man noch ein bisschen mehr herausholt – keine wirkliche Notwendigkeit, Math.round() zu verwenden, oder?
Ich mag es wirklich nicht, normalerweise schaue ich beim Scrollen immer an dieselbe Stelle der Webseite, und ich bin mir ziemlich sicher, dass die meisten Leute das tun. Daher ist der Effekt nicht wahrnehmbar, er fühlt sich sogar seltsam und fehlerhaft an :/
Übrigens wäre Eye-Tracking nutzlos, auch wenn Sie Ihre Augen bewegen, ändert sich der Parallax-Effekt nicht. Sie müssten stattdessen Head-Tracking verwenden. Wie das dritte Video: http://johnnylee.net/projects/wii/
@scarfacedeb
Hey, das ist gesunder Menschenverstand, Sie können es auf der Website Ihrer Kunden verwenden, um sie wertvoller, elegant gestaltet und stilvoller zu machen.
Hey Chris, die neue Outlook-E-Mail umbricht den Text nicht und macht das Lesen Ihres Feeds sehr schwierig. Könnten Sie eine CSS-Zeile dafür aufnehmen? Denn wenn man es Microsoft überlässt, wird es nie passieren.
In der „Redaktionellen Notiz“ funktioniert das Beispiel mit der Mausperspektive auf Codepin, aber nicht, wenn ich es in separate HTML-, CSS- und script.js-Dateien kopiere. Verwende denselben Browser (Chrome). Ich habe auch versucht, die Präfixe -webkit-perspective und -webkit-transform:rotate zu verwenden, aber die Seite wird nur als ein Haufen weißer Quadrate geladen, sodass nicht einmal die anfängliche Perspektive: 80px angezeigt wird, obwohl die Stile unter DevTools geladen werden. Wenn ich in DevTools nachschaue, sehe ich, wie sich -webkit-perspective-origin ändert, wenn ich die Maus bewege, aber die Seite selbst ändert sich nicht.
Weiß jemand, warum es auf Codepin funktionieren würde, aber nicht auf einer tatsächlichen HTML-Seite?
Danke
Ups, habe Codepen zweimal falsch geschrieben :-)
Schöne Idee, auch wenn ich denke, dass der Tiefeneffekt etwas zu stark ist, um visuell ansprechend zu sein.
Sehr leichter Code trotzdem, das ist nett. :)
Für einen weniger drastischen Effekt versuchen Sie, eine geringere Rahmenbreite zu verwenden.
Das ist ziemlich genial. Danke! Aber ich muss sagen, Sie verlassen sich auf JavaScript, um Elemente auf einer Seite zu stylen.
Als jemand, der versucht hat, diesen Effekt nur mit CSS zu erzielen, kann ich die Notwendigkeit von JavaScript hier anerkennen. Kudos!
Süßes Gimmick.
Hehe… das ist genial… vielen Dank
Das ist wirklich großartig und erstaunlich, besonders für Leute, die keine Zauberer im Erstellen solcher Effekte sind.
Ich brauchte 10 Minuten konzentrierte Anstrengung, um herauszufinden, worum es hier ging – aber jetzt verstehe ich es. Ich kann ziemlich stumpfsinnig sein, mache das aber durch Sarkasmus wett. Der Effekt ist hier fast zu subtil, aber ich sehe, wo dies für einige coole Web-Akrobatik verwendet werden könnte. Ab zu CodePen. Danke, Chris.
+brian
Es war ziemlich subtil, ich musste ein paar Mal scrollen, um es zu bemerken (oder besser gesagt, um es wirklich anzusehen ;) ) und für mich ist alles Subtile eine schöne Ergänzung zum Fähigkeiten-Set, könnte eines Tages nützlich sein, könnte aber auch nicht. Aber je mehr Beispiele für Parallax-Effekte, desto besser werden wir die Dynamik verstehen.
Es gibt einen kleinen Fehler – die Seitenhöhe ändert sich je nach Ihrer Position darin.
Um es zu sehen, scrollen Sie ganz nach unten und ziehen Sie dann den Scrollbar-Griff nach oben – Sie werden feststellen, dass der Griff kleiner wird und nicht mehr mit Ihrer Maus synchronisiert ist.
Es stellt sich heraus, dass, wenn ein Inset-Element außerhalb des Bildschirms ist und einer der Rahmen 0 Pixel hat, der andere (unten oder oben) unbegrenzt weiter wächst. Auf größeren Seiten wird dies ein ernstes Problem sein.
Ziemlich genial, aber die Verwendung von JavaScript macht es etwas mühsam.
Hallo, muss ich den gesamten Code auf meiner Webseite einfügen? HTML, JS und CSS? Danke
Super cool! Ich bin mir nicht sicher, ob ich ein Fan von Inset-Inhalten mit den Headern „außerhalb“ des Inset bin. Sieht ein wenig seltsam aus. Ich könnte mir definitiv einige Designkonzepte vorstellen, die dies auf coole Weise umsetzen. Ich denke an sanftes automatisches Scrollen von Punkt A zu Punkt B der Seite. Der Effekt sieht viel besser aus, wenn man mit dem Scrollleisten-Griff anstatt mit dem Mausrad schrubbt.
Danke für das Teilen!! Das Gute ist, dass es auch in IE8 funktioniert
Getestet und ausprobiert in IE und FF. Funktioniert super. Das ist wirklich genial. Danke