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

基本全用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);})
}

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

转载于:https://www.cnblogs.com/LHLVS/p/10762589.html

CSS3 之 童年的纸飞机相关推荐

  1. adb乱码 windows_adb显示 部分乱码修改方法

    Java图片处理 Thumbnails框架 一.设置图片的缩放比例或者图片的质量比   第一步:导入maven的jar包     net.coobird ZooKeeper与Curator注册和监控 ...

  2. QQ音乐API分析记录

    我一直是QQ音乐的用户,最近想做一个应用,想用QQ音乐的API,搜索了很久无果,于是就自己分析QQ音乐的API. 前不久发现QQ音乐出了网页版的,是Flash的,但是,我用iPhone打开这个链接的时 ...

  3. 【10.29周一电商,已好】中国日历的至高境界,377张震撼级插画,美到爆!

    每段时光 都有属于每段时光的回忆 它们是童年的纸飞机 是校园时代的试卷与课本 是第一次离开家乡时的兴奋与忐忑 是跟某个人眼神交汇时的慌乱... 回忆如此珍贵,以致于令我们频频回想,渴望着回到过去,与美 ...

  4. 仿酷狗歌词的滚动效果

    先上图: 我只是做了个假的效果,真正做的时候需要根据当前歌曲的进度判断歌词扫描的进度; 原理是:1. 自定义一个歌词的view,用来控制每行歌词的扫描进度 2.自定义一个viewGroup,控制歌词的 ...

  5. 【华为云技术分享】风格迁移——让你的照片秒变手绘日漫风,祝大家六一快乐!

    写在前面 对于像我这样的小朋友来说(不接受反驳),动漫可是童年的记忆了,还记得<黑猫警长>.<葫芦七兄弟>等国产经典(一不小心,好像暴露年龄了),也还记得<千与千寻> ...

  6. python画名侦探柯南_【儿童节特辑】风格迁移——让你的照片秒变手绘日漫风

    写在前面 对于像我这样的小朋友来说(不接受反驳),动漫可是童年的记忆了,还记得<黑猫警长>.<葫芦七兄弟>等国产经典(一不小心,好像暴露年龄了),也还记得<千与千寻> ...

  7. 怀念落幕,回眸间已物是人非

    路过岁月斑驳,怀念那些踏过的风景:曾唱过的歌:曾牵过的手:曾流过的泪:曾爱过的人- 怀念那随风渐远的过去,当残留的怀念落幕时,回眸间,已物是人非. ----题记 曾经幻想着回到过去那无忧无虑的童年,畅 ...

  8. 【开源】diy一个wifi遥控小飞机

    完成效果: 童年的纸飞机 资料中包含了PCB和参考的小飞机模型,我当时是用某宝上几块钱的手抛小飞机改装的,需要一定的动手能力. 硬件 材料 720空心杯电机 * 2 107正反桨一对,搭配电机 3.7 ...

  9. Spring装配bean的三种方法:自动化装配,java代码装配,XML装配及它们的混合使用

    一.自动化装配 首先,把可能被装配的类声明为组件类,告知spring要为这个类创建bean如: import org.springframework.stereotype.Component;@ Co ...

  10. 纸飞机html,Flyaway.css-炫酷纯CSS3纸飞机动画特效

    Flyaway.css是一款使用纯CSS3制作的炫酷纸飞机动画特效.Flyout模式可以应用于登录页面,信息发送成功,如果填的信息有误,可以使用Shake模式,代表信息输入有误. Flyaway.cs ...

最新文章

  1. 快速排序的难点_数据结构考研重难点解析:快速排序
  2. 第三周 7.25 --- 7.31
  3. PAT刷题 (Java语言)
  4. 从Cell的视图推出一个新的界面
  5. GDCM:2个DICOM文件的diff测试程序
  6. ELK架构设计介绍(转:https://www.cnblogs.com/aresxin/p/8035137.html)
  7. 通过机器学习识别“迪士尼在逃公主”,程序员宠女的正确打开方式!
  8. 如何将一个目录下的所有文件,合并成一个文件
  9. 七重定位是什么意思_手机后缀名Note、Mix、Mate代表什么意思?现在终于明白了...
  10. IIS 7管理API——Microsoft.Web.Administration介绍
  11. Python数据结构与算法(1.3)——Python基础之输入、输出与高阶赋值
  12. spring,springmvc,mybatis整合ssm框架出现ORA-02289:序列不存在问题
  13. WSDL(Web服务描述语言)详细解析
  14. 在计算机中 总线简称,微机中的总线一般分为几等
  15. 联通智能城域网,到底有什么特别?
  16. 高德地图通过经纬度获取地区城市
  17. codecademy里能学好php,在iPhone上学编程:Codecademy
  18. MySQL数据库的高级SQL语句
  19. 视频教程免费分享:嵌入式stm32项目开发之心率检测仪的设计与实现
  20. deepdive案例实验中的所遇问题即解决

热门文章

  1. n−皇后问题 (dfs)
  2. MATLAB-alphaShape三维使用
  3. web3(httpd2.4)
  4. Mysql的explain,你真的会用吗?
  5. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xae in position解决办法
  6. mysql入侵服务器_记通过mysql数据库成功入侵到服务器内部的渗透实战
  7. 计算机无法安装cad怎么办,安装cad时电脑提示已经安装怎么办 cad无法安装的解决方法...
  8. garbor 特征 matlab,Gabor小波滤波用于纹理特征提取
  9. 案例|工业物联网解决方案·智慧钢厂高性能安全数采
  10. EAS BOS:序时簿中获取选中行中某单元格的值方法