搜尋
首頁web前端js教程jQuery和CSS3實作APPLE TV海報視差效果實例分享

本文主要介紹了基於jQuery和CSS3實現APPLE TV海報視差效果,需要的朋友可以參考下,希望能幫助到大家能用jQuery和CSS3做出一個APPLE TV海報視差效果。

用CSS和jQuery來實現它,盡量看起來和原始效果一樣。

本教學裡,我將使用CSS,HTML和jQuery來創建一個近似Apple TV視差效果,如果你正在閱讀,我假設你對上述三種技術都有基本的了解。

廢話不多說,開始第一部分。

HTML頁面

我們的頁面結構像下面這樣:

<p>
 </p><p></p>
 <p></p>
 <p></p>
 <p></p>
 <p></p>
 <p></p>

#首先,需要一個樣式類別為.poster 的p ,在這個p 包含5個其他樣式的層p。在這五個層 p 上有一個 shine p來添加一些閃光效果。

CSS部分

首先,加入以下程式碼確保網頁body 部分的高度是整個頁面高度:

body, html { height: 100%; min-height: 100%; }

再給body 部分一些背景漸層顏色:

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

為了讓.poster 有3D旋轉的效果,父容器需要設定透視和變換效果。如我們所見,p的父容器就是body 本身,所以加入以下CSS程式碼:

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

現在給卡片設定樣式跟大小,讓它在頁面居中,加入一些圓角跟陰影效果:

.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;
}

為了讓海報居中,需要設定position 的值為absolute,top:50% , 'left:50%', 上部的margin 值是p 高度的一半的負數,左邊的margin 值是p 寬度的一半的負數。需要記住的是 .poster 的中心也是整個頁面的中心。

陰影效果

我們可以用以下的CSS選擇器來選擇所有的圖層:

p[class *= 'layer-']

.poster 已經設計好了,來看看效果。

所以,CSS選擇了所有class類別名稱裡含有「layer-」的 p。

現在,設定所有的層的 position 值是 absolute, background-repeat 值為 no-repeat, background-position 為 top left, 層背景的大小為100%寬度和自動高度。

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;
}

注意到top,left,right,bottom 的值都是-10px,目的是讓層的大小比poster 的大20px,這樣在各個層進行視察效果的時候就不會看到層的邊緣部分了。

以下是為每個圖層新增背景:

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

在 layer-3 部分, 圖層不會移動,所以尺寸就不用太大了。

完成靜態效果

JavaScript部分

#在開始之前,請確保已經引入了jQuery庫,否則會報錯的。

視差效果的邏輯是這樣的,每當滑鼠移動的時候,根據遊標的位置,.poster 的 transforms:translateY,rotate,rotateY 屬性將會改變。遊標距離頁面左上角越遠,動畫的效果越明顯。

公式就類似這樣的:offsetX=0.5-遊標距離頁面頂端的位置/寬度。

為了每個元素的值都不一樣,將給每一個遊標公式傳回的值乘以一個自訂的值,傳回HTML的程式碼給每個會有動畫的層元素新增data-offset =數字的屬性。

<p>
  </p><p></p>
  <p></p>
  <p></p>
  <p></p>
  <p></p>
  <p></p>

每一個 .layers 的規則都相同,但我們給他們應用到 translateY 和 translateX 屬性上。

data-offset 屬性的值越大,動畫的效果越明顯,可以改變這些值體驗下。

為了程式碼可讀性,我們在JavaScript裡給 .poster 賦值給 $poster 變量,.shine 給 $shine 變量,$layer 變數代表所有層,w,h代表頁面的寬度和高度。

var $poster = $('.poster'),
$shine = $('.shine'),
$layer = $('p[class*="layer-"]');

現在,需要考慮下當遊標移動的時候取得到遊標位置的問題。我們可以用 $(window) 的 mousemove 事件來實現,這個事件會返回一個JavaScript對象,含有我們需要的位置資訊和其他一些我們暫時還用不到的變數。

$(window).on('mousemove', 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('offset'), /* custom value for animation depth */
  transformPoster = 'translateY(' + -offsetX * offsetPoster + 'px) rotateX(' + (-offsetY * offsetPoster) + 'deg) rotateY(' + (offsetX * (offsetPoster * 2)) + 'deg)';
  /* apply transform to $poster */
  $poster.css('transform', transformPoster);
  /* parallax foreach layer */
  /* loop thought each layer */
  /* get custom parallax value */
  /* apply transform */
  $layer.each(function() {
    var $this = $(this);
    var offsetLayer = $this.data('offset') || 0; /* get custom parallax value, if element docent have data-offset, then its 0 */
    var transformLayer = 'translateX(' + offsetX * offsetLayer + 'px) translateY(' + offsetY * offsetLayer + 'px)';
    $this.css('transform', transformLayer);
  });
});

下一步,就是用上面解釋的公式來計算offsetY和offsetX的值,然後就是把視差效果應用到.posert和每一個海報層。

非常酷啊,現在我們就有了一個有視差效果的小部件了。

基本上完成

但是還沒完,海報上的光澤部分還沒設定

現在回到CSS部分,給.shine p 絕對定位,增加一個漸層顏色效果,設定z-index屬性值為100,讓它在所有圖層的上方。

.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;
}

已經有了一個漂亮的閃光層在海報上,但是為了達到更逼真的效果,光照應該會隨著遊標的移動而改變。

更寫寫

我們怎麼做呢?可能你還記得無聊的初三數學課,當你想著你在學一些你從來都不會用到的公式的時候,我們現在就用到了。

所以,傾斜的角度應該等於遊標與海報中心形成三角形的角度的相反值。 (還記得吧,海報的中心就是整個頁面的中心啊,也就是頁面寬度和高度的二分之一)

角度示意图

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

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

弧度值*180/pi = 角度值

var $poster = $('.poster');
  var $shine = $('.shine');
  var $layer = $('p[class *= "layer-"]');
  $poster.data("offset",15);
  $(window).on('mousemove', 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('offset'), /* custom value for animation depth */
    transformPoster = 'translateY(' + -offsetX * offsetPoster + 'px) rotateX(' + (-offsetY * offsetPoster) + 'deg) rotateY(' + (offsetX * (offsetPoster * 2)) + 'deg)';
    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('transform', transformPoster);
    /* parallax foreach layer */
    /* loop thought each layer */
    /* get custom parallax value */
    /* apply transform */
    $layer.each(function() {
      var $this = $(this);
      var offsetLayer = $this.data('offset') || 0; /* get custom parallax value, if element docent have data-offset, then its 0 */
      var transformLayer = 'translateX(' + offsetX * offsetLayer + 'px) translateY(' + offsetY * offsetLayer + 'px)';
      $this.css('transform', transformLayer);
    });
  });

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

if (angle <p>现在角度有了,就可以随着光标的移动来动态改变渐变颜色的角度值:</p><pre class="brush:php;toolbar:false">$shine.css('background', 'linear-gradient(' + (angle - 90) + 'deg, rgba(255,255,255,' + e.pageY / h + ') 0%,rgba(255,255,255,0) 80%)');

大家学会了吗?赶紧动手尝试一下吧。

相关推荐:

分享一个用canvas合成海报图片的移动端项目

制作动态视觉差背景(h5)的方法

关于8 个 3D 视觉效果的 HTML5 动画图文欣赏

以上是jQuery和CSS3實作APPLE TV海報視差效果實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python還是JavaScript更好?Python還是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

如何安裝JavaScript?如何安裝JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器