html 随机画圈 不重叠,HTML5文本随机杂乱拼凑动画效果

JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

class TextScramble {

constructor(el) {

this.el = el

this.chars = '!<>-_\\/[]{}—=+*^?#________'

this.update = this.update.bind(this)

}

setText(newText) {

const oldText = this.el.innerText

const length = Math.max(oldText.length, newText.length)

const promise = new Promise((resolve) => this.resolve = resolve)

this.queue = []

for (let i = 0; i < length; i++) {

const from = oldText[i] || ''

const to = newText[i] || ''

const start = Math.floor(Math.random() * 40)

const end = start + Math.floor(Math.random() * 40)

this.queue.push({

from, to, start, end

})

}

cancelAnimationFrame(this.frameRequest)

this.frame = 0

this.update()

return promise

}

update() {

let output = ''

let complete = 0

for (let i = 0, n = this.queue.length; i < n; i++) {

let {

from, to, start, end, char

} = this.queue[i]

if (this.frame >= end) {

complete++

output += to

} else if (this.frame >= start) {

if (!char || Math.random() < 0.28) {

char = this.randomChar()

this.queue[i].char = char

}

output += `${char}`

} else {

output += from

}

}

this.el.innerHTML = output

if (complete === this.queue.length) {

this.resolve()

} else {

this.frameRequest = requestAnimationFrame(this.update)

this.frame++

}

}

randomChar() {

return this.chars[Math.floor(Math.random() * this.chars.length)]

}

}

// ——————————————————————————————————————————————————

// Example

// ——————————————————————————————————————————————————

const phrases = [

'Neo,',

'sooner or later',

'you\'re going to realize',

'just as I did',

'that there\'s a difference',

'between knowing the path',

'and walking the path'

]

const el = document.querySelector('.text')

const fx = new TextScramble(el)

let counter = 0

const next = () => {

fx.setText(phrases[counter]).then(() => {

setTimeout(next, 800)

})

counter = (counter + 1) % phrases.length

}

next()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值