Der folgende Text ist ein Gastbeitrag von Alexander Futekov. Kürzlich haben wir einen Artikel von Joshua Bader veröffentlicht, in dem ein 3D-Inset-Look beim Scrollen der Seite angepasst wurde, um eine realistischere Interaktion zu erzielen. Dies ist ähnlich, nur dass Alexander einen extrudierten Look auf Buttons verwendet und eine völlig andere Technik einsetzt.
Die Einführung von CSS3 führte zu einer Explosion schöner und interessanter Buttons, die mit Verläufen, Schatten und Rändern gestaltet wurden – oft, um einen 3D-Effekt zu erzielen. Das Problem bei solchen 3D-Buttons ist eine statische Perspektive. Die 3D-Wirkung ist nicht immer sehr überzeugend, wenn man nur die Vorderseite und vielleicht ein oder zwei Kanten sieht – selbst wenn sich die Seite bewegt und sich die Position des Buttons auf der Seite verschiebt.
Glücklicherweise können wir mit Hilfe von 3D-Transformationen einen realistischen Perspektiveneffekt erzielen, um die Seiten der Buttons anzupassen. Dies können wir tun, ohne das vorhandene HTML zu ändern, indem wir Pseudo-Elemente für die Seiten verwenden. Dann bringen wir den Button selbst mit translateZ nach vorne.
Bevor wir beginnen, müssen wir zunächst ein Problem lösen. Der Perspektivenursprung ist normalerweise in der vertikalen und horizontalen Mitte des Elements eingestellt. Das bedeutet, wenn wir ihn basierend auf dem Body einstellen, erhalten wir etwas wie das hier:

Indem wir die Höhe des Bodys auf 100% setzen, können wir den Perspektivenursprung wie folgt auf die Mitte des Viewports setzen:

html {
height: 100%;
overflow: hidden;
}
body {
height: 100%;
overflow-y: scroll;
}
Für einen einfachen <button> sieht das CSS so aus:
button {
position: relative;
display: inline-block;
padding: 4px 16px;
border: 0;
background-color: blue;
background-image: radial-gradient(ellipse at top, rgba(255, 255, 255, 0.15) 50%, transparent);
color: #222;
transform-style: preserve-3d;
transform: translateZ(20px);
}
button::before {
content: "";
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
transform-origin: 0% 0%;
transform: rotateX(-90deg);
}
button::after {
content: "";
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
transform-origin: 0% 0%;
transform: rotateY(90deg);
}
Aber wie bekommen wir 4 Seiten für jeden Button mit nur 2 Pseudo-Elementen? JavaScript! Wenn wir das Hinzufügen zusätzlicher Wrapper zu jedem Button vermeiden wollen (was wir tun), benötigen wir Skripte, um die obere Seite nach unten und die linke Seite nach rechts zu verschieben, je nachdem, wo sich der Button relativ zum Viewport des Benutzers befindet. Das Skript zum Wechseln der oberen mit der unteren Seite des Buttons ist ziemlich geradlinig – das Ändern von oben/unten oder rechts/links Seiten tritt nur beim Laden und beim Ändern der Größe auf, und oben/unten nur beim Scrollen auf.
$(window).on("load resize", function() {
topHalf();
leftHalf();
});
$("body").scroll(function() {
topHalf();
});
function topHalf() {
$("button").each(function() {
var self = $(this),
offTop = self.offset().top,
scrTop = $(window).scrollTop(),
halfWindowHeight = ($(window).height())/2;
self.toggleClass("top-half", (offTop - scrTop) < halfWindowHeight);
});
}
function leftHalf() {
$("button").each(function() {
var self = $(this),
offLeft = self.offset().left,
halfWindowWidth = ($(window).width())/2;
self.toggleClass("left-half", offLeft < halfWindowWidth);
});
}
Hinweis des Herausgebers: Dies könnte sicherlich etwas umstrukturiert werden, um Struktur zu verleihen und Effizienz zu gewinnen. Fühlen Sie sich frei, den folgenden Pen zu forken und es zu versuchen!
Einige neue Klassen helfen bei der Positionierung der Seiten:
button.top-half::before {
top: auto;
bottom: 0;
transform-origin: 100% 100%;
transform: rotateX(90deg);
}
button.left-half::after {
left: auto;
right: 0;
transform-origin: 100% 100%;
transform: rotateY(-90deg);
}
Beachten Sie, dass Sie, wenn Sie Klassen zum Floaten der Buttons verwenden (z. B. .pull-left und .pull-right wie in Twitter Bootstrap), wissen, wo jeder Button horizontal positioniert ist und somit die Hälfte des JavaScript-Codes überspringen können.
Hier ist eine stilisierte Demo zum Ausprobieren. Sie hat einen animierten Push-Down-Effekt für die Buttons und enthält einige andere 3D-Elemente, die kein JavaScript erfordern.
Check out this Pen!
Eine ähnliche Technik kann auch verwendet werden, um den 3D Inset Parallax-Effekt auf eine sehr grobe Weise zu replizieren. Es ist etwas komplexer, erfordert aber kein JavaScript.
Check out this Pen!
Funktioniert nicht im Chrome Browser
Ich benutze Chrome und es funktioniert bei mir einwandfrei. Vielleicht könnten Sie spezifischer sein oder einen Screencast (http://www.screenr.com/) von Ihnen erstellen, der es zeigt, um das "Nichtfunktionieren" zu demonstrieren.
Funktioniert bei mir in Chrome! Habe das schon vor einer Weile auf CodePen gesehen :-) Super Arbeit, Chris!
Funktioniert in Chrome – es ist allerdings sehr subtil, ich habe es beim ersten Mal nicht bemerkt...
Versuch mal ChromeFrame, vielleicht hilft das.
Bei mir funktioniert es auch nicht! Chrome Version 27.0.1453.94 m (aktuell) auf einem Win XP System. Hier ist ein Screenshot: http://imgur.com/dW7RjZg
Bei mir auch nicht funktionierend in Chrome.
Version: 27.0.1453.94 m
Betriebssystem: Win XP
SZRimaging: Es ist ein Problem mit der Hardwarebeschleunigung, die auf WinXP NICHT verfügbar ist! Das ist wohl der Preis, den wir für das Leben in der Vergangenheit zahlen... LOL
D Tondro: Nicht wirklich in der Vergangenheit feststeckend, nur auf einem Firmenrechner feststeckend... Habe es nicht auf meinem Win 8 Laptop getestet....
Juhu für langsame Übernahmeraten in der Unternehmenskultur!
Entschuldige Chris... Ich habe einen Screenshot geschickt, aber viele andere Nutzer haben das bereits getan und die Nichtfunktion in Chrome gemeldet ;-)
Funktioniert überhaupt nicht in Chrome 30
Genial!!! Ich werde es anwenden!
Sehr cool. Zuerst dachte ich, die Perspektive im zweiten Beispiel wäre falsch, bis ich merkte, dass sie nach innen versetzt ist, anstatt hervorzurryehend. Sie ist klarer und sieht noch cooler aus mit
$z-offset: 320px; body { perspective: 1000px; }Bei mir funktioniert es auch nicht! Chrome Version 27.0.1453.94 m (aktuell) auf einem Win XP System. Hier ist ein Screenshot: http://imgur.com/dW7RjZg
… und hier ist der vorherige Artikel, der auch nicht funktioniert (3D Inset)! http://i.imgur.com/HuvuDcx.jpg
Es scheint, als hätte Chrome einige Probleme mit 3D-CSS unter XP, wahrscheinlich aufgrund fehlender Hardwarebeschleunigung.
Überprüfen Sie diese Adresse "chrome://gpu" – dort steht am Anfang, ob 3D-CSS überhaupt verfügbar ist.
Codepen für Demos zu verwenden ist großartig… danke nochmals für dieses wunderbare Tutorial…
Können Sie mir ein detailliertes Tutorial zum Erstellen von Logo-Bildern mit CSS3 geben? Danke!
Mir gefällt es. Sehr elegant, aber es fühlte sich so an, als ob die 3D-Seiten verschwinden sollten, wenn man die Buttons drückt, fast so, als ob man den Button nach innen drückt. Ich habe die CodePen-Demo geforkt und das ist, was ich mir ausgedacht habe. http://codepen.io/KenCorbettJr/pen/hnkmv
Fantastischer Fork, Ken! Die Änderung lässt es sich wie ein echtes Knopfdruck anfühlen – skeuo3dparallax ist der Gewinner!
Funktioniert bei mir nicht auf Vista Business mit Chrome Beta Channel. Habe "chrome://gpu" überprüft, wie vorgeschlagen, und die einzigen Elemente, die nicht hardwarebeschleunigt sind, sind Panel Fitting, Video Decode und Rasterization.
Funktioniert auch nicht in Chrome 27.0.1453.93 unter Linux: http://www.screenr.com/3n7H
Ja! Gleiches Problem…
Neuestes Chrome auf einem Mac – Funktioniert bei mir nicht.
Safari konnte das CSS vom Pen scheinbar nicht laden – Sieht interessant aus: Imgur
Firefox – Sieht fantastisch aus!
Es ist subtil, aber es funktioniert bei mir auf Mac mit Chrome 27.0.1453.93.
Entschuldigung,
ja, hier ist ein Screenshot auf CHrome
http://awesomescreenshot.com/0251c3f660
Der Screenshot ist nur 3 Tage gültig...
Funktioniert gut in Firefox.
Konfiguration: Version 25.0.1364.160 Ubuntu 12.04 (25.0.1364.160-0ubuntu0.12.04.1)
Sie können es mit einem einfachen
borderimplementieren.Hallo Leute, es sieht bei mir alles gut aus, aber wenn ich das Ganze kopiere, zeigen Safari und Chrome nur die Vorder-, Ober- und linke Seite des Buttons. Warum? Bitte helfen Sie.
Sieht nach einer vielversprechenden CSS-Button-Technik aus, muss aber warten, bis die Browserkompatibilitätsprobleme gelöst sind.
Parallax ist der aufkommende Trend bei CSS3-Buttons.
Das ist genial. Funktioniert bei mir in Chrome 27.0.1453.94 m einwandfrei.
Respekt Chris, toller Fund.
Genial, sie erinnern mich an Kisten in Super Mario. Ich hätte erwartet, dass eine Münze beim Klicken herausspringt.
Für all die Leute, die Probleme haben, dies zum Laufen zu bringen, haben Sie wahrscheinlich eine integrierte Grafikkarte oder einen nicht unterstützten Grafikbeschleuniger.
Ein guter Test dafür ist, ob Sie Folgendes korrekt sehen können. (Es sollte wie ein Ring oder ein Würfel aussehen, nicht wie ein flaches, rotierendes Sprite)
https://www.webkit.org/blog-files/3d-transforms/morphing-cubes.html
Diese Seite könnte helfen, das Problem zu lösen
http://stackoverflow.com/questions/7455502/webkit-backface-visibility-not-working/14759299
Jetzt ist das cool. Ich muss einen Grund finden, diese in mein nächstes Design einzubauen.