Введение в проект
Резюме, которое может автоматически воспроизводить процесс написания, в основном используя знания нативного JS и CSS3.
Используемые библиотеки:
Ссылки по теме
процесс проектирования
Основная идея - двигаться
-
Найдите способ, чтобы текст появлялся на странице один за другим.
setTimeout(()=>{ document.body.innerHTML='1' },1000) setTimeout(()=>{ document.body.innerHTML='2' },2000) setTimeout(()=>{ document.body.innerHTML='3' },3000)
-
Это сработало, но это глупо, почему бы нам не попробовать
setInterval
плюсslice()
илиsubstring()
var result = '1234567890' var n = 0 setInterval(()=>{ n += 1 document.body.innerHTML = result.substring(0,n) },500)
slice()
иsubstring()
Разница в том,substring()
Отрицательные аргументы не принимаются -
И начинаются, и заканчиваются. Найдите способ отключить будильник
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
-
Замените содержимое с помощью 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, если несколько невидимых символов появляются подряд, браузер будет думать, что это пробел.
-
использовать
<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)
-
код приложения
Сейчас мы просто показываем код, но видим эффект, поэтому напишем код на
<style>
середина<head> <style id="myStyle"></style> </head> <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) myStyle.innerHTML = result.substring(0,n) if(n>=result.length){ window.clearInterval(clock) } },500)
идеальные детали
-
нет эффекта? Поскольку текст также написан на
Обходной путь: закомментируйте содержимое CSS
/*你好,我是不远,一名前端工程师。 请允许我做一个简单的自我介绍,但是文字太单调,所以我想来点特别的。 首先我准备一下样式。 */ *{ transition: all 1s; } html{ background:#363636 color:#fff; font-size:16px; }
-
Подсветка кода? Первое, о чем нужно подумать, это решить эту проблему,
<span style="color":red;>html</span>
Но такой синтаксис не разрешен в CSS.
- Способ 1: украсть балку и заменить колонну
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)
Однако это глупо и утомительно, и хорошие программисты должны научиться быть ленивыми.
-
Способ 2: prism.js После введения файлов JS и CSS официального сайта prism
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)
-
Изменения подсветки кода Нам нужно сделать так, чтобы код по умолчанию выглядел ничем не примечательным, а затем добавить эффект подсветки. Это повысит зрительную оценку.
-
установить стиль по умолчанию Нам нужно ввести CSS-файл стиля по умолчанию в html, содержимое — это настройки стиля по умолчанию для кода.
.token.selector{ color: black; } .token.property{ color: black; } .token.punctuation{ color: black; }
-
Установить стиль выделения
.token.selector{ color: #a6e22e; } .token.property{ color: #f92672; } .token.punctuation{ color: #f8f8f2; }
-
Примечание 1: имя вышеуказанного класса предоставлено призмой, и имя можно увидеть, проверив элемент.
-
Примечание 2. Файлы CSS следует размещать под импортированным стилем призмы во избежание перезаписи.
-
добавить html-элемент
-
После запуска CSS выполняется вторая функция для управления html, а третья функция управляет стилем html.
var n = 0 var clock = setInterval(() => { //原代码不变 if (n >= result.length) { window.clearInterval(clock) fn2() fn3() } }, 10)
-
определить fn2()
function fn2(){ var paper = document.createElement('div') paper.id = 'paper' document.body.appendChild(paper) }
-
Определите 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) }
функция-оболочка
- функция-оболочка
/*把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内容)
-
Перезвони
После инкапсуляции, когда мы хотим вызвать сразу
f2()
, опять смутился. так какsetInterval()
это будильник (асинхронный), поэтому после установки будильника он сработает сразуf2()
, но правильная логика выполнения находится вcode
Звоните после написанияf2()
-
Не дожидаясь результатовэтоасинхронный
-
ПерезвониЭто способ получить асинхронные результаты (вы также можете получить синхронные результаты)
-
-
Чтобы предотвратить перезапись предыдущего кода, мы добавляем параметр
prefix
function writeCode(prefix,code,fn){ //.... } }, 10) }
-
функция вызова
При первом вызове контента раньше не было, поэтому мы
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) }) })
Продолжайте уточнять детали
-
Оптимизируйте окно отображения кода, чтобы оно было таким же высоким, как окно отображения; установите его как
#code{ height: 100vh; overflow: hidden; }
-
Автоматически прокрутите код вниз, а затем добавьте код в инкапсулированную функцию.
function writeCode(prefix, code, fn) {
//...
domCode.scrollTop=domCode.scrollHeight
//...
}, 10)
}
Element.scrollTop
Свойство может получить или задать количество пикселей, на которое содержимое элемента прокручивается по вертикали.
-
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)
в синтаксис уценки
Используйте сторонние библиотеки**marked.js**
document.querySelector('#paper').innerHTML = marked(markdown)
fn.call()
}
На этом написание в основном закончено, а остальное — последовательность асинхронных вызовов функций. Затем медленно измените стиль CSS. ты можешь закончить работу
- не далеко