画皮卡丘、小黄人、哆啦A梦、瑞克和莫提、琦玉,任何CSS画出的非图片图形,Canvas SVG
目录 § ⇧
- 1. 回顾技术栈 §
- 2. 选择模仿目标 §
- 3. 创建和使用 §
- 4. 图形制作过程 §
- 6. 动态显示代码 §
- 7. 总结 §
回顾技术栈
CSS3 + ES6综合应用
- 必备知识:CSS3布局和定位、CSS3 transform、JS DOM操作
浏览器 JS 的能力
- 操作DOM
- 操作AJAX
目前的目标
- 用jQuery操作DOM(之后改成Vue React)
- 用axios操作AJAX
一个项目
- 60%的时间在写CSS 布局
- 20%的时间在写JS
- 20%的时间在想错在哪
选择模仿目标
勿原创,不是设计师
- 模仿别人的界面,代码自己写
- codepen.io
项目介绍
特点
- 移动端支持
- CSS绘制任意图形,并同步显示代码
- 界面简洁友好
- 使用指南
技术栈
SCSSparcel实时预览@media媒体查询- 表驱动编程-自动绑定事件
Git&GitHub- 短链处理
- 二维码链接
后续更新
- vue版本
- react版本
思路
- 实现手机端
- 写 HTML
- 写 SCSS
- 写 JS(事件监听、DOM 操作)
- 实现PC端
- 加 媒体查询 CSS
- 写 JS(单独处理PC端逻辑)
- 发布到
GitHubGitee
创建和使用
开发
|
|
build 命令
|
|
修改 package.json
|
|
取色工具 Snipaste
制作过程
index.html
|
|
基础SCSS样式
|
|
制作鼻子和眼睛样式
以页面宽度中线为基准,画鼻子
|
|
- 注意当写border 不同方向上数值的时候, 指的是那个方向上的厚度
- CSS用border模拟图形(三角 + 圆/椭圆)
- tips提示条
- 各同级元素的单位保持一致(px / em ),和百分比 / vh vm 混用注意
- 使用绝对定位时,没有普通文档流元素,body 元素高度设为
{min-height: 100vh;} - 对具体某个元素使用绝对定位时,父元素设为相对定位
- 平滑椭圆边线圆弧
border-bottom-left-radius: 60px 30px; transform属性会相互覆盖,必须一次性写出transform: translate(110px, -30px) scaleX(-1) rotate(-20deg);
制作眼睛
|
|
制作上嘴唇
|
|
制作下嘴唇
|
|
添加动态效果
|
|
移动端适配
px -> rem
动态显示代码
简单的测试
蹦字
|
|
动态样式
|
|
同时以文本和HTML的形式展示style标签
同时输出两种形式,一个用
innerHTML,另一个用innerText
- 用
innerText,以文本形式展示,但标签不会生效 - 同时用
innerHTML写入标签
|
|
先写好HTML到
<div id="html"></div>里
|
|
再动态显示 CSS 代码 动态加载CSS
- 分屏固定显示代码文本和效果
- 隐藏展示样式
#demo2的代码,不影响效果 - 写自动滚动到底部的代码,每写一句,就往下拉滚动条
- 滚动距离为 可滚动高度
demo.scrollHeight,再减去滚动条本身的高度 - 下拉的距离等于滚动的高度
demo.scrollTop = demo.scrollHeight - 对JS来说,有没有滚动条,都可以滚动页面,只是用户不能操作滚动,设置
overflow-y: auto - 或者用另一种隐藏滚动条的方法(搜CSS 隐藏滚动条)
#demo::-webkit-scrollbar{display: none;}只是只能效果上看不见,仍可以用滚轮滚动页面
|
|
优化
- 先写好style标签,将
#demo2的div标签改为style标签 - 去除会影响页面整体样式的代码,写到别处,或者用BootCDN 的
normalize.css - 只显示对页面有直观效果的CSS代码
|
|
抽出默认样式代码
|
|
抽出动画代码
|
|
抽出string样式代码
|
|
模块化导出JS独立代码
将不相关的独立代码写到单独的文件中,导出,在需要的时候导入
|
|
stringDefault.js
|
|
string.js
|
|
stringAnimation.js
|
|
集中导入
|
|
- 导出的可以使变量、函数等
- 重构代码
|
|
添加暂停、变速按钮
|
|
|
|
暂停就是取消计时器,播放就是再设置一个计时器,变速就是更改间隔秒数
|
|
重复即丑,重构JS代码
|
|
按作用抽象成函数,重构后的代码,主逻辑清晰
|
|
把相似的代码封装成一个函数,取个名字,调用它
|
|
抽象事件函数,再重构
|
|
使用正规的语法,获取元素
|
|
用面向对象,再重构
- 先声明
const player = {...},后使用let id = player.play(); player.runplayer.pause
|
|
初始化方法
|
|
内置功能
id = player.play();到player.play中
|
|
将绑定事件放入初始化函数
|
|
表驱动编程:哈希Map 避免重复代码声明事件
|
|
将hashTable放到声明中去
|
|
- 哈希Map,读取字符串
- 不能在定义对象时调用此对象
- 区别于函数,函数可以延迟定义
|
|
防御型编程
|
|
player.events.toStringplayer.events.valueOf等原型链上继承的方法虽然默认是不可枚举- 但不排除对象的原型链被沙雕加了可遍历的属性
Object.prototype.x = 1,然而这是不希望被遍历到的console.log('key'+ key) - 用
for in遍历对象时会遍历到继承的属性,必须判断排除 - 用
hasOwnProperty判断
|
|
- 这就属于防御型编程
另一种方法
|
|
目前代码的结构
|
|
将
player对象声明和初始化以及模块化的外代码全干掉
- 将
n: 1,放到player里 ->player.n - 将
intervalTime: 80,放到player里 ->player.intervalTime - 将
id: undefined放到player里 ->player.id - 用
ui放两个页面元素,表示UI界面player.ui.demoplayer.ui.demo2
|
|
美化按钮
|
|
|
|
|
|
总结
VSCode V.S. WebStorm
xxx.log -> console.log(xxx)
部署到 GitHub Pages
演示中,不能把
<style></style>写到<body></body>里,会被parcel删掉
- 单独保存样式到一个
style.css里,就好了
.gitignore
|
|
部署方式
- 每次改完代码,必须运行这一行,才能正确的请求 JS 和 CSS:
|
|
yarn build 一键发布
再次build的时,只需用
yarn init -y创建package.json
- 在
package.json中加一段脚本
|
|
再次 yarn build
参考文章
相关文章
- 画一只皮卡丘 预览链接
- 会动的代码 预览链接
- 点击动画效果预览
- 示例作品,声音,快慢播放
- 代码 test.html
- 源代码1 源代码2 旧版代码
- CodePen - Pure CSS PokeBall Radio Button
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名
- 河 掘 思 知 简