实现一个小玩意

这篇博客介绍了一个JavaScript实现的页面点击后字符慢慢消失的动画效果。通过随机生成不同的字体颜色和内容,确保每次点击的动画都有所不同,并利用CSS过渡实现平滑的动画效果。代码中使用setTimeout而非Promise来控制动画顺序,确保动画按预期执行。
摘要由CSDN通过智能技术生成

不知道在哪里看到的一种在页面点击就会出现字符慢慢消失的小东西
大概是这种, 我也实现了一下
请添加图片描述

源码

// 获取不同的字体颜色
function generateColorWrap () {
  const colors = [
    'rgb(37, 116, 92)',
    'rgb(71, 100, 133)',
    'rgb(90, 71, 133)',
    'rgb(161, 29, 51)',
    'rgb(161, 77, 29)',
    'rgb(153, 119, 99)',
    'rgb(38, 104, 134)',
    'rgb(102, 123, 133)'
  ]
  const getColorIndex = diffPre(colors.length, 0)
  return () => colors[getColorIndex()]
}
const generateColor = generateColorWrap()
// 获取不同的内容
function generateTextWrap () {
  const texts = [
    '富强',
    '民主',
    '文明',
    '和谐',
    '善良',
    '谦恭',
    '勤俭',
    '礼让'
  ]
  let getTextIndex = diffPre(texts.length, 0)
  return () => texts[getTextIndex()]
}
const generateText = generateTextWrap()

// 用来保证字体颜色,或者内容不与上次的内容相同
function diffPre(max, min) {
  let pre = 0
  // 获取范围内的随机数
  function getRandom (max, min) {
    const aNumber = (max - min) * Math.random() + min
    return Math.floor(aNumber)
  }
  return function getNext() {
    const curr = getRandom (max, min)
    if (curr === pre) {
      return getNext()
    } else {
      pre = curr
      return curr
    }
  }
}

// 使用CSS过度来达到动画效果
function generateStyleWrap () {
  const initStyle = {
    position: 'fixed',
    transform: 'translate(-50%, -100%)',
    transition: 'all 1.5s ease-in-out',
    opacity: 1,
  }
  return function(px, py) {
      const beforeStyles = {
      top: `${py}px`,
      left: `${px}px`,
      color: generateColor(),
      ...initStyle
    }

    const afterStyles = {
      ...beforeStyles,
      opacity: 0,
      transform: 'translate(-50%, -200px)'
    }
    function createStyleString (styleObj) {
      return Object.keys(styleObj).reduce((pre, curr, i) => {
        const result = `${curr}: ${styleObj[curr]}`
        return i ? `${pre};${result}` : result
      }, '')
    }
    return {
      before: createStyleString(beforeStyles),
      after: createStyleString(afterStyles)
    }
  }
}
const generateStyle = generateStyleWrap()

// 处理样式问题
function dealStyle (toy, px, py, callback) {
  const { before, after } = generateStyle(px, py)

  toy.innerHTML = `${generateText()}`
  toy.setAttribute('style', before)
  document.body.appendChild(toy)

  // 知道这个地方为什么使用setTimeout而不是Promise吗?
  setTimeout(() => {
    toy.setAttribute('style', after)
    setTimeout(() => {
      callback(document.body.removeChild(toy))
    }, 2000)
  }, 0)
}


// 创建一个动画元素
function createToy () {
  const eleList = []

  const getToy = () => {
    const ele = eleList.pop()
    return ele || document.createElement('span')
  }

  const recoveryToy = (toy) => {
    if (eleList.length >= 10) {
      toy = null
      return
    }
    toy.setAttribute('style', '')
    eleList.push(toy)
  }

  return {
    getToy,
    recoveryToy
  }
}

// 使用window时间绑定想要交互的事件
function showToy (e) {
  const x = e.clientX
  const y = e.clientY
  const { getToy, recoveryToy } = createToy()
  dealStyle(getToy(), x, y, recoveryToy)
}

window.addEventListener('click', showToy)


问题: 知道图中的一处代码为什么不用Promise而要使用setTimeout吗???
我知道, 可是我不说!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值