画皮卡丘、小黄人、哆啦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绘制任意图形,并同步显示代码
- 界面简洁友好
- 使用指南
技术栈
SCSS
parcel
实时预览@media
媒体查询- 表驱动编程-自动绑定事件
Git
&GitHub
- 短链处理
- 二维码链接
后续更新
- vue版本
- react版本
思路
- 实现手机端
- 写 HTML
- 写 SCSS
- 写 JS(事件监听、DOM 操作)
- 实现PC端
- 加 媒体查询 CSS
- 写 JS(单独处理PC端逻辑)
- 发布到
GitHub
Gitee
创建和使用
开发
|
|
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.run
player.pause
|
|
初始化方法
|
|
内置功能
id = player.play();
到player.play
中
|
|
将绑定事件放入初始化函数
|
|
表驱动编程:哈希Map 避免重复代码声明事件
|
|
将hashTable放到声明中去
|
|
- 哈希Map,读取字符串
- 不能在定义对象时调用此对象
- 区别于函数,函数可以延迟定义
|
|
防御型编程
|
|
player.events.toString
player.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.demo
player.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
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名
- 河 掘 思 知 简