目标:动态展示代码与效果
CRM 实现效果、了解代码思路、会用会查相关API、可复现步骤(半盲打)、拓展
- 可以将之前的项目:Canvas画板和拖动一个div项目也改成动态代码展示,当做练习
目录
- 起手
- 原理
- 思路
- 实现过程
- 显示一段话,并加上样式
- 制作太极
- 永远都要考虑手机
- 部署到 GitHub Pages
起手
- 创建
cv-1/src/
路径 - 创建
index.html
- 创建
main.js
! + Tab
初始化index.html
- 引入
<script src="main.js"></script>
parcel --version
,没的话,装yarn global add parcel
- 启动
parcel
服务 parcel src/index.html
测试成功运行
- 在
<body>hi</body>
里写个字,在main.js
里写一句console.log('hi')
- 看页面以及打开控制台,看是否生效
实现思路与细节
分解步骤,一步步由简单到复杂
抽象
1)让字在页面中一个个显示
- 在
HTML
里写个数字 - 在
main.js
里操作这个demo
- 让数字变:
1-> 2-> n
- 让数字不停地变
- 把数字改为字符串
- 显示完整字符串,即显示从
0
个到n
个字符串,实现“改变一段字” - 加几段字
2)加上样式
- 不用
<span id="demo"></span>
,用<div id="html"></div>
实现原理
用到的API
- 取
ID
选择器document.querySelector("#xxx")
,赋值给xxx
- 写入
xxx.innerHTML = 123
- 定时
setTimeout(()=>{},0)
- 封装函数,调用
- 用递归函数,简化步骤(函数循环调用自己)
- 截取字符串
'string'.substring(0,n)
- 字符串替换
string.replace('\n','<br>')
string[0].charCodeAt()
- 正则匹配
string.replace(/\n/g,'<br>')
,把所有的\n
筛选出来
不用的API
setInterval(()=>{},0)
,用递归的setTimeout
代替,好处是可以随时停止,即更自由地控制暂停/开始
实现过程
显示一段话
第一步:让字动起来
1)生成一个容器放数字
|
|
2)在main.js
里操作这个demo
|
|
parcel
会自动刷新
3)让数字变
2s
后让字变为2
|
|
4)让数字不停地变
用一个变量
n
,去保存当前变成的字demo.innerHTML = n
在‘定时器’中累加一次
n = n + 1
|
|
联想一早响n次的闹钟
为什么不用
setInterval
?
|
|
老手不用
setInterval(()=>{},0)
,用递归的setTimeout
代替,封装一个函数
4)递归函数每隔一段时间,调用自己
通过
setTimeout
模拟setInterval
|
|
- 好处是,可以加上停止的条件,更自由地控制
|
|
5)把数字改为字符串,实现“改变一段字”
- 让内容变为字符串
let string = '...';
- ES6的反引号 ‘`',可以处理换行的字符
- 引入下标
let n = 0;
- 通过字符串的过装对象下标来一个个处理字符串中的字
|
|
在控制台看到,最后一个是
undefined
- 初始
n = 0
- 因为此时
n < string.length
在n+=1
后 - 代入
n = 2
,长度3
- 仍要运一次
step()
,取到超过字符串长度下标值为undefined
6)改掉最后一个undefined
思考初步改掉if 的判断条件的顺序
console.log(n)
代入
n = 10
,看
|
|
把判断条件改成
if (n + 1 >= string.length)
就ok了?“暴力”尝试比“想”,更快
效果不对,
console.log()
试
7)显示完整字符串,即显示从0
个到n
个字符串
把
string[n]
换为string.substring(0,n)
效果不对,
console.log()
试程序员的“测不准定理”,只关注代码现在可以运行成功
|
|
效果不对,调整顺序
|
|
代码逻辑优化
改代码顺序,即改代码逻辑,重调
需求一变,代码全变
|
|
加几行字
|
|
但只显示在一行里
8)要显示换行的格式
string
里加的回车都缩为空格了问题:
HTML
源代码里敲回车会自动变成空格,从而使字符串变为一行变成
HTML
里的回车,<br>
标签解决:
string.replace('\n','<br>')
,这也是文本编辑器中自动换行的原理
|
|
效果不对,并没换行
控制台中,判断字符
|
|
- 将字符串在控制台里打出来看,每个下标对应的字符是什么
- 用
string[0].charCodeAt()
,得出一个字符的Unicode
编码10
- 查看
Ascii Table
,换行符new line
|
|
- 运行
string = string.replace("\n", "<br>");
- 再看,只替换了第一个
<br>
,并没替换所有的
用正则表达式匹配,把所有的
\n
筛选出来
|
|
9)完善细节
代码优化,细节,找一找重复的代码,想办法整合:
demo.innerHTML = string.substring(0,n)
目前重复出现了两次
let n = -1
,将初始的的demo.innerHTML = string.substring(0,n)
整合放入let step() = ...
中
|
|
- 不符合常规从
0
开始,让if(n < string.length - 1)
,就可以n = 0
开始
调慢速度后,回车的地方怎么出现了
<
在
n = n + 1;
加上console.log(string[n]);
一个字一个字蹦,解析到
<br
,就先显示出<
11)完整地解析<br>
重想全部方法:不能一下子全部替换
放弃使用
string = string.replace(/\n/g, "<br>");
声明一个变量
string2
用作寄存字符串,string[n]
只作为判断\n
的标记,累加赋值给寄存器string2
string[n]
不再作为累加的字符串,字符不再一一对应- 而是作为判断
innnerHTML
哪里出现了\n
的标记 - 重新声明一个
sintrg2 = ""
,用作寄存字符串 - 在过程中,每次遇到
\n
,每次都将string[n]
替换一次成字符串<br>
,累加赋值给字符串寄存器string2
- 判断:
string[n] === "\n"
- 分叉判断:
string2 += "<br>" : string2 += string[n]
- 汇总:
demo.innerHTML = string2
对
n
进行加1的操作取
string
的第n个字符判断取得字符是否回车?替换 :照抄
得到的结果保存到另一个字符串
判断n是否到最后一个?跳出 :继续n+1的操作
|
|
超过三十行,大脑就不够用了
每过几行就回顾一下代码,做了些什么,达到的程度
在注释中,写出分步思路,每个变量的作用,开始的取值,最后一步的取值
简化
if else
成三目运算,n
累加和步进step()
写到一起
|
|
三大难题
- 要不要加1(1-offset problem)
- 怎么命名(naming problem)
- 缓存失效(cache problem)
只有试
尽量把思路用注释写下来,防止遗忘
空格未显示
9)显示缩进,空格转义符
要显示空格
加个判断
string[n] === " "
将
' '
转义为实体字符
|
|
body{ color: red; }
如何生效?
第二步:同时展示HTML
和加上样式
1)改样式
- 加上
<style id="style"></style>
测试可以更改样式
|
|
2)把展示的字符串同时写到HTML
和Style
里
- 同时写入
<style id="style"></style>
里
|
|
问题:在控制台里
<style id="style"></style>
里混入了<br>
和&bsp;
,并不能得到预期的效果
- 用替换空格和换行前的字符串
string.substring(0,n)
怎么style里有html,中文(字符)会使CSS失效
<style id="style"></style>
里仍受中文字符影响加注释
/* */
代码
|
|
写
html
的时候同时写style
|
|
小结
- 如何显示写入
HTML
里的内容 - 如何写入
Style
样式 - 如何让显示的内容的样式立即生效
制作太极
准备一个div
index.html
|
|
把 div 变成一个圆
main.js
里的string
加上以下代码
|
|
背景渐变实现一黑一白
gradient background generator https://cssgradient.io/
main.js
里的string
加上以下代码
|
|
加两个神秘的小球
index.html
|
|
点睛
辐射渐变
radial-gradient
main.js
里的string
加上以下代码
|
|
微元素中不能再套伪元素
背景
白色背景太单调了,我们来点背景
main.js
里的srtring
加上以下代码
|
|
代码文字折行
以及确定宽高
index.html
|
|
优化以及永远都要考虑手机
自动处于底部
JS
控制滚动条window.scrollTo(x,y)
- 加到
main.js
里
|
|
干掉X方向滚动条
CSS
设置换行
|
|
页面布局适配
- 媒体查询,测试有效性
|
|
- 上下各50%
|
|
变成椭圆,未包裹div,定位不可固定
- 媒体查询的优先级更高,样式被影响
- 设置的宽高是固定数值,因此变形
外面再套一个
div#div1Wrapper
,专门用来定位
|
|
对应在样式里修改
|
|
上半部分文字超出,到下方
- 加滚动条
overflow: auto;
|
|
代码自动向下滚
-
之前设置的是浏览器的滚动条,现在要加上div的滚动条
-
在JS里加一句
html.scrollTo(0, 9999);
|
|
关键帧动画里,
transform
属性要完全覆盖之前的,相同的部分(状态)也要保留
|
|
注意别忘了写
CSS_reset
,以及修改五六个meta
值,适配移动页面,抄大厂的
|
|
部署到 GitHub Pages
演示中,不能把
<style></style>
写到<body></body>
里,会被parcel
删掉
- 单独保存样式到一个
style.css
里,就好了
验证
生成的
dist
目录里的index.html
能否运行
|
|
- 点开链接,加上路径
/index.html
查看,可以运行 src
里的不能直接运行- 配置
Setting>GitHub Pages
,选master
- 等出现网址,打开(得到404页),加上路径
/dist/index.html
- 等待
- 在此页面下,打开开发者工具,
Network
选项卡,勾选Disable Cache
禁用缓存,刷新
验证
Network
里,生成的main.***.js
请求路径是否正确,包含/cv-1/dist/index.html
- 手动更改打包路径
参考
|
|
- 更改
parcel build --public-url <url>
- 验证
|
|
- 打开重新生成的
dist/index.html
里,查找fuck
,找到src='fuck/main.***.js'
fuck
调试法- 将
fuck
的位置替换为dist
|
|
- 打开重新生成的
dist/index.html
里,查看到<script src="dist/main.***.js"></script>
.gitignore
|
|
上传提交
忽略建仓操作,具体看
|
|
发现路径错/dist/dist/...
重新生成
|
|
- 确保
main.***.js
路径在当前目录 - 即
index.html
里的<script src="main.***.js" ></script>
中,main.***.js
前无其他路径
部署方式
- 每次改完代码,必须运行这一行,才能正确的请求 JS 和 CSS:
|
|
–
动态化项目复盘
保留静态样式
把JS入门项目动态化
把画板项目也动起来:动态显示构建Canvas画板项目
回顾注释·回顾代码·回顾思路
过程·过程·过程
未适配
safari
参考文章
FrankFang的完整代码:https://github.com/FrankFang/cv-1/tree/master/src
相关文章
- 无
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名
- 河 掘 思 知 简