特效描述:html5 酷炫的文字 打字动画特效。html5和css3制作键盘输入文字酷炫的打字动画特效。

代码结构

1. 引入JS

2. HTML代码

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

const getEl = el => document.getElementById(el)

const setStyle = (el, prop, val) => el.style[prop] = val

const setAttr = (el, attr, val) => el.setAttribute(attr, val)

const addClass = (el, className) => el.classList.add(className)

const removeClass = (el, className) => el.classList.remove(className)

const resetStyles = el => el.removeAttribute('style')

const removeAllChildren = el => {

while (el.hasChildNodes()) el.removeChild(el.lastChild)

}

const WRAPPER = getEl('wrapper'),

PAPER = getEl('paper'),

LETTERS = getEl('letters'),

CURSOR = getEl('cursor')

let HAS_STARTED_TYPING = false,

LAST_TYPE_TIMESTAMP = 0

const MIN_COL = 9,

MAX_COL = (LETTERS.clientWidth / 10) - 2,

MIN_ROW = 4,

MAX_ROW = 34,

LETTER_WIDTH = 10,

LETTER_HEIGHT = 20,

COLORS = {

BLUE: 'rgb(3,169,244)',

RED: 'rgb(239,83,80)',

PURPLE: 'rgb(171,71,188)',

GREEN: 'rgb(67,160,71)',

YELLOW:' rgb(253,216,53)'

}

const STATE = {

range: 0.1,

pos: {

row: MIN_ROW,

col: MIN_COL

}

}

const getRandColor = () => {

const rand = Math.floor((Math.random() * 5) + 1)

switch(rand){

case 1:

return COLORS.BLUE

case 2:

return COLORS.RED

case 3:

return COLORS.PURPLE

case 4:

return COLORS.GREEN

case 5:

return COLORS.YELLOW

}

}

const getRandPosOffScreen = () => {

const lowX1 = 0 - (window.innerWidth * 0.3),

highX1 = 0 - (window.innerWidth * 0.2),

lowY1 = 0,

highY1 = window.innerHeight,

lowX2 = window.innerWidth * 1.2,

highX2 = window.innerWidth * 1.3,

lowY2 = 0,

highY2 = window.innerHeight,

lowX3 = 0,

highX3 = window.innerWidth,

lowY3 = 0 - (window.innerHeight * 0.3),

highY3 = 0 - (window.innerHeight * 0.2),

lowX4 = 0,

highX4 = window.innerWidth,

lowY4 = window.innerHeight * 1.2,

highY4 = window.innerHeight * 1.3

const rand = Math.floor((Math.random() * 4) + 1)

let x = 0,

y = 0

switch(rand){

case 1:

x = Math.floor(Math.random() * (highX1 - lowX1 + 1)) + lowX1

y = Math.floor(Math.random() * (highY1 - lowY1)) + lowY1

break

case 2:

x = Math.floor(Math.random() * (highX2 - lowX2 + 1)) + lowX2

y = Math.floor(Math.random() * (highY2 - lowY2)) + lowY2

break

case 3:

x = Math.floor(Math.random() * (highX3 - lowX3 + 1)) + lowX3

y = Math.floor(Math.random() * (highY3 - lowY3)) + lowY3

break

case 4:

x = Math.floor(Math.random() * (highX4 - lowX4 + 1)) + lowX4

y = Math.floor(Math.random() * (highY4 - lowY4)) + lowY4

break

}

return { x, y }

}

const setLetterPos = (letter, x, y) => {

setStyle(letter, 'left', x + 'px')

setStyle(letter, 'top', y + 'px')

}

const setLetterColor = letter => {

const color = getRandColor()

setStyle(letter, 'color', color)

}

const createLetter = key => {

const letter = document.createElement('div')

letter.innerHTML = key

setLetterColor(letter)

addClass(letter, 'off-screen')

addClass(letter, 'letter')

return letter

}

const setInitialLetterPos = letter => {

const pos = getRandPosOffScreen()

setLetterPos(letter, pos.x, pos.y)

}

const isValidLetter = e => {

return !e.ctrlKey

&& e.key !== 'Enter'

&& !(e.key === ' ' && STATE.pos.col === MIN_COL)

}

const isEndOfPage = () => {

return STATE.pos.row === MAX_ROW && STATE.pos.col === MAX_COL

}

const initializeLetter = key => {

const letter = createLetter(key)

setInitialLetterPos(letter)

LETTERS.appendChild(letter)

return letter

}

const bumpLetterPos = isUp => {

if(isUp){

if(STATE.pos.col < MAX_COL){

STATE.pos.col = Math.min(STATE.pos.col + 1, MAX_COL)

}

else{

STATE.pos.col = MIN_COL

STATE.pos.row = Math.min(STATE.pos.row + 1, MAX_ROW)

}

}

else{

if(STATE.pos.col > MIN_COL){

STATE.pos.col = Math.max(STATE.pos.col - 1, MIN_COL)

}

else{

STATE.pos.col = MAX_COL

STATE.pos.row = Math.max(STATE.pos.row - 1, MIN_ROW)

}

}

}

const bumpCursorPos = () => {

const x = STATE.pos.col * LETTER_WIDTH + CURSOR.clientWidth,

y = STATE.pos.row * LETTER_HEIGHT

setLetterPos(CURSOR, x, y)

}

const determineFinalLetterPos = () => {

let x = 0,

y = 0

if(STATE.pos.col <= MAX_COL){

x = STATE.pos.col * LETTER_WIDTH

y = STATE.pos.row * LETTER_HEIGHT

}

else{

x = STATE.pos.col * LETTER_WIDTH

y = (STATE.pos.row + 1) * LETTER_HEIGHT

}

bumpLetterPos(true)

bumpCursorPos()

return {x, y}

}

const setFinalLetterPos = letter => {

const pos = determineFinalLetterPos()

setLetterPos(letter, pos.x, pos.y)

}

const getLastLetter = () => {

const letters = LETTERS.childNodes

let letter = null

for(let i = letters.length - 1; i >= 0; i--){

if(!letters[i].dataset.removed){

letter = letters[i]

break

}

}

return letter

}

const setLeavingLetterPos = letter => {

const pos = getRandPosOffScreen()

setLetterPos(letter, pos.x, pos.y)

addClass(letter, 'off-screen')

}

const removeLetter = () => {

const letter = getLastLetter(),

color = getRandColor()

if(letter === null) return 0

LAST_TYPE_TIMESTAMP = moment()

setStyle(letter, 'color', color)

setLeavingLetterPos(letter)

setAttr(letter, 'data-removed', true)

bumpLetterPos(false)

bumpCursorPos()

setTimeout(() => {

LETTERS.removeChild(letter)

}, 500)

}

const handleAlternateKeys = e => {

switch(e.keyCode){

case 8: // Backspace

removeLetter()

break

case 9: // Tab

e.preventDefault()

break

case 13: // Enter

break

}

}

const typeLetter = key => {

LAST_TYPE_TIMESTAMP = moment()

const letter = initializeLetter(key)

setFinalLetterPos(letter)

setTimeout(() => {

removeClass(letter, 'off-screen')

setTimeout(() => setStyle(letter, 'color', 'black'), 500)

}, 13)

}

let typeInterval = null

const typeSentence = sentence => {

let i = 0

typeInterval = setInterval(() => {

typeLetter(sentence[i])

if(i === sentence.length - 1) clearInterval(typeInterval)

i++

}, 200)

}

const onInitialType = () => {

STATE.pos.row = MIN_ROW

STATE.pos.col = MIN_COL

removeAllChildren(LETTERS)

clearInterval(typeInterval)

HAS_STARTED_TYPING = true

}

const checkIfTyping = () => {

const timeToLastType = moment() - LAST_TYPE_TIMESTAMP

if(!PAPER.classList.contains('typing') && timeToLastType <= 300){

addClass(PAPER, 'typing')

}

else if(PAPER.classList.contains('typing') && timeToLastType > 300){

removeClass(PAPER, 'typing')

}

}

window.onkeypress = e => {

if(!HAS_STARTED_TYPING) onInitialType()

if(!isEndOfPage() && isValidLetter(e)) typeLetter(e.key)

}

window.onkeydown = e => {

if(!HAS_STARTED_TYPING) onInitialType()

handleAlternateKeys(e)

}

window.onload = () => {

typeSentence('Start typing something!')

setInterval(() => checkIfTyping(), 300)

}

ae制h5文字动画_html5酷炫的文字打字动画特效相关推荐

  1. android 蒙层动画,Android酷炫加载进度动画

    一.概述 本自定义动画进度酷炫View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙 ...

  2. 情人节程序员用HTML网页表白【彩色酷炫的空间背景动画特效】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript

    这是程序员表白系列中的100款网站表白之一,旨在让任何人都能使用并创建自己的表白网站给心爱的人看. 此波共有100个表白网站,可以任意修改和使用,很多人会希望向心爱的男孩女孩告白,生性腼腆的人即使那个 ...

  3. android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码...

    Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...

  4. HTML5+CSS3小实例:酷炫的文字裂开特效

    HTML5+CSS3实现酷炫的文字裂开特效,鼠标悬停,文字上下裂开,中间显示更多说明,悬停时,其他文字模糊,不说了,看看效果有多酷炫吧! 效果: 源码: <!DOCTYPE html> & ...

  5. android 漩涡动画,html5 canvas酷炫的粒子漩涡动画特效

    特效描述:html5 canvas 粒子漩涡 动画特效.html5粒子漩涡动画,酷炫的粒子动画特效 代码结构 1. HTML代码 function project3D(x,y,z,vars){ var ...

  6. android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码

    Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...

  7. android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码... 1

    Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...

  8. html5 canvas 烟花,html5 canvas酷炫的烟花爆炸动画特效

    特效描述:html5canvas 酷炫的 烟花爆炸动画特效.html5点击页面烟花爆炸动画,3D烟花动画,酷炫的烟花特效. 代码结构 1. 引入JS 2. HTML代码 点击页面 (function( ...

  9. canvas 形状碰撞_【案例】如何用html5 制作canvas酷炫的网状图形动画特效

    点击上方[我分享我快乐]→[...]右上角→[设为星标⭐]即可第一时间获取最新设计资源 哈喽大家好,又到了每周二案例环节啦,在教学开始前先插播一条招聘信息~ 高薪招聘 杭州招聘(非技术) 公司背景: ...

最新文章

  1. Udacity机器人软件工程师课程笔记(十九) - 3D感知介绍 - 主动/被动式传感器、RGB-D相机、点云
  2. [BZOJ 5093]图的价值
  3. 如何去maven仓库下载jar包
  4. UNICODE转多字节
  5. 一级计算机综合训练第五卷,2018职称计算机考试基础综合练习及答案(5)
  6. PHP Redis 集群封装类
  7. 类文件到虚拟机(类加载机制)
  8. open函数返回-1_python常用函数大总结
  9. 视频会议十大开源编解码项目排行
  10. [原创]Scala学习:流程控制,异常处理
  11. Vue 炫酷 Echarts 图表
  12. 21_nips_深度学习损失景观的嵌入原则
  13. 在计算机硬盘使用前需要做的工作是,工作电脑的硬盘该如何保养
  14. 义哥征途登录显示服务器维护中,征途单机版
  15. 监督和无监督、分类和回归算法总结
  16. php 二维码在线识别api
  17. 量子计算(十四):超导量子芯片
  18. python输入二维数组_Python输入二维数组方法
  19. 数字信号处理专业术语翻译
  20. 微信 开发诡异的40029错误invalid code错误 443 failed to respond错误的解决办法

热门文章

  1. 关于ERP系统提前期运算逻辑的三点介绍
  2. 基于安卓的校园订餐系统开发设计
  3. 算法设计-利用栈判别表达式中的括弧是否配对
  4. c++文件保存与读取
  5. 一起学英语-英语名词,代词,动词辨析,混合词序,原级比较,形容词副词比较,多音节形容词,接词连词冠词,动词时态
  6. 如何在NLP领域做成一件事by周明ACL计算语言学会候任主席(附PDF公号发“NLP做事”下载rar讲座PPT等10文件)...
  7. 「π」里藏着所有人的银行卡密码和生日?
  8. swing(二十一)
  9. 四十四、​Fluent 收敛标准-质量和能量守恒
  10. pe中怎么卸载服务器系统更新,如何卸载win7系统更新用pe装win7