实战项目之自动简历

项目介绍

一个可以自动播放书写过程简历,主要运用原生JS和CSS3的知识点。

用到的库:

  1. prism
  2. marked

相关链接

  1. 预览点我
  2. 源码点我

设计过程

基本思想—动起来

  1. 想办法让文字逐个出现在页面中

    setTimeout(()=>{
        document.body.innerHTML='1'
    },1000)
    setTimeout(()=>{
        document.body.innerHTML='2'
    },2000)
    setTimeout(()=>{
        document.body.innerHTML='3'
    },3000)
    
    
  2. 成功了,但是有点傻,为何我们不试一试setInterval加上slice()或者substring()

    var result = '1234567890'
    var n = 0
    setInterval(()=>{
        n += 1
        document.body.innerHTML = result.substring(0,n)
    },500)
    
    

    slice()substring()的区别是,substring()不接受负的参数

  3. 既要开始,也要结束。想办法取消闹钟

    var result = '1234567890'
    var n = 0
    var clock = setInterval(()=>{
        n += 1
        document.body.innerHTML = result.substring(0,n)
       if(n>=result.length){
           window.clearInterval(clock)
       }
    },500)
    
    

换成CSS

  1. 将内容换成CSS

    var result = `
    body{
       background:green;
    }
    `
    var n = 0
    var clock = setInterval(()=>{
       n += 1
       document.body.innerHTML = result.substring(0,n)
      if(n>=result.length){
          window.clearInterval(clock)
      }
    },500)
    
    

    运行一下。黑人问号脸——我的换行没啦???

    这是因为在HTML里面,连续出现多个看不见的字符,浏览器会认为它是一个空格

  2. 利用<pre>标签

    HTML<pre>元素表示预定义格式文本。在该元素中的文本通常按照原文件中的编排,以等宽字体的形式展现出来,文本中的空白符(比如空格和换行符)都会显示出来。

    HTML中加入<pre>标签,将内容写到<pre>

    
    <body>
    <pre id="code"></pre>
    </body>
    
    
    var result = `
    body{
        background:green;
    }
    `
    var n = 0
    var clock = setInterval(()=>{
        n += 1
        code.innerHTML = result.substring(0,n)
       if(n>=result.length){
           window.clearInterval(clock)
       }
    },100)
    
    
  3. 应用代码

    现在我们只是将代码展示了出来,但是看到效果,所以我们要将代码写入到<style>

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>会动的简历</title>
      <style id="myStyle">
      </style>
    </head>
    <body>
    <pre id="code">
    </pre>
    </body>
    </html>
    
    
    var result = `
    body{
        background:green;
    }
    `
    var n = 0
    var clock = setInterval(()=>{
        n += 1
        code.innerHTML = result.substring(0,n)
        myStyle.innerHTML = result.substring(0,n)
       if(n>=result.length){
           window.clearInterval(clock)
       }
    },500)
    
    

完善细节

  1. 没效果?因为文字也写了进去

    解决办法-将除去CSS内容进行注释

    /*你好,我是不远,一名前端工程师。
    请允许我做一个简单的自我介绍,但是文字太单调,所以我想来点特别的。
    首先我准备一下样式。
    */
    *{
        transition: all 1s;
    }
    html{
        background:#363636
        color:#fff;
        font-size:16px;
    }
    
    
  2. 代码高亮? 首先会想到这样去解决,

    <span style="color":red;>html</span>
    
    

    但是在CSS中这样的语法是不允许的。

    • 方法一:偷梁换柱
         var n = 0
         var clock = setInterval(()=>{
             n += 1
             code.innerHTML = result.substring(0,n)
             code.innerHTML = code.innerHTML.replace('html','<span style="color:red;">html</span>')
             myStyle.innerHTML = result.substring(0,n)
            if(n>=result.length){
                window.clearInterval(clock)
            }
         },500)
    
    

    但是,很傻,很累,好的程序员要学会偷懒

    • 方法二:prism.js 引入prism官网的JS和CSS文件后

      var n = 0
      var clock = setInterval(() => {
          n += 1
          code.innerHTML = result.substring(0, n)
          code.innerHTML = Prism.highlight(code.innerHTML, Prism.languages.css)
          //修改code为prism提供的样式
          myStyle.innerHTML = result.substring(0, n)
          if (n >= result.length) {
              window.clearInterval(clock)
          }
      }, 50)
      
      
  3. 代码高亮变化 我们需要让代码默认是平平无奇的样子,然后再增加高亮效果。这样活增加视觉的观赏性。

    • 设置默认样式 我们需要在html中引入一个默认样式的css文件,内容是对代码的默认样式设置。

      .token.selector{
          color: black;
      }
      .token.property{
          color: black;
      }
      .token.punctuation{
          color: black;
      }
      
      
    • 设置高亮样式

      .token.selector{
        color: #a6e22e;
      }
      .token.property{
        color: #f92672;
      }
      .token.punctuation{
        color: #f8f8f2;
      }
      
      
      • 注意一:上面类的名称是根据prism提供的来的,审查元素可以看到名称

      • 注意二:CSS文件应放在引入的prism样式的下面,以免被覆盖

加入html元素

  1. CSS运行结束,执行第二个函数,控制html;第三个函数控制html样式

    var n = 0
    var clock = setInterval(() => {
    //原代码不变
        if (n >= result.length) {
            window.clearInterval(clock)
            fn2()
            fn3()
        }
    }, 10)
    
    
  2. 定义fn2()

    function fn2(){
        var paper = document.createElement('div')
        paper.id = 'paper'
        document.body.appendChild(paper)
    }
    
    
  3. 定义fn3()做一个左右结构,执行fn3(){}

    function fn3(preResult) {
        var result = `
    #paper{
        width:200px;
        height:400px;
        background:#F1E2C3;
    }
        `
        var n = 0
        var clock = setInterval(() => {
            n += 1
            code.innerHTML = preResult + result.substring(0, n)
            code.innerHTML = Prism.highlight(code.innerHTML, Prism.languages.css)
            myStyle.innerHTML = preResult + result.substring(0, n)
            if (n >= result.length) {
                window.clearInterval(clock)
            }
        }, 10)
    }
    
    

封装函数

  1. 封装函数
  /*把code写到#code和style标签里面*/
  function writeCode(code){
      let domCode = document.querySelector('#code')
      let n = 0
      var clock = setInterval(() => {
          n += 1
          domCode.innerHTML = Prism.highlight(code.substring(0, n), Prism.languages.css)
          myStyle.innerHTML = code.substring(0, n)
          if (n >= code.length) {
              window.clearInterval(clock)
          }
      }, 10)
  }
  //封装
  var result = `......`
  writeCode(cssCode)
  //调用(原result内容)

  1. 回调函数

    封装完毕后,当我们想紧接调用f2()时,又尴尬了。因为setInterval()是一个闹钟(异步),所以在设置好闹钟之后,就会立即执行f2(),可是正确的执行逻辑是在code写完之后再调用f2()

    • 不等结果就是异步

    • 回调是拿到异步结果的一种方式(也可以拿到同步结果)

  2. 防止覆盖之前的代码,我们增加一个参数prefix

    function writeCode(prefix,code,fn){
    //....
            }
        }, 10)
    }
    
    
  3. 调用函数

    第一次调用的时候由于之前没有内容,所以我们prefix''

    function writeCode(prefix, code, fn) {
        let domCode = document.querySelector('#code')
        let n = 0
        var clock = setInterval(() => {
            n += 1
            domCode.innerHTML = Prism.highlight(prefix + code.substring(0, n), Prism.languages.css)
            myStyle.innerHTML = prefix + code.substring(0, n)
            if (n >= code.length) {
                window.clearInterval(clock)
                fn.call()
            }
        }, 10)
    }
    
    

    调用函数

    writeCode('', cssCode, () => {
        createPaper(() => {
            writeCode(cssCode, htmlCode)
        })
    })
    
    

继续优化细节

  1. 优化代码展示窗口,使其和展示窗口一样高;在defulf.css里设置为

    #code{
        height: 100vh;
        overflow: hidden;
    }
    
    
  2. 自动滚动代码至底部,再封装的函数内增加代码

  function writeCode(prefix, code, fn) {
  //...
          domCode.scrollTop=domCode.scrollHeight
  //...        
      }, 10)
  }

Element.scrollTop 属性可以获取或设置一个元素的内容垂直滚动的像素数。

  1. scrollIntoView()方法:

    如果展示窗口设置的是overflow: auto;或者overflow: scroll;会自动拉到底部

    Element.scrollIntoView(false)
    
    

    element.scrollIntoView(false)为滚动至底部

    element.scrollIntoView(true)为滚动至顶部

    其他参数:

    • behavior 可选

      定义缓动动画, "auto", "instant", 或 "smooth" 之一。默认为 "auto"

    • block 可选

      "start", "center", "end", 或 "nearest"之一。默认为 "center"

    • inline 可选

      "start", "center", "end", 或 "nearest"之一。默认为 "nearest"

      element.scrollIntoView({behavior: "instant", block: "end", inline: "nearest"});
      
      

增加简历展示页

编写JS增加编写简历内容的展示窗口。与代码展示窗口类似

function writeMarkdown(markdown, fn) {
    let domPaper = document.querySelector('#paper')
    let n = 0
    var clock = setInterval(() => {
        n += 1
        domPaper.innerHTML = Prism.highlight(markdown.substring(0, n), Prism.languages.markdown)
        domPaper.scrollIntoView({behavior: "instant", block: "end", inline: "nearest"})
        if (n >= markdown.length) {
            window.clearInterval(clock)
            fn.call()
        }
    }, 10)

变成markdown语法

利用第三方库marked.js

    document.querySelector('#paper').innerHTML = marked(markdown)
    fn.call()
}

写到这里基本就结束了,剩下的就是异步函数调用的顺序了。然后再慢慢的修改CSS样式。就可以大工完成了

——远方不远

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,025评论 0 2
  • 一、JS前言 (1)认识JS 也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HT...
    凛0_0阅读 2,749评论 0 8
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,375评论 1 45
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,046评论 1 10
  • 今天分享万维钢老师写的《万万没想到》。 这本书用科学的视角解读生活,告诉我们日常生活中人们习以为常的某些错误观念,...
    易瑾还阅读 612评论 1 4