搜尋
首頁web前端css教學如何使用CSS和Vanilla.js實現展示蘋果設備的互動動畫(附原始碼)

這篇文章帶給大家的內容是關於如何用CSS和Vanilla.js實現展示蘋果設備的交互動畫(附源碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

效果預覽

如何使用CSS和Vanilla.js實現展示蘋果設備的互動動畫(附原始碼)

原始碼下載

https://github.com/comehop​​e/front-end-daily -challenges

程式碼解讀

定義dom,包含5 個子元素,分別代表iphone, mini, ipad, macbook, imac 這5 種裝置:

<div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
</div>

「居中顯示:

body {
    margin: 0;
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: #aaa;
}

設定容器中子元素的佈局方式:

.container {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
}

設定裝置的共有屬性,線性漸層圖案將作為螢幕的背景:

.device {
    box-sizing: border-box;
    position: relative;
    display: flex;
    justify-content: center;
    background: linear-gradient(120deg, #ddd 30%, #ccc 30%);
}

.device::before,
.device::after {
    content: '';
    position: absolute;
}

iphone, mini, ipad的造型相似,都有頂部相機、感應器開口和底部按鈕,所以這些共有屬性可以一起設置,用::before 偽元素畫出頂部細節,::after 偽元素畫出底部按鈕:

.iphone::before,
.mini::before,
.ipad::before {
    width: 2px;
    height: 2px;
    border-style: solid;
    border-color: #a5adbe;
    border-width: 0 12px 0 2px;
}

.iphone::after,
.mini::after,
.ipad::after {
    width: 8px;
    height: 8px;
    background-color: white;
    border-radius: 50%;
}

接下來逐一畫出設備。先畫出iphone 的輪廓:

.iphone {
    width: 59px;
    height: 124px;
    border: #484f5e solid;
    border-width: 18px 4px;
    border-radius: 6px;
}

定位iphone 的頂部和底部細節:

.iphone::before {
    top: -10px;
}

.iphone::after {
    bottom: -13px;
}

類似地,畫出mini:

.mini {
    width: 93px;
    height: 138px;
    border: #484f5e solid;
    border-width: 14px 5px;
    border-radius: 10px;
}

.mini::before {
    top: -8px;
}

.mini::after {
    bottom: -11px;
}

再畫出ipad:

.ipad {
    width: 134px;
    height: 176px;
    border: #484f5e solid;
    border-width: 18px 13px;
    border-radius: 12px;
}

.ipad::before {
    top: -10px;
}

.ipad::after {
    bottom: -13px;
}

接下來畫macbook,先畫螢幕:

.macbook {
    width: 234px;
    height: 155px;
    border: 8px solid #484f5e;
    border-radius: 7px 7px 0 0;
}

::before 偽元素畫出相機:

.macbook::before {
    width: 294px;
    height: 14px;
    background-color: #e8ebf0;
    top: calc(100% + 8px);
    border-radius: 0 0 14px 14px;
}

用::after 偽元素畫出主機:

.macbook::after {
    width: 3px;
    height: 3px;
    background-color: #a5adbe;
    top: -6px;
    border-radius: 50%;
}

接下來畫imac,先畫螢幕,螢幕的左、上、右的黑色邊框沒有用border 屬性畫,是因為border 會在端點處遺留一個斜角,所以改用box-shadow 實作:

.imac {
    width: 360px;
    height: 215px;
    border-radius: 10px;
    box-shadow: 
        inset 0 14px #484f5e,
        inset 14px 0 #484f5e,
        inset -14px 0 #484f5e;
    border-bottom: 33px solid #e8ebf1;
    transform: translateY(14px);
}

用::before 偽元素畫出梯形的底座:

.imac::before {
    width: 90px;
    height: 0;
    top: calc(100% + 33px);
    border: solid transparent;
    border-bottom-color: #e2e4e8;
    border-width: 0 10px 47px 10px;
}

用::after 偽元素畫出頂部的相機和螢幕底部的按鈕,注意按鈕是用box-shadow 實現的:

.imac::after {
    width: 4px;
    height: 4px;
    background-color: #a5adbe;
    top: 5px;
    border-radius: 50%;
    box-shadow: 0 191px 0 4px #464e5d;
}

至此,裝置全部繪製完成。
刪除除iphone 之外的其他裝置的dom 元素,只保留1 個dom 元素,後面的動畫效果都在這個dom 元素上變化:

<div>
        <div></div>
        <!-- <div class="device mini"></div>
        <div class="device ipad"></div>
        <div class="device macbook"></div>
        <div class="device imac"></div> -->
    </div>

設定容器尺寸,子元素垂直居中,裝置的高度佔容器高度的75%:

.container {
    width: 360px;
    height: 350px;
    justify-content: center;
}

.device {
    transform: translateY(-25%);
}

在dom 中增加2 個按鈕元素,分別以.left 和.right 表示:

<div>
    <div></div>
    <div>
        <span></span>
        <span></span>
    </div>
</div>

定位按鈕的位置:

.buttons {
    position: absolute;
    width: inherit;
    font-size: 30px;
    height: 2em;
    bottom: 0;
    display: flex;
    justify-content: space-around;
}

.buttons > * {
    position: relative;
    width: 4em;
}

按鈕為向左和向右的箭頭:

.buttons > *::before {
    position: absolute;
}

.buttons .left::before {
    content: '←';
    right: 0;
}

.buttons .right::before {
    content: '→';
}

設定按鈕樣式為圓形:

.buttons > *t::before {
    position: absolute;
    width: 2em;
    height: 2em;
    background-color: #484f5e;
    color: silver;
    text-align: center;
    line-height: 2em;
    border-radius: 1em;
    cursor: pointer;
}

增加滑鼠懸停效果:

.buttons > *::before {
    transition: 0.2s;
}

.buttons .left:hover::before {
    width: 4em;
    content: '⟵';
}

.buttons .right:hover::before {
    width: 4em;
    content: '⟶';
}

增加按鈕點選效果:

.buttons > *:active {
    transform: scale(0.9);
    filter: brightness(0.8);
}

至此,按鈕製作完畢,接下來建立互動腳本。

定義一個取得元素的函數$

const $ = (className) => document.getElementsByClassName(className)[0]

定義一個存放裝置名稱的陣列:

let devices = ['iphone', 'mini', 'ipad', 'macbook', 'imac']

定義點擊行為對資料的加工方法,當點選左側按鈕時,把陣列最左邊的1 個元素移到最右邊,相反地,當點擊右側按鈕時,把陣列最右邊的1 個元素移到最左邊,這樣就可以從2 個方向循環遍歷數組了:

let loop = {
    'left': () => devices.unshift(devices.pop()),
    'right': () => devices.push(devices.shift())
}

定義點擊事件,根據數組的變化切換設備:

Array.from($('buttons').children).forEach(element =>
    element.addEventListener('click', function(e) {
        loop[e.target.className]()
        $('device').className = 'device ' + devices[0]
    })
)

最後,設定設備切換的緩動效果:

.device,
.device::before,
.device::after {
    transition: 0.4s cubic-bezier(0.5, 1.7, 0.5, 1.2);
}

大功告成!

#

以上是如何使用CSS和Vanilla.js實現展示蘋果設備的互動動畫(附原始碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault思否。如有侵權,請聯絡admin@php.cn刪除
每周平台新聞:改進慢速連接上的UX,用於編寫ALT文本的提示和HTML加載屬性的多填充每周平台新聞:改進慢速連接上的UX,用於編寫ALT文本的提示和HTML加載屬性的多填充Apr 17, 2025 am 11:09 AM

在本週的綜述中,如何確定慢速連接,我們應該在圖像中放入alt文本中的內容以及用於HTML加載屬性的新polyfill,

可重複使用的彈出式添加一點流行音樂可重複使用的彈出式添加一點流行音樂Apr 17, 2025 am 11:02 AM

彈出窗口是一種瞬態視圖,當用戶單擊控制按鈕或定義區域內時,屏幕上的內容頂部顯示在屏幕上。例如,

帶有真實下劃線的造型鏈接帶有真實下劃線的造型鏈接Apr 17, 2025 am 10:57 AM

在進入如何樣式下劃線之前,我們應該回答以下問題:我們應該強調嗎?

每周平台新聞:HTML加載屬性,主要的ARIA規格以及從iframe轉移到Shadow dom每周平台新聞:HTML加載屬性,主要的ARIA規格以及從iframe轉移到Shadow domApr 17, 2025 am 10:55 AM

在本週的平台新聞綜述中,Chrome引入了一個用於加載的新屬性,Web開發人員的可訪問性規範以及BBC Move

帶有GraphQL的多人遊戲TIC TAC TOE帶有GraphQL的多人遊戲TIC TAC TOEApr 17, 2025 am 10:54 AM

GraphQL是API的查詢語言,對前端開發人員非常有能力。正如GraphQL網站所解釋的那樣,您可以描述您的數據,詢問什麼

使用CSS變量的邏輯操作使用CSS變量的邏輯操作Apr 17, 2025 am 10:44 AM

通常,在使用開關變量(一個0或1的變量時,這是在這篇文章中更詳細地解釋的概念),我希望我可以

懶負載嵌入YouTube視頻懶負載嵌入YouTube視頻Apr 17, 2025 am 10:40 AM

通過亞瑟·科倫贊(Arthur Corenzan),這是一個非常聰明的主意。與其使用默認的YouTube嵌入,該YouTube嵌入了,這會在用戶播放的情況下在頁面上添加大量資源

您可以在CSS中旋轉光標嗎?您可以在CSS中旋轉光標嗎?Apr 17, 2025 am 10:28 AM

kind!沒有簡單或標準的方法可以做到這一點,但是它可能是可能的。您可以使用CSS將光標更改為不同的內置本機版本

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.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

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