ae制h5文字动画_html5酷炫的文字打字动画特效
特效描述:html5 酷炫的文字 打字动画特效。html5和css3制作键盘输入文字酷炫的打字动画特效。
代码结构
1. 引入JS
2. HTML代码
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酷炫的文字打字动画特效相关推荐
- android 蒙层动画,Android酷炫加载进度动画
一.概述 本自定义动画进度酷炫View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙 ...
- 情人节程序员用HTML网页表白【彩色酷炫的空间背景动画特效】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
这是程序员表白系列中的100款网站表白之一,旨在让任何人都能使用并创建自己的表白网站给心爱的人看. 此波共有100个表白网站,可以任意修改和使用,很多人会希望向心爱的男孩女孩告白,生性腼腆的人即使那个 ...
- android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码...
Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...
- HTML5+CSS3小实例:酷炫的文字裂开特效
HTML5+CSS3实现酷炫的文字裂开特效,鼠标悬停,文字上下裂开,中间显示更多说明,悬停时,其他文字模糊,不说了,看看效果有多酷炫吧! 效果: 源码: <!DOCTYPE html> & ...
- android 漩涡动画,html5 canvas酷炫的粒子漩涡动画特效
特效描述:html5 canvas 粒子漩涡 动画特效.html5粒子漩涡动画,酷炫的粒子动画特效 代码结构 1. HTML代码 function project3D(x,y,z,vars){ var ...
- android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码
Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...
- android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码... 1
Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...
- html5 canvas 烟花,html5 canvas酷炫的烟花爆炸动画特效
特效描述:html5canvas 酷炫的 烟花爆炸动画特效.html5点击页面烟花爆炸动画,3D烟花动画,酷炫的烟花特效. 代码结构 1. 引入JS 2. HTML代码 点击页面 (function( ...
- canvas 形状碰撞_【案例】如何用html5 制作canvas酷炫的网状图形动画特效
点击上方[我分享我快乐]→[...]右上角→[设为星标⭐]即可第一时间获取最新设计资源 哈喽大家好,又到了每周二案例环节啦,在教学开始前先插播一条招聘信息~ 高薪招聘 杭州招聘(非技术) 公司背景: ...
最新文章
- Udacity机器人软件工程师课程笔记(十九) - 3D感知介绍 - 主动/被动式传感器、RGB-D相机、点云
- [BZOJ 5093]图的价值
- 如何去maven仓库下载jar包
- UNICODE转多字节
- 一级计算机综合训练第五卷,2018职称计算机考试基础综合练习及答案(5)
- PHP Redis 集群封装类
- 类文件到虚拟机(类加载机制)
- open函数返回-1_python常用函数大总结
- 视频会议十大开源编解码项目排行
- [原创]Scala学习:流程控制,异常处理
- Vue 炫酷 Echarts 图表
- 21_nips_深度学习损失景观的嵌入原则
- 在计算机硬盘使用前需要做的工作是,工作电脑的硬盘该如何保养
- 义哥征途登录显示服务器维护中,征途单机版
- 监督和无监督、分类和回归算法总结
- php 二维码在线识别api
- 量子计算(十四):超导量子芯片
- python输入二维数组_Python输入二维数组方法
- 数字信号处理专业术语翻译
- 微信 开发诡异的40029错误invalid code错误 443 failed to respond错误的解决办法
热门文章
- 关于ERP系统提前期运算逻辑的三点介绍
- 基于安卓的校园订餐系统开发设计
- 算法设计-利用栈判别表达式中的括弧是否配对
- c++文件保存与读取
- 一起学英语-英语名词,代词,动词辨析,混合词序,原级比较,形容词副词比较,多音节形容词,接词连词冠词,动词时态
- 如何在NLP领域做成一件事by周明ACL计算语言学会候任主席(附PDF公号发“NLP做事”下载rar讲座PPT等10文件)...
- 「π」里藏着所有人的银行卡密码和生日?
- swing(二十一)
- 四十四、​Fluent 收敛标准-质量和能量守恒
- pe中怎么卸载服务器系统更新,如何卸载win7系统更新用pe装win7