Heim > Web-Frontend > CSS-Tutorial > Hauptteil

So erzielen Sie den Parallaxeneffekt eines APPLE TV-Posters basierend auf CSS3 und jQuery

不言
Freigeben: 2018-06-20 15:30:43
Original
1322 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich der Parallaxeneffekt des APPLE TV-Posters vorgestellt, der auf jQuery und CSS3 basiert. Freunde, die ihn benötigen, können sich auf

Verwenden Sie CSS und jQuery, um ihn zu implementieren, und versuchen Sie, den gleichen Effekt wie der Originaleffekt zu erzielen .

In diesem Tutorial verwende ich CSS, HTML und jQuery, um einen ungefähren Apple TV-Parallaxeneffekt zu erzeugen. Wenn Sie dies lesen, gehe ich davon aus, dass Sie mit dem oben Gesagten vertraut sind Drei Techniken.

Beginnen wir ohne weitere Umschweife mit dem ersten Teil.

HTML-Seite

Unsere Seitenstruktur ist wie folgt:

<p class="poster">
 <p class="shine"></p>
 <p class="layer-1"></p>
 <p class="layer-2"></p>
 <p class="layer-3"></p>
 <p class="layer-4"></p>
 <p class="layer-5"></p>
</p>
Nach dem Login kopieren

Zuallererst: Wir brauchen A p mit der Stilklasse .poster enthält 5 Ebenen p anderer Stile. Auf diese fünf Schichten p gibt es einen Glanz p, der für etwas Glanz sorgt.

CSS-Teil

Fügen Sie zunächst den folgenden Code hinzu, um sicherzustellen, dass die Höhe des Hauptteils der Webseite der gesamten Seitenhöhe entspricht:

body, html { height: 100%; min-height: 100%; }
Nach dem Login kopieren

Geben Sie dem Körper einige Hintergrundverlaufsfarben:

body { background: linear-gradient(to bottom, #f6f7fc 0%,#d5e1e8 40%); }
Nach dem Login kopieren

Um dem .Poster ein 3D zu verleihen Rotationseffekt: Der übergeordnete Container muss die Perspektive und den Transformationseffekt festlegen. Wie wir sehen können, ist der übergeordnete Container von p der Körper selbst. Fügen Sie daher den folgenden CSS-Code hinzu:

body {
  background: linear-gradient(to bottom, #f6f7fc 0%,#d5e1e8 40%);
  transform-style: preserve-3d;
  transform: perspective(800px);
}
Nach dem Login kopieren

Stilen und formatieren Sie nun die Karte so, dass sie passt passt auf die Seite Mitte, fügen Sie einige abgerundete Ecken und Schatteneffekte hinzu:

.poster {
  width: 320px;
  height: 500px;
  position: absolute;
  top: 50%; left: 50%;
  margin: -250px 0 0 -160px;
  border-radius: 5px;
  box-shadow: 0 45px 100px rgba(0, 0, 0, 0.4);
  overflow:hidden;
}
Nach dem Login kopieren

Um das Poster zu zentrieren, müssen Sie den Positionswert auf absolut setzen, oben: 50 %, „links: 50 %“, der obere Randwert ist eine negative Zahl, die der halben Höhe von p entspricht, und der Randwert links ist eine negative Zahl, die der halben Breite von p entspricht. Beachten Sie, dass die Mitte des Posters auch die Mitte der gesamten Seite ist.

Schatteneffekt

Wir können den folgenden CSS-Selektor verwenden, um alle Ebenen auszuwählen:

p[class *= &#39;layer-&#39;]
Nach dem Login kopieren

.poster wurde entworfen, mal sehen, wie es wirkt.

CSS wählt also alle p aus, die „layer-“ im Klassennamen enthalten.

Setzen Sie nun den Positionswert aller Ebenen auf „absolut“, den Hintergrundwiederholungswert auf „keine Wiederholung“, die Hintergrundposition auf „oben links“ und die Größe des Ebenenhintergrunds auf 100 % Breite und automatische Höhe .

p[class*="layer-"] {
  position: absolute;
  top: -10px; left: -10px;
  right: -10px; bottom: -10px;
  background-size: 100% auto;
  background-repeat: no-repeat;
  background-position: 0 0;
  transition:0.1s;
}
Nach dem Login kopieren

Beachten Sie, dass die Werte von oben, links, rechts und unten alle -10 Pixel betragen. Der Zweck besteht darin, die Größe der Ebene festzulegen 20 Pixel größer als das Poster, sodass Sie bei der Inspektion der Ebene den Rand der Ebene nicht sehen können.

Im Folgenden wird jeder Ebene ein Hintergrund hinzugefügt:

.layer-1 {
  background-image: url(&#39;http://designmodo.com/demo/apple-tv-parallax/images/1.png&#39;);
}
.layer-2 {
  background-image: url(&#39;http://designmodo.com/demo/apple-tv-parallax/images/2.png&#39;);
}
.layer-3 {
  top: 0; bottom: 0;
  left: 0; right: 0;
  background-image: url(&#39;http://designmodo.com/demo/apple-tv-parallax/images/3.png&#39;);
}
.layer-4 {
  background-image: url(&#39;http://designmodo.com/demo/apple-tv-parallax/images/4.png&#39;);
}
.layer-5 {
  background-image: url(&#39;http://designmodo.com/demo/apple-tv-parallax/images/5.png&#39;);
}
Nach dem Login kopieren

Im Layer-3-Teil wird die Ebene nicht verschoben, also Die Größe muss nicht zu groß sein. Groß.

Vervollständigen Sie den statischen Effekt

JavaScript-Teil

Bevor Sie beginnen, stellen Sie sicher, dass Sie dies getan haben Einführung der jQuery-Bibliothek, andernfalls wird ein Fehler gemeldet.

Die Logik des Parallaxeneffekts ist wie folgt: Immer wenn sich die Maus bewegt, ändern sich die Transformationseigenschaften „translateY“, „rotate“, „rotateY“ von .poster entsprechend der Position des Cursors. Je weiter der Cursor von der oberen linken Ecke der Seite entfernt ist, desto deutlicher wird der Animationseffekt.

Die Formel ähnelt dieser: offsetX=0,5 – die Position/Breite des Cursors vom oberen Rand der Seite.

Um für jedes Element einen anderen Wert zu erhalten, multiplizieren Sie den von jeder Cursorformel zurückgegebenen Wert mit einem benutzerdefinierten Wert, geben Sie den HTML-Code zurück und fügen Sie data-offset zu jedem Ebenenelement hinzu, das Animationseigenschaften haben soll von Zahlen.

<p data-offset="15" class="poster">
  <p class="shine"></p>
  <p data-offset="-2" class="layer-1"></p>
  <p class="layer-2"></p>
  <p data-offset="1" class="layer-3"></p>
  <p data-offset="3" class="layer-4"></p>
  <p data-offset="10" class="layer-5"></p>
</p>
Nach dem Login kopieren

Die Regeln für jede .layer sind die gleichen, aber wir wenden sie auf die Eigenschaften TranslateY und TranslateX an.

Je größer der Wert des Datenoffset-Attributs ist, desto offensichtlicher wird der Animationseffekt sein. Sie können diese Werte ändern, um ihn zu erleben.

Für die Lesbarkeit des Codes weisen wir .poster der Variablen $poster in JavaScript zu, .shine der Variablen $shine, die Variable $layer repräsentiert alle Ebenen und w und h repräsentieren die Breite und Höhe der Seite .

var $poster = $(&#39;.poster&#39;),
$shine = $(&#39;.shine&#39;),
$layer = $(&#39;p[class*="layer-"]&#39;);
Nach dem Login kopieren

Jetzt müssen wir das Problem betrachten, die Cursorposition zu ermitteln, wenn sich der Cursor bewegt. Um dies zu erreichen, können wir das Mousemove-Ereignis von $(window) verwenden. Dieses Ereignis gibt ein JavaScript-Objekt zurück, das die von uns benötigten Positionsinformationen und einige andere Variablen enthält, die wir noch nicht benötigen.

$(window).on(&#39;mousemove&#39;, function(e) {
  var w=e.currentTarget.innerWidth,h=e.currentTarget.innerHeight;
  var offsetX = 0.5 - e.pageX / w, /* where e.pageX is our cursor X coordinate */
  offsetY = 0.5 - e.pageY / h,
  offsetPoster = $poster.data(&#39;offset&#39;), /* custom value for animation depth */
  transformPoster = &#39;translateY(&#39; + -offsetX * offsetPoster + &#39;px) rotateX(&#39; + (-offsetY * offsetPoster) + &#39;deg) rotateY(&#39; + (offsetX * (offsetPoster * 2)) + &#39;deg)&#39;;
  /* apply transform to $poster */
  $poster.css(&#39;transform&#39;, transformPoster);
  /* parallax foreach layer */
  /* loop thought each layer */
  /* get custom parallax value */
  /* apply transform */
  $layer.each(function() {
    var $this = $(this);
    var offsetLayer = $this.data(&#39;offset&#39;) || 0; /* get custom parallax value, if element docent have data-offset, then its 0 */
    var transformLayer = &#39;translateX(&#39; + offsetX * offsetLayer + &#39;px) translateY(&#39; + offsetY * offsetLayer + &#39;px)&#39;;
    $this.css(&#39;transform&#39;, transformLayer);
  });
});
Nach dem Login kopieren

Der nächste Schritt besteht darin, die oben erläuterte Formel zu verwenden, um die Werte von offsetY und offsetX zu berechnen und dann den Parallaxeneffekt auf .posert und anzuwenden jede Posterschicht.

Sehr cool, jetzt haben wir ein Widget mit Parallaxeneffekt.

Im Wesentlichen abgeschlossen

Aber es ist noch nicht fertig, der Hochglanzteil auf dem Poster ist noch nicht festgelegt

Jetzt gehen Sie zurück zu Geben Sie den CSS-Teil ein und geben Sie .shine p Absolute Positionierung, fügen Sie einen Farbverlaufseffekt hinzu und setzen Sie den Z-Index-Attributwert auf 100, sodass er über allen Ebenen liegt.

.shine {
  position: absolute;
  top: 0; left: 0; right: 0; bottom: 0;
  background: linear-gradient(90deg, rgba(255,255,255,.5) 0%,rgba(255,255,255,0) 60%);
  z-index: 100;
}
Nach dem Login kopieren

Auf dem Poster befindet sich bereits eine schöne Glitzerschicht, aber um einen realistischeren Effekt zu erzielen, sollte sich die Beleuchtung ändern, wenn sich der Cursor bewegt.

更逼真些

我们怎么做呢?可能你还记得无聊的初三数学课,当你想着你在学一些你从来都不会用到的公式的时候,我们现在就用到了。

所以,倾斜的角度应该等于光标与海报中心形成三角形的角度的相反值。(还记得吧,海报的中心就是整个页面的中心啊,也就是页面宽度和高度的二分之一)

角度示意图

首先,找到光标与页面中心形成的三角形的直角边,光标与中心连线后作出一个直角三角形。

然后用 Math.atan2() 函数得到中心点的角度值。注意这个函数的返回值使用弧度值来表示的,所以我们得在CSS中转换成角的度数,用以下公式:

弧度值*180/pi = 角度值

var $poster = $(&#39;.poster&#39;);
  var $shine = $(&#39;.shine&#39;);
  var $layer = $(&#39;p[class *= "layer-"]&#39;);
  $poster.data("offset",15);
  $(window).on(&#39;mousemove&#39;, function(e) {
    var w=e.currentTarget.innerWidth,h=e.currentTarget.innerHeight;
    var offsetX = 0.5 - e.pageX / w, /* where e.pageX is our cursor X coordinate */
    offsetY = 0.5 - e.pageY / h,
    offsetPoster = $poster.data(&#39;offset&#39;), /* custom value for animation depth */
    transformPoster = &#39;translateY(&#39; + -offsetX * offsetPoster + &#39;px) rotateX(&#39; + (-offsetY * offsetPoster) + &#39;deg) rotateY(&#39; + (offsetX * (offsetPoster * 2)) + &#39;deg)&#39;;
    dy = e.pageY - h / 2,
    dx = e.pageX - w / 2,
    theta = Math.atan2(dy,dx), /* get angle in radians */
    angle = theta * 180 / Math.PI; /* convert rad in degrees */
    /* apply transform to $poster */
    $poster.css(&#39;transform&#39;, transformPoster);
    /* parallax foreach layer */
    /* loop thought each layer */
    /* get custom parallax value */
    /* apply transform */
    $layer.each(function() {
      var $this = $(this);
      var offsetLayer = $this.data(&#39;offset&#39;) || 0; /* get custom parallax value, if element docent have data-offset, then its 0 */
      var transformLayer = &#39;translateX(&#39; + offsetX * offsetLayer + &#39;px) translateY(&#39; + offsetY * offsetLayer + &#39;px)&#39;;
      $this.css(&#39;transform&#39;, transformLayer);
    });
  });
Nach dem Login kopieren

你会发现角度值的范围是从-180到180度,以下代码修复这个问题让角度值从0-360度:

if (angle < 0) {
  angle = angle + 360;
}
Nach dem Login kopieren

现在角度有了,就可以随着光标的移动来动态改变渐变颜色的角度值:

$shine.css(&#39;background&#39;, &#39;linear-gradient(&#39; + (angle - 90) + &#39;deg, rgba(255,255,255,&#39; + e.pageY / h + &#39;) 0%,rgba(255,255,255,0) 80%)&#39;);
Nach dem Login kopieren

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

利用css3制作煽动翅膀的蝴蝶的代码

使用css3和jQuery实现文字跟随鼠标的上下抖动

Das obige ist der detaillierte Inhalt vonSo erzielen Sie den Parallaxeneffekt eines APPLE TV-Posters basierend auf CSS3 und jQuery. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage