前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >react 文字跑马灯

react 文字跑马灯

原创
作者头像
小鑫
发布2022-05-11 16:23:07
1.3K0
发布2022-05-11 16:23:07
举报
文章被收录于专栏:小鑫の随笔小鑫の随笔

之前的一个 pc 端项目,有文字滚动的功能,找了下,没有合适的轮子,于是自己造了一个

目前只支持横向滚动

index.tsx
代码语言:javascript
复制
import React, { useRef, useEffect, useState } from 'react'
import './index.css'
import styled from 'styled-components'

interface TextScrollProps {
  /**
   * 内容
   */
  content: string
  /**
   * 持续时间/s
   */
  duration: number
}

function TextScroll(props: TextScrollProps) {
  const { content, duration } = props

  const defaultState = {
    contentWidth: 0,
    left: 0,
    duration,
  }

  const [state, setState] = useState(defaultState)

  let ref = useRef<HTMLParagraphElement>(null)

  useEffect(() => {
    const { offsetWidth, parentElement } = ref.current as HTMLParagraphElement

    setState({
      ...state,
      contentWidth: offsetWidth,
      left: parentElement!.offsetWidth,
    })
  }, [])

  const { contentWidth, left, duration: timing } = state

  const animationName = `marquee_${contentWidth}`

  const Text = styled.p`
    position: relative;
    left: ${left}px;
    animation: ${animationName} ${timing}s linear infinite both;
    animation-play-state: running;
    animation-fill-mode: forwards;

    @keyframes ${animationName} {
      0% {
        transform: translateX(0px);
      }

      100% {
        transform: translateX(-${contentWidth + left}px);
      }
    }
  `

  return (
    <div className="marquee_box">
      <Text ref={ref}>{content}</Text>
    </div>
  )
}
TextScroll.defaultProps = {
  content: '',
  duration: 3,
}

export default React.memo(TextScroll)
index.css
代码语言:javascript
复制
.marquee_box {
  width: 100%;
  height: 100%;
  overflow: hidden;
  word-break: keep-all;
  white-space: nowrap;
  display: flex;
  align-items: center;
}

.marquee_box p {
  display: inline-block;
}

.marquee_box:hover p {
  animation-play-state: paused;
  cursor: default;
}

有更好实现思路的童鞋可以来给我上一课[让我看看]

预览地址
https://codesandbox.io/s/react-wenzipaomadeng-wi2dw?fontsize=14&hidenavigation=1&theme=dark

首发自:react 文字跑马灯 - 小鑫の随笔

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • index.tsx
  • index.css
  • 预览地址
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档