前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >24·灵魂前端工程师养成-JS实践(会动的代码:画太极)

24·灵魂前端工程师养成-JS实践(会动的代码:画太极)

作者头像
DriverZeng
发布2022-09-26 17:17:20
1.4K0
发布2022-09-26 17:17:20
举报
文章被收录于专栏:Linux云计算及前后端开发

-曾老湿, 江湖人称曾老大


-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。


让代码动起来


创建项目

首先创建一个项目,然后使用VScode打开

创建一个src目录,然后在目录中创建index.htmlmain.js

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    hi
    <script src="main.js"></script>
</body>
</html>
代码语言:javascript
复制
console.log('hi')

使用html调用JS,然后通过终端运行

代码语言:javascript
复制
#打开终端,安装parcel
MacBook-Pro:cv-1 driverzeng$ yarn global add parcel

代码语言:javascript
复制
#启动页面
MacBook-Pro:cv-1 driverzeng$ parcel src/index.html

访问页面:http://localhost:1234


原理,如何让字在页面上动

首先在html中,创建一个span容器

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    <span id="demo"></span>
    <script src="main.js"></script>
</body>
</html>

然后在JS中获取这个容器

代码语言:javascript
复制
let demo = document.querySelector('#demo')
demo.innerHTML = 2;

因为用了parcel所以我们不需要重启,页面会自动刷新

在之前的学习中我们学过一个函数setTimeout(),意思是,在多长时间之后执行,我们可以让页面中的数字先是2,然后再过几秒把他变成3

代码语言:javascript
复制
//3秒之后,把2变成3
let demo = document.querySelector('#demo')
demo.innerHTML = 2;

setTimeout(() => {
    demo.innerHTML = 3;
},3000)

代码语言:javascript
复制
//使用setIterval,让代码持续变化
let demo = document.querySelector('#demo')
let n = 1
demo.innerHTML = n;

setInterval(() => {
    n = n + 1
    demo.innerHTML = n;
},3000)

但是老手,不会用setInterval,而是使用setTimeout,然后将setTimeout递归,封装成一个函数

代码语言:javascript
复制
//让setTimeout递归
let demo = document.querySelector('#demo')
let n = 1
demo.innerHTML = n;

let step = () =>{
    n = n + 1
    demo.innerHTML = n;
}

setTimeout(() => {
    step()
    setTimeout(() => {
        step()
        setTimeout(()=>{
            step()
            setTimeout(()=>{
                step()
            })
        })
    })
},1000)

于是我们就可以把这个setTimeout也放进这个函数中

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 1
demo.innerHTML = n;

let step = () =>{
    setTimeout(()=>{
        n = n + 1
        demo.innerHTML = n;
    },1000)
}
step()

step()

但是上面的写法,我们没有办法多次调用step,如果只能调用一次,那么页面也是1变成2,没有后续

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 1
demo.innerHTML = n;

let step = () =>{
    setTimeout(()=>{
        n = n + 1
        demo.innerHTML = n;
        step()
    },1000)
}

step()

所以我们将,step()也放入函数中

接下来,我们要控制step(),让他到11就不再变化

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 1
demo.innerHTML = n;

let step = () =>{
    setTimeout(()=>{
        n = n + 1
        demo.innerHTML = n;
        if(n<=10){
            step()
        }else{

        }     
    },1000)
}

step()

然后我们可以把n起始改为0,这样我们就可以把他当做 是一个数组的下标

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 0
let string = `你好,我是曾老湿`
demo.innerHTML = string[n];

let step = () =>{
    setTimeout(()=>{
        n = n + 1
        demo.innerHTML = string[n];
        if(n<string.length){
            step()
        }else{

        }     
    },1000)
}

step()

但是这段代码会出现一个问题,最后会显示一个undefined...这是为什么?

这是因为我们虽然写了判断n<string.length但是,因为使用的是setTimeout,那么即便是到了字符串的长度后,还会运行setTimeout中的n+1所以,我们应该判断n+1

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 0
let string = `你好,我是曾老湿`
demo.innerHTML = string[n];

let step = () =>{
    setTimeout(()=>{
        
        if(n + 1 >=string.length){
            return
        }
        n = n + 1
        demo.innerHTML = string[n];
        step()
    },1000)
}

step()

bingo,这样的效果就对了嘛

但是,问题又来了,我们这句话,在页面上没只显示一个字,怎么办?我们想要让他跟打字一样,把这一句话都显示出来,该怎么办?

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 0
let string = `你好,我是曾老湿`
demo.innerHTML = string.substring(0,n);

let step = () =>{
    setTimeout(()=>{
        
        if(n + 1 >=string.length){
            return
        }
        n = n + 1
        demo.innerHTML = string.substring(0,n);
        step()
    },1000)
}

step()

使用substring,然后传递两个参数从第0个开始一直到n

哎哟我去,,,湿呢?

于是乎,我们会想到,刚才我们判断的n+1不会出来undefined,现在又少了个字,那么我们是不是把那个n+1再改回n就行了?

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 0
let string = `你好,我是曾老湿`
demo.innerHTML = string.substring(0,n);

let step = () =>{
    setTimeout(()=>{
        
        if(n>=string.length){
            return
        }
        n = n + 1
        demo.innerHTML = string.substring(0,n);
        step()
    },1000)
}

step()

最后优化一下,会发现我们判断啥也没做..就一个return,再优化一下速度

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 0
let string = `你好,我是曾老湿`
demo.innerHTML = string.substring(0,n);

let step = () =>{
    setTimeout(()=>{
        
        if(n<string.length){
            step()
        }
        n = n + 1
        demo.innerHTML = string.substring(0,n);

    },600)
}

step()


给这段话加上样式

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 0
let string = `你好,我是曾老湿
接下来,我要加样式了
我要加的样式是
body{
    color: red;
}
`
demo.innerHTML = string.substring(0,n);

let step = () =>{
    setTimeout(()=>{
        
        if(n<string.length){
            step()
        }
        n = n + 1
        demo.innerHTML = string.substring(0,n);

    },100)
}

step()

问题又**的来了,为啥,我家的回车,是个空格呢?

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 0
let string = `你好,我是曾老湿
接下来,我要加样式了
我要加的样式是
body{
    color: red;
}
`
string = string.replace(/\n/g,'<br>')
demo.innerHTML = string.substring(0,n);

let step = () =>{
    setTimeout(()=>{
        
        if(n<string.length){
            step()
        }
        n = n + 1
        demo.innerHTML = string.substring(0,n);

    },100)
}
step()

通过正则表达式,把所有的回车变成 标签

但是还是有问题,我们会发现,所有换行的地方,显示了一下<

说明我们的方法 还是有问题。

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = -1
let string = `你好,我是曾老湿
接下来,我要加样式了
我要加的样式是
body{
    color: red;
}
`
let string2 = ""

let step = () =>{
    setTimeout(()=>{
        n = n + 1
        if(string[n]==='\n'){
            string2 += '<br>';
        }else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        if(n<string.length){
            step()
        }      
    },100)
}
step()

再次解决undefined

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 0
let string = `你好,我是曾老湿
接下来,我要加样式了
我要加的样式是
body{
    color: red;
}
`
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },100)
}
step()

然后我们发现,color那里没有缩进...在html中,&nbsp表示空格

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let n = 0
let string = `你好,我是曾老湿
接下来,我要加样式了
我要加的样式是
body{
    color: red;
}
`
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },100)
}
step()

加上样式... 结果呢?颜色也没变啊

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    <style id='style'></style>
    <span id="demo"></span>
    <script src="main.js"></script>
</body>
</html>
代码语言:javascript
复制
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/*你好,我是曾老湿
接下来,我要加样式了
我要加的样式是*/
body{
    color: red;
}
`
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },100)
}
step()

开始画太极

从上面的代码,我们已经可以实现,一边打字,一边加样式了,接下来我们就可以修改代码,加一些更牛逼的样式。

实现一个画板,画一个太极出来,首先我们先加一个div

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    <style id='style'></style>
    <span id="demo"></span>
    <div id="div1"></div>
    <script src="main.js"></script>
</body>
</html>
代码语言:javascript
复制
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/* 你好,我是曾老湿
 * 接下来我演示一下我的前端功底
 * 首先我要准备一个div
 */
#div1{
    border: 1px solid red;
    width: 400px;
    height: 400px;
}
`
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },100)
}
step()

怪怪的,把div出现在代码的右边,感觉会好一些

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    <style id='style'></style>
    <span id="demo"></span>
    <div id="div1"></div>
    <style>#div1{
        position: fixed;
        right: 20px;
        top: 20px;
    }</style>
    <script src="main.js"></script>
</body>
</html>
代码语言:javascript
复制
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/* 你好,我是曾老湿
 * 接下来我演示一下我的前端功底
 * 首先我要准备一个div
 */
#div1{
    border: 1px solid red;
    width: 400px;
    height: 400px;
}
`
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },10)
}
step()

把div变成一个圆

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/* 你好,我是曾老湿
 * 接下来我演示一下我的前端功底
 * 首先我要准备一个div
 */
#div1{
    border: 1px solid red;
    width: 400px;
    height: 400px;
}
/* 接下来,我把div变成一个八卦图
 * 注意看好了...
 * 首先把div变成一个圆圈
 **/
#div1{
    border-radius: 50%;
    box-shadow: 0 0 3px rgba(0,0,0,0.5);
    border: none;
}
/* 八卦是阴阳形成的
 * 一黑,一白
 **/
`
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },10)
}
step()

然后使用背景渐变...

在谷歌搜做:css gradient background generator

背景渐变:传送门

左边,修改颜色#fff

右边修改颜色#000

合并

代码就在下面:

代码语言:javascript
复制
background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 50%, rgba(0,0,0,1) 50%, rgba(0,0,0,1) 100%);

然后贴到,JS的代码中

代码语言:javascript
复制
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/* 你好,我是曾老湿
 * 接下来我演示一下我的前端功底
 * 首先我要准备一个div
 */
#div1{
    border: 1px solid red;
    width: 400px;
    height: 400px;
}
/* 接下来,我把div变成一个八卦图
 * 注意看好了...
 * 首先把div变成一个圆圈
 **/
#div1{
    border-radius: 50%;
    box-shadow: 0 0 3px rgba(0,0,0,0.5);
    border: none;
}
/* 八卦是阴阳形成的
 * 一黑,一白
 **/
#div1{
    background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 50%, rgba(0,0,0,1) 50%, rgba(0,0,0,1) 100%);
}
`
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },10)
}
step()
=c
=c

然后我们需要添加两个圆圈,使用伪元素

代码语言:javascript
复制
#div1::before{
    content: '1';
}
#div1::after{
    content: '2';
}

看起来像span元素,我们需要加上display:block

代码语言:javascript
复制
#div1::before{
    content: '1';
    display: block;
}
#div1::after{
    content: '2';
    display: block;
}

加上border

代码语言:javascript
复制
#div1::before{
    content: '1';
    display: block;
    border: 1px solid red;
}
#div1::after{
    content: '2';
    display: block;
    border: 1px solid red;
}

这段代码,我们可以隐藏起来,所以我们可以放在html中

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    <style id='style'></style>
    <span id="demo"></span>
    <div id="div1"></div>
    <style>
    #div1{
        position: fixed;
        right: 20px;
        top: 20px;
    }
    #div1::before{
        content: '1';
        display: block;
        border: 1px solid red;
    }
    #div1::after{
        content: '2';
        display: block;
        border: 1px solid red;
    }
    </style>
    <script src="main.js"></script>
</body>
</html>
代码语言:javascript
复制
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/* 你好,我是曾老湿
 * 接下来我演示一下我的前端功底
 * 首先我要准备一个div
 */
#div1{
    border: 1px solid red;
    width: 400px;
    height: 400px;
}
/* 接下来,我把div变成一个八卦图
 * 注意看好了...
 * 首先把div变成一个圆圈
 **/
#div1{
    border-radius: 50%;
    box-shadow: 0 0 3px rgba(0,0,0,0.5);
    border: none;
}
/* 八卦是阴阳形成的
 * 一黑,一白
 **/
#div1{
    background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 50%, rgba(0,0,0,1) 50%, rgba(0,0,0,1) 100%);
}
`
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },10)
}
step()

然后我们加两个小球

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    <style id='style'></style>
    <span id="demo"></span>
    <div id="div1"></div>
    <style>
    #div1{
        position: fixed;
        right: 20px;
        top: 20px;
    }
    #div1::before{
        content: '';
        display: block;
        position: absolute;
    }
    #div1::after{
        content: '';
        display: block;
        position: absolute;
    }
    </style>
    <script src="main.js"></script>
</body>
</html>
代码语言:javascript
复制
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/* 你好,我是曾老湿
 * 接下来我演示一下我的前端功底
 * 首先我要准备一个div
 */
#div1{
    border: 1px solid red;
    width: 400px;
    height: 400px;
}
/* 接下来,我把div变成一个八卦图
 * 注意看好了...
 * 首先把div变成一个圆圈
 **/
#div1{
    border-radius: 50%;
    box-shadow: 0 0 3px rgba(0,0,0,0.5);
    border: none;
}
/* 八卦是阴阳形成的
 * 一黑,一白
 **/
#div1{
    background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 50%, rgba(0,0,0,1) 50%, rgba(0,0,0,1) 100%);
}
/* 加两个神秘的冲天揪
 **/
#div1::before{
    width: 200px;
    height: 200px;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #000;
    border-radius: 50%;
}
#div1::after{
    width: 200px;
    height: 200px;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #fff;
    border-radius: 50%;
}
 `
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },0)
}
step()

黑色的里面要抠出白色的圆,白色的里面要抠出黑色的圆。这个时候我们没有其他div可以用了,所以我们可以使用,颜色渐变。

进项渐变

代码语言:javascript
复制
background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 25%, rgba(0,0,0,1) 25%, rgba(0,0,0,1) 100%);

代码语言:javascript
复制
background: radial-gradient(circle, rgba(0,0,0,1) 0%, rgba(0,0,0,1) 25%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 100%);

复制代码,到JS中

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    <style id='style'></style>
    <span id="demo"></span>
    <div id="div1"></div>
    <style>
    #div1{
        position: fixed;
        right: 20px;
        top: 20px;
    }
    #div1::before{
        content: '';
        display: block;
        position: absolute;
    }
    #div1::after{
        content: '';
        display: block;
        position: absolute;
    }
    </style>
    <script src="main.js"></script>
</body>
</html>
代码语言:javascript
复制
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/* 你好,我是曾老湿
 * 接下来我演示一下我的前端功底
 * 首先我要准备一个div
 */
#div1{
    border: 1px solid red;
    width: 400px;
    height: 400px;
}
/* 接下来,我把div变成一个八卦图
 * 注意看好了...
 * 首先把div变成一个圆圈
 **/
#div1{
    border-radius: 50%;
    box-shadow: 0 0 3px rgba(0,0,0,0.5);
    border: none;
}
/* 八卦是阴阳形成的
 * 一黑,一白
 **/
#div1{
    background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 50%, rgba(0,0,0,1) 50%, rgba(0,0,0,1) 100%);
}
/* 加两个神秘的冲天揪
 **/
#div1::before{
    width: 200px;
    height: 200px;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #000;
    background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 25%, rgba(0,0,0,1) 25%, rgba(0,0,0,1) 100%);
    border-radius: 50%;
}
#div1::after{
    width: 200px;
    height: 200px;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #fff;
    background: radial-gradient(circle, rgba(0,0,0,1) 0%, rgba(0,0,0,1) 25%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 100%);
    border-radius: 50%;
}
 `
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },0)
}
step()

但是...what the fuck 又出问题了。页面不够高了,下面的代码看不见了...需要我们自己手动混动条。

优化太极

页面不够高,还有手机的问题,无论如何,都要兼容手机


用户不用拖滚动条就能看到后面的内容

JS控制滚动条的位置:

代码语言:javascript
复制
window.scrollTo(x,y);

怎么使用呢?把它加到step中

代码语言:javascript
复制
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        window.scrollTo(0,999999);
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },0)
}

但是左右的代码,还是看着费劲,不会自动换行。

代码语言:javascript
复制
word-break: break-all;

把html中的span改成div,让后加上自动换行

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    <style id='style'></style>
    <div id="demo"></div>
    <div id="div1"></div>
    <style>
        #demo{
            word-break: break-all;
        }
        #div1{
            position: fixed;
            right: 20px;
            top: 20px;
        }
        #div1::before{
            content: '';
            display: block;
            position: absolute;
        }
        #div1::after{
            content: '';
            display: block;
            position: absolute;
        }
    </style>
    <script src="main.js"></script>
</body>
</html>
代码语言:javascript
复制
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/* 你好,我是曾老湿
 * 接下来我演示一下我的前端功底
 * 首先我要准备一个div
 */
#div1{
    border: 1px solid red;
    width: 400px;
    height: 400px;
}
/* 接下来,我把div变成一个八卦图
 * 注意看好了...
 * 首先把div变成一个圆圈
 **/
#div1{
    border-radius: 50%;
    box-shadow: 0 0 3px rgba(0,0,0,0.5);
    border: none;
}
/* 八卦是阴阳形成的
 * 一黑,一白
 **/
#div1{
    background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 50%, rgba(0,0,0,1) 50%, rgba(0,0,0,1) 100%);
}
/* 加两个神秘的冲天揪
 **/
#div1::before{
    width: 200px;
    height: 200px;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #000;
    background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 25%, rgba(0,0,0,1) 25%, rgba(0,0,0,1) 100%);
    border-radius: 50%;
}
#div1::after{
    width: 200px;
    height: 200px;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #fff;
    background: radial-gradient(circle, rgba(0,0,0,1) 0%, rgba(0,0,0,1) 25%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 100%);
    border-radius: 50%;
}
 `
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        window.scrollTo(0,999999);
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },0)
}
step()


手机调试

这...**的是一个什么玩意?

媒体查询,判断手机的宽度,小于500是手机,然后加个样式 试一试

代码语言:javascript
复制
@media (max-width: 500px){
     body{
        color: red;
     }
}

接下来,我们改成上下结构

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    <style id='style'></style>
    <div id="demo"></div>
    <div id="div1"></div>
    <style>
        #demo{
            word-break: break-all;
        }
        #div1{
            position: fixed;
            right: 20px;
            top: 20px;
        }
        #div1::before{
            content: '';
            display: block;
            position: absolute;
        }
        #div1::after{
            content: '';
            display: block;
            position: absolute;
        }
        @media (max-width: 500px){
            #demo{
                height: 50vh;
            }
            #div1{
                height: 50vh;
                position: relative;
                top: 0;
                right: 0;
            }
        }
    </style> 
    <script src="main.js"></script>
</body>
</html>

这玩意变成了一个很丑的椭圆。

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    <style id='style'></style>
    <div id="demo"></div>
    <div id="div1Wrapper">
        <div id="div1"></div>
    </div>
    <style>
        * {margin: 0;padding: 0;box-sizing: border-box;}
        *::after{
            box-sizing: border-box;
        }
        *::before{
            box-sizing: border-box;
        }
        #demo{
            word-break: break-all;
        }
        #div1{
            position: fixed;
            right: 20px;
            top: 20px;
        }
        #div1::before{
            content: '';
            display: block;
            position: absolute;
        }
        #div1::after{
            content: '';
            display: block;
            position: absolute;
        }
        @media (max-width: 500px){
            #demo{
                height: 50vh;
                overflow: auto;
            }
            #div1Wrapper{
                height: 50vh;
            }
            #div1{
                position: relative;
                top: 0;
                right: 0;
            }
        }
    </style> 
    <script src="main.js"></script>
</body>
</html>```

```JS
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/* 你好,我是曾老湿
 * 接下来我演示一下我的前端功底
 * 首先我要准备一个div
 */
#div1{
    border: 1px solid red;
    width: 200px;
    height: 200px;
}
/* 接下来,我把div变成一个八卦图
 * 注意看好了...
 * 首先把div变成一个圆圈
 **/
#div1{
    border-radius: 50%;
    box-shadow: 0 0 3px rgba(0,0,0,0.5);
    border: none;
}
/* 八卦是阴阳形成的
 * 一黑,一白
 **/
#div1{
    background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 50%, rgba(0,0,0,1) 50%, rgba(0,0,0,1) 100%);
}
/* 加两个神秘的冲天揪
 **/
#div1::before{
    width: 100px;
    height: 100px;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #000;
    background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 25%, rgba(0,0,0,1) 25%, rgba(0,0,0,1) 100%);
    border-radius: 50%;
}
#div1::after{
    width: 100px;
    height: 100px;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #fff;
    background: radial-gradient(circle, rgba(0,0,0,1) 0%, rgba(0,0,0,1) 25%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 100%);
    border-radius: 50%;
}
 `
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        window.scrollTo(0,999999);
        demo.scrollTo(0,999999)
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },0)
}
step()

最后,我们在PC页面,把太极居中

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
</head>
<body>
    <style id='style'></style>
    <div id="demo"></div>
    <div id="div1Wrapper">
        <div id="div1"></div>
    </div>
    <style>
        * {margin: 0;padding: 0;box-sizing: border-box;}
        *::after{
            box-sizing: border-box;
        }
        *::before{
            box-sizing: border-box;
        }
        #demo{
            word-break: break-all;
        }
        #div1{
            position: fixed;
            left: 50%;
            transform: translateX(-50%);
            top: 20px;
        }
        #div1::before{
            content: '';
            display: block;
            position: absolute;
        }
        #div1::after{
            content: '';
            display: block;
            position: absolute;
        }
        @media (max-width: 500px){
            #demo{
                height: 50vh;
                overflow: auto;
            }
            #div1Wrapper{
                height: 50vh;
            }
            #div1{
                position: relative;
                top: 0;
                right: 0;
            }
        }
    </style> 
    <script src="main.js"></script>
</body>
</html>
代码语言:javascript
复制
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/* 你好,我是曾老湿
 * 接下来我演示一下我的前端功底
 * 首先我要准备一个div
 */
#div1{
    border: 1px solid red;
    width: 200px;
    height: 200px;
}
/* 接下来,我把div变成一个八卦图
 * 注意看好了...
 * 首先把div变成一个圆圈
 **/
#div1{
    border-radius: 50%;
    box-shadow: 0 0 3px rgba(0,0,0,0.5);
    border: none;
}
/* 八卦是阴阳形成的
 * 一黑,一白
 **/
#div1{
    background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 50%, rgba(0,0,0,1) 50%, rgba(0,0,0,1) 100%);
}
/* 加两个神秘的冲天揪
 **/
#div1::before{
    width: 100px;
    height: 100px;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #000;
    background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 25%, rgba(0,0,0,1) 25%, rgba(0,0,0,1) 100%);
    border-radius: 50%;
}
#div1::after{
    width: 100px;
    height: 100px;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #fff;
    background: radial-gradient(circle, rgba(0,0,0,1) 0%, rgba(0,0,0,1) 25%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 100%);
    border-radius: 50%;
}
 `
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        window.scrollTo(0,999999);
        demo.scrollTo(0,999999)
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },0)
}
step()

使用parcel部署代码

代码语言:javascript
复制
MacBook-Pro:cv-1 driverzeng$ parcel build src/index.html --public-url .

会发现parcel 会自动把style吃了。

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>会动的代码</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <style id='style'></style>
    <div id="demo"></div>
    <div id="div1Wrapper">
        <div id="div1"></div>
    </div>
    <script src="main.js"></script>
</body>
</html>
代码语言:javascript
复制
* {margin: 0;padding: 0;box-sizing: border-box;}
*::after{
    box-sizing: border-box;
}
*::before{
    box-sizing: border-box;
        }
#demo{
    word-break: break-all;
}
#div1{
    position: fixed;
    left: 50%;
     transform: translateX(-50%);
    top: 20px;
        }
#div1::before{
    content: '';
    display: block;
    position: absolute;
}
#div1::after{
    content: '';
    display: block;
    position: absolute;
 }
@media (max-width: 500px){
    #demo{
        height: 50vh;
        overflow: auto;
     }
    #div1Wrapper{
        height: 50vh;
    }
    #div1{
         position: relative;
        top: 0;
        right: 0;
    }
}
代码语言:javascript
复制
let demo = document.querySelector('#demo')
let style = document.querySelector('#style')
let n = 0
let string = `/* 你好,我是曾老湿
 * 接下来我演示一下我的前端功底
 * 首先我要准备一个div
 */
#div1{
    border: 1px solid red;
    width: 200px;
    height: 200px;
}
/* 接下来,我把div变成一个八卦图
 * 注意看好了...
 * 首先把div变成一个圆圈
 **/
#div1{
    border-radius: 50%;
    box-shadow: 0 0 3px rgba(0,0,0,0.5);
    border: none;
}
/* 八卦是阴阳形成的
 * 一黑,一白
 **/
#div1{
    background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 50%, rgba(0,0,0,1) 50%, rgba(0,0,0,1) 100%);
}
/* 加两个神秘的冲天揪
 **/
#div1::before{
    width: 100px;
    height: 100px;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #000;
    background: radial-gradient(circle, rgba(255,255,255,1) 0%, rgba(255,255,255,1) 25%, rgba(0,0,0,1) 25%, rgba(0,0,0,1) 100%);
    border-radius: 50%;
}
#div1::after{
    width: 100px;
    height: 100px;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
    background: #fff;
    background: radial-gradient(circle, rgba(0,0,0,1) 0%, rgba(0,0,0,1) 25%, rgba(255,255,255,1) 25%, rgba(255,255,255,1) 100%);
    border-radius: 50%;
}
 `
let string2 = ""
let step = () =>{
    setTimeout(()=>{
        if(string[n]==='\n'){
            string2 += '<br>';
        }else if(string[n]===' '){
            string2 += '&nbsp'
        }
        else{
            string2 += string[n]
        }
        demo.innerHTML = string2;
        style.innerHTML = string.substring(0,n);
        window.scrollTo(0,999999);
        demo.scrollTo(0,999999)
        if(n +1 < string.length){
            n+=1
            step()
        }      
    },0)
}
step()
bea
bea

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 让代码动起来
  • 开始画太极
  • 优化太极
  • 使用parcel部署代码
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档