CSS3 之 童年的紙飛機

来源:https://www.cnblogs.com/LHLVS/archive/2019/04/24/10762589.html
-Advertisement-
Play Games

今天我們來摺紙飛機(可以飛出去的那種哦) 基本全用css來實現,只有一小部分的js 首先看一下飛機的構造 灰色區域為可摺疊區域 白色區域為機身 三角形由border畫出來的再經過各種平移翻轉變成上圖 寫之前再補充個知識點: 我們顏色的設置不用rgba, 用hsl() h: 色調 0- 360 0(或 ...


今天我們來摺紙飛機(可以飛出去的那種哦)

基本全用css來實現,只有一小部分的js

首先看一下飛機的構造

灰色區域為可摺疊區域

白色區域為機身

三角形由border畫出來的再經過各種平移翻轉變成上圖

寫之前再補充個知識點:

我們顏色的設置不用rgba,

用hsl()   h: 色調 0- 360   0(或360)表示紅色,120表示綠色,240表示藍色

   s : 飽和度 0% -100%

   l :  亮度 0% - 100%

 先看效果才有動力:

HTML:

<!--童年的紙飛機-->
<div class="airplane">
    <div class="front-end show-front">
        <!--寬高自適應的文本框-->
        <div class="text-input" contenteditable = true></div>
        <div class="fly">
            fly
        </div>
    </div>
    <div class="backup-end show-backup">
        <div class="left-plane">
            <!--左上角摺疊區域-->
            <div class="left-top fold"></div>
            <!--左下角摺疊區域-->
            <div class="left-bottom fold"></div>
            <!--機身-->
            <div class="wing wing1"></div>
            <div class="wing wing2"></div>
        </div>
        <div class="right-plane">
            <!--右上角摺疊區域-->
            <div class="right-top fold"></div>
            <!--右下角摺疊區域-->
            <div class="right-bottom fold"></div>
            <!--機身-->
            <div class="wing wing3"></div>
            <div class="wing wing4"></div>
        </div>
    </div>
</div>

css:

body{
    width: 100%;
    height: 680px;
    background-color: #000;
    background-repeat: no-repeat;
    overflow: hidden;
    transition: all 2s linear;
}
/*景深加在父級上*/
.airplane{
    width: 100%;
    height: 100%;
    -webkit-perspective: 800px;
    -webkit-perspective-origin: 50% 50%;
}
/*紙飛機前面*/
/*一開始不旋轉*/
.front-end.show-front{
    transform: rotateY(0deg);
}
/*點擊後旋轉*/
.front-end{
    background: rgba(255, 255, 255, 0.15);
    *background: hsl(0, 0%, 88%);
    /*繞Y軸旋轉-180度*/
    transform: rotateY(-180deg);
    position: relative;
    box-sizing: border-box;
    padding: 20px;
    text-align: center;
    backface-visibility: hidden;
    width: 400px;
    height: 260px;
    top: 240px;
    transition: all 0.8s ease-in-out;
    margin: auto;
}
/*文本框*/
.text-input{
    width: 100%;
    max-width:360px;
    min-height:100px;
    padding: 10px;
    box-sizing: border-box;
    height: 140px;
    background-color: #ffffff;
    font-smoothing: subpixel-antialiased;
    font-size: 18px;
    text-align: left;
    font-family: "Microsoft YaHei",Helvetica, Arial, Verdana;
    line-height: 20px;
}
.fly{
    transition: all 0.3s ease-in-out;
    /*hsl是色調/飽和度/亮度/*/
    border: 2px solid hsl(194, 100%, 72%);
    margin: 15px 0;
    padding: 10px;
    outline: none;
    font-size: 18px;
    cursor: pointer;
    font-family: "Microsoft YaHei";
    background-color: hsl(0, 0%, 94%);
    border-radius:4px;
    user-select: none;
}
/*點擊按鈕時縮小動畫*/
.fly:active{
    transform: scale(0.85);
    transition: all 10ms ease-in-out;
    background-color: hsl(0, 0%, 85%);
    border: 2px solid hsl(194, 30%, 55%);
}
.backup-end{
    perspective: 600px;
    perspective-origin: 200px 131px;
    transform-style: preserve-3d;
    transition: all 0.8s ease-in-out;
    backface-visibility: hidden;
    position: relative;
    width: 400px;
    height: 260px;
    margin: auto;
}
/*一開始不顯示飛機*/
.backup-end.show-backup{
    transform: rotateY(180deg);
}
/*飛機的左右兩邊公共樣式*/
.left-plane, .right-plane{
    transform-style: preserve-3d;
    width: 200px;
    height: 260px;
    display: block;
    position: absolute;
    top: 0px;
    transition: all 1s ease-in-out;
}
/*左邊*/
.left-plane{
    transform: rotateZ(0deg);
    transform-origin: 100% 50% 0;
    left: 0;
}
/*右邊*/
.right-plane{
    transform: rotateZ(0deg);
    transform-origin: 0% 50%;
    left: 199px;
}
/*左右機身的公共樣式*/
.wing{
    position: absolute;
    transform-origin: 0 0 0;
    perspective: 1px;
    perspective-origin: 50% 50%;
    backface-visibility: hidden;
    transition: all 1.3s linear;
    box-sizing: border-box;
    margin: 0;
    padding: 0;
    background: none;
    border: none;
    border-top: 240px solid hsla(0, 0%, 0%, 0);
    border-bottom: 0px solid hsla(0, 0%, 0%, 0);
    border-right: 100px solid hsl(0, 0%, 88%);
    width: 0;
    height: 0;
    bottom: 0;
}
/*繪製  飛機2d 雛形*/
.wing1 {
    transform-origin: 100% 100%;
    transform: translateY(-38px) translateX(8px) rotateZ(22.62deg) skewY(-22.62deg);/*2D圖像的偏移 旋轉*/
}

.wing2 {
    transform: rotateZ(22.62deg);
    transform-origin: 100% 100%;
    border-left: 100px solid hsl(0, 0%, 88%);
    border-right: none;
    left: 100px;
}

.wing3 {
    transform: rotateZ(-22.62deg);
    transform-origin: 0% 100%;
    border-right: 100px solid hsl(0, 0%, 88%);
}

.wing4 {
    transform: translateY(-38px) translateX(-8px) rotateZ(-22.62deg) skewY(22.62deg);
    transform-origin: 0% 100%;
    border-right: none;
    border-left: 100px solid hsl(0, 0%, 88%);
    left: 100px;
}
/*繪製可摺疊區域*/
.left-top.fold{
    position: absolute;
    transform-origin: 100px 112px;
    transition-delay: 1300ms;
    width: 0;
    height: 0;
    top: 0;
    border-right: 202px solid hsla(0, 0%, 0%, 0);
    border-bottom: 202px solid hsla(0, 0%, 0%, 0);
    border-top: 222px solid hsl(0, 0%, 88%);
}
.right-top.fold{
    position: absolute;
    right: 0;
    border-left: 202px solid hsla(0, 0%, 0%, 0);
    border-bottom: 202px solid hsla(0, 0%, 0%, 0);
    border-top: 222px solid hsl(0, 0%, 88%);
    transform-origin: 96px 112px;
    transition-delay: 1650ms;
}
.left-bottom.fold{
    position: absolute;
    transform-origin: 109px 0;
    transition-delay: 2100ms;
    width: 109px;
    height: 38px;
    background: hsl(0, 0%, 88%);
    bottom: 0;
    left: 0;
}
.right-bottom.fold{
    position: absolute;
    transform-origin: 0 0;
    transition-delay: 2450ms;
    width: 109px;
    height: 38px;
    background: hsl(0, 0%, 88%);
    bottom: 0;
    right: 0;
}
/*補全 摺疊尾翼 剩餘 三角區域*/
.left-bottom.fold:after {
    position: absolute;
    content: "";
    border-right: 92px solid hsla(0, 0%, 0%, 0);
    border-bottom: 39px solid hsl(0, 0%, 88%);
    border-top: 37px solid hsla(0, 0%, 0%, 0);
    left: 109px;
    bottom: 0;
}

.right-bottom.fold:after {
    position: absolute;
    content: "";
    border-left: 92px solid hsla(0, 0%, 0%, 0);
    border-bottom: 39px solid hsl(0, 0%, 88%);
    border-top: 37px solid hsla(0, 0%, 0%, 0);
    left: -92px;
    bottom: 0;
}

/****************************/
/****此處開始配合js*****/
/*摺疊效果*/
.fold {
    transition: transform 800ms ease-out;
    backface-visibility: hidden;
    position: absolute;
    background-color: transparent;
    z-index: 0;
    width: 0;
}
/* 摺疊效果(左機翼、左尾翼) */
.left-top.fold.curved {
    transform: rotate3d(1,-1.11,0,180deg);
}

.left-bottom.fold.curved {
    transform: rotate3d(2.4867,1,0,-180deg);
}
/* 摺疊效果(右機翼、右尾翼)*/
.right-top.fold.curved {
    transform: rotate3d(1,1.11,0,180deg);
}

.right-bottom.fold.curved {
    transform: rotate3d(-2.4867,1,0,180deg);
}

/* 平放一整個飛機 */
.airplane.hover {
    transform: rotateX(54deg) rotateY(-10deg) rotateZ(25deg);
    transition-delay: 0.5s;
}
/*放平之後 左側整體傾斜 (體現摺疊效果)*/
.backup-end.hover .left-plane {
    transform: rotateY(60deg);
}

.backup-end.hover .right-plane {
    transform: rotateY(-60deg);
}
/* 3d視覺中放平 左側機翼*/
.backup-end.hover .wing1 {
    transform: translateY(-38px) translateX(8px) rotateZ(22.62deg) rotateY(-60deg) skewY(-22.62deg);
    border-right: 100px solid hsl(0, 0%, 95%);
}
/*左側 飛機手持部位透明度降低*/
.backup-end.hover .wing2 {
    border-left: 100px solid hsl(0, 0%, 85%);
}

/* 3d視覺中放平 右側機翼*/
.backup-end.hover .wing4 {
    transform: translateY(-38px) translateX(-8px) rotateZ(-22.62deg) rotateY(60deg) skewY(20deg);
    border-left: 100px solid hsl(0, 0%, 95%);
}

/*右側 飛機手持部位透明度降低*/
.backup-end.hover .wing3 {
    border-right: 100px solid hsl(0, 0%, 71%);
}

/*機翼 摺疊效果(右機翼、右尾翼) 之後 多餘部分隱藏掉*/
.backup-end.hover .curved {
    display: none;
}

/* #wind_container.hover .wing {
    backface-visibility: visible;
} */


/* 飛機後退助跑 */
.backup-end.hover.fly_away_first {
    transform: translateX(-100px) translateZ(300px) rotateX(42deg) rotateY(-11deg) rotateZ(27deg);
    transition-delay: 0ms;
    transition-duration: 0.4s;
    transition-timing-function: ease-out;
}
/* 飛機向前飛翔至消失 */
.backup-end.hover.fly_away_first.fly_away {
    transform: translateX(600px) translateY(-400px) translateZ(-5000px) rotateX(66deg) rotateY(-12deg) rotateZ(36deg);
    transition: transform 2s ease-out, opacity 1.5s 0.5s linear;
    opacity: 0;
}

js:

// 童年的紙飛機
const fly = document.getElementsByClassName('fly')[0];
const front = document.getElementsByClassName('front-end')[0];
const backup = document.getElementsByClassName('backup-end')[0];
const fold = document.getElementsByClassName('fold');

fly.addEventListener('click', () => {
    first().then(second).then(third).then(fourth).then(fifth).catch((err)=> {
        console.log(err)
    });
}, false);

// 第一步
function first() {
    return new Promise((suc, err) => {
        setTimeout(() => {
            // 隱藏信息面板
            front.classList.remove('show-front');
            // 翻轉至正面
            backup.classList.remove('show-backup');
            // 摺疊效果(左翼、右翼)
            for (let i = 0; i < fold.length; i++) {
                fold[i].classList.add('curved')
            }
            // 顏色變換
            document.body.style.backgroundColor = "#54575A";
            suc(1)
        }, 200)
    })
}

function second() {
    return new Promise((suc, err) => {
        setTimeout(function () {
            backup.classList.add('hover');
            document.body.style.backgroundColor = "#AD8BD8";
            suc(2)
        }, 2800);
    })
}

//步驟三:飛機後退助跑
function third() {
    return new Promise((suc, err) => {
        setTimeout(function () {
            backup.classList.add('fly_away_first');
            document.body.style.backgroundColor = "#6E99C4";
            suc(3)
        }, 2000);
    })
}

// 步驟四:飛機向前飛翔至消失
function fourth() {
    return new Promise((suc, err) => {
        setTimeout(function () {
            backup.classList.add('fly_away');
            document.body.style.backgroundColor = "#3F9BFF";
            suc(4)
        }, 600);
    })
}

function fifth() {
    return new Promise((suc, err) => {
        setTimeout(function () {
            front.classList.add('show-front');
            backup.classList.remove('fly_away','fly_away_first','hover');
            backup.classList.add('show-backup');
            for (let i = 0; i < fold.length; i++) {
                fold[i].classList.remove('curved')
            }
            document.body.style.backgroundColor = "#000";
            suc(5)
        }, 3000);
    })
}

參考自:騰訊課堂渡一教育,有興趣的同學可以去聽一聽他們的課,講的蠻不錯的, 對初學者很友好。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在瑞芯微電子第四屆“開發者之春”大會上,瑞芯微推出了新一代8nm旗艦處理器-RK3588 這個晶元將採用8nm 製程工藝、基於A76+A55 內核組合,具備4K UI性能、8K VPU,擁有NPU2.0 等。按照規劃2020年Q1量產。 據瑞芯微官方透露,RK3588採用的8nm製程將比前一代產品性 ...
  • 文章同步自http://javaexception.com/archives/34 如何給自己的app添加分享到有道雲筆記這樣的功能 問題: 在之前的一個開源筆記類項目Leanote中,有個用戶反饋想增加類似分享到有道雲筆記的功能,這樣就可以把自己小米便簽或者是其他記事本的內容分享到Leanote中 ...
  • **1、margin塌陷**問題:垂直方向的父子關係的盒子使用不當會產生margin塌陷。給子級設置margin-top時,他不會相對父級一起動,只有他的margin超過父級的margin時,才會生效,但會帶著父級一起動(作者總結,官方定義自己查看)。如: ```<!DOCTYPE html><ht ...
  • 最近做項目,移動端的多文件上傳,使用input:file讀取文件 但是在移動端 設置 multiple 屬性是不起作用的,設置此屬性PC端可以多選而移動端無法多選。 我使用的解決方案是動態添加 input:file標簽。,每添加一個標簽就出發一次click事件讀取文件。然後選擇相片並且將相片顯示在頁 ...
  • 獲取元素 getElementById() getElementsByClass() getElementsByTagName getElementsByName node屬性 前、後、父、子 previousSibling nextSibling parentNode childNode chil ...
  • WordPress的打開速度慢會影響到用戶體驗和關鍵詞的穩定排名,WordPress為什麼載入慢呢?其實很簡單的,就是WordPress水土不服,用WordPress的大家都知道,WordPress是外國人開發的,在國內用肯定會卡的,今天筆者給大家整理了幾個解決各種WordPress慢的慢的問題,希 ...
  • span設置部分省略...: span{ overflow: hidden; text-overflow: ellipsis; -o-text-overflow: ellipsis; white-space:nowrap; width:240px; height:24px; display:bloc ...
  • 1,如何將JS中ajax的非同步請求改為同步? Ajax請求預設的都是非同步的 如果想同步 async設置為false就可以(預設是true) var html = $.ajax({ url: "some.PHP", async: false }).responseText; 或者在全局設置Ajax屬性 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...