zoukankan      html  css  js  c++  java
  • CSS3 之 童年的纸飞机

    今天我们来折纸飞机(可以飞出去的那种哦)

    基本全用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{
         100%;
        height: 680px;
        background-color: #000;
        background-repeat: no-repeat;
        overflow: hidden;
        transition: all 2s linear;
    }
    /*景深加在父级上*/
    .airplane{
         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;
         400px;
        height: 260px;
        top: 240px;
        transition: all 0.8s ease-in-out;
        margin: auto;
    }
    /*文本框*/
    .text-input{
         100%;
        max-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;
         400px;
        height: 260px;
        margin: auto;
    }
    /*一开始不显示飞机*/
    .backup-end.show-backup{
        transform: rotateY(180deg);
    }
    /*飞机的左右两边公共样式*/
    .left-plane, .right-plane{
        transform-style: preserve-3d;
         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%);
         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;
         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;
         109px;
        height: 38px;
        background: hsl(0, 0%, 88%);
        bottom: 0;
        left: 0;
    }
    .right-bottom.fold{
        position: absolute;
        transform-origin: 0 0;
        transition-delay: 2450ms;
         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;
         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);
        })
    }

    参考自:腾讯课堂渡一教育,有兴趣的同学可以去听一听他们的课,讲的蛮不错的, 对初学者很友好。

  • 相关阅读:
    Maven相关
    Git学习:如何登陆以及创建本地代码仓库、并提交本地代码至Github(最简单方法)
    Git的安装与配置
    下载网址
    .net core 2.2 部署CentOS7(5)部署.net core mvc
    .net core 2.2 部署CentOS7(4)CentOS7下载并安装.NET SDK(软件开发工具包)
    .net core 2.2 部署CentOS7(3)安装Xshell操控CentOS7
    .net core 2.2 部署CentOS7(2)给虚拟机安装CentOS7
    .net core 2.2 部署CentOS7(1)安装虚拟机
    Winfrom 基于TCP的Socket服务端 多线程(进阶版)
  • 原文地址:https://www.cnblogs.com/LHLVS/p/10762589.html
Copyright © 2011-2022 走看看