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{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 之 童年的纸飞机相关推荐
- adb乱码 windows_adb显示 部分乱码修改方法
Java图片处理 Thumbnails框架 一.设置图片的缩放比例或者图片的质量比 第一步:导入maven的jar包 net.coobird ZooKeeper与Curator注册和监控 ...
- QQ音乐API分析记录
我一直是QQ音乐的用户,最近想做一个应用,想用QQ音乐的API,搜索了很久无果,于是就自己分析QQ音乐的API. 前不久发现QQ音乐出了网页版的,是Flash的,但是,我用iPhone打开这个链接的时 ...
- 【10.29周一电商,已好】中国日历的至高境界,377张震撼级插画,美到爆!
每段时光 都有属于每段时光的回忆 它们是童年的纸飞机 是校园时代的试卷与课本 是第一次离开家乡时的兴奋与忐忑 是跟某个人眼神交汇时的慌乱... 回忆如此珍贵,以致于令我们频频回想,渴望着回到过去,与美 ...
- 仿酷狗歌词的滚动效果
先上图: 我只是做了个假的效果,真正做的时候需要根据当前歌曲的进度判断歌词扫描的进度; 原理是:1. 自定义一个歌词的view,用来控制每行歌词的扫描进度 2.自定义一个viewGroup,控制歌词的 ...
- 【华为云技术分享】风格迁移——让你的照片秒变手绘日漫风,祝大家六一快乐!
写在前面 对于像我这样的小朋友来说(不接受反驳),动漫可是童年的记忆了,还记得<黑猫警长>.<葫芦七兄弟>等国产经典(一不小心,好像暴露年龄了),也还记得<千与千寻> ...
- python画名侦探柯南_【儿童节特辑】风格迁移——让你的照片秒变手绘日漫风
写在前面 对于像我这样的小朋友来说(不接受反驳),动漫可是童年的记忆了,还记得<黑猫警长>.<葫芦七兄弟>等国产经典(一不小心,好像暴露年龄了),也还记得<千与千寻> ...
- 怀念落幕,回眸间已物是人非
路过岁月斑驳,怀念那些踏过的风景:曾唱过的歌:曾牵过的手:曾流过的泪:曾爱过的人- 怀念那随风渐远的过去,当残留的怀念落幕时,回眸间,已物是人非. ----题记 曾经幻想着回到过去那无忧无虑的童年,畅 ...
- 【开源】diy一个wifi遥控小飞机
完成效果: 童年的纸飞机 资料中包含了PCB和参考的小飞机模型,我当时是用某宝上几块钱的手抛小飞机改装的,需要一定的动手能力. 硬件 材料 720空心杯电机 * 2 107正反桨一对,搭配电机 3.7 ...
- Spring装配bean的三种方法:自动化装配,java代码装配,XML装配及它们的混合使用
一.自动化装配 首先,把可能被装配的类声明为组件类,告知spring要为这个类创建bean如: import org.springframework.stereotype.Component;@ Co ...
- 纸飞机html,Flyaway.css-炫酷纯CSS3纸飞机动画特效
Flyaway.css是一款使用纯CSS3制作的炫酷纸飞机动画特效.Flyout模式可以应用于登录页面,信息发送成功,如果填的信息有误,可以使用Shake模式,代表信息输入有误. Flyaway.cs ...
最新文章
- 十大成长型机器人技术大盘点
- 使用jquery 根据下拉列表的name值查找被选中的值
- 【Android】JNICALL could not be resolved
- 解决虚拟机vmware安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题...
- Linux不停往外发包
- json 数据 生成 图表_Python数据分析:手把手教你用Pandas生成可视化图表
- Spring Bean的生命周期(详细)
- IoT Studio 有大事宣布
- shell脚本发邮件内容html,[转]Shell脚本中发送html邮件的方法
- Ubuntu 安装和使用 jupyter 出现的问题总结
- 用elemet-ui组件实现弹窗里的树形结构和拖拽功能
- 监控Linux系统状态的命令
- python识别银行卡数字_Python银行卡数字识别项目 (Opencv)
- 信息安全学习3. 常用的攻击手段 弱密码
- Python爬取图片
- 业务流程图(TFD)实例
- 小米C++开发笔试真题
- 迅为STM32MP157开发板使用手册更新啦
- Js、 replace 全部内容替换、替换全部匹配内容、替换第一个
- R语言频数统计函数和独立性检验函数