react 横向/水平无限消息滚动

61 篇文章 1 订阅
52 篇文章 2 订阅

效果如图:在这里插入图片描述
创建1个message-list文件夹,里面存放两个文件,index.tsxstyle.less

原理是就设置一个固定长度的父节点,然后消息内容的长度超过了父节点的长度,就会出现滚动条,这个时候设置一个定时器,让子节点即消息内容,一步步的向左边滚动,当向左边滚动完成以后马上需要回到原始位置,再重新滚动。

1.index.tsx

import { useEffect, useRef, useState } from 'react'
import './style.less'

function App(props) {
  const [isScrolle, setIsScrolle] = useState(true) //控制是否滚动
  const [context, setContext] = useState([]) //滚动消息
  const speed = 25 //滚动速度,值越小,滚动越快
  const warper: any = useRef() //对应parent的节点
  const childDomInit: any = useRef() //初始的消息节点
  const childDomCopy: any = useRef() //复制的消息节点

  useEffect(() => {
    setContext(props.messageData)
    childDomCopy.current.innerHTML = childDomInit.current.innerHTML // 复制了一层节点,拼在原有节点后面,使得它看起来像无线滚动一样
  }, [props])

 // 开始滚动
  useEffect(() => {
    let timer
    if (isScrolle) {
      timer = setInterval(() => {
        /**
        *让消息持续的向左滚动
         * warper.current.scrollLeft:内容向左边滚动的距离
         * childDomInit.current.scrollWidth :内容的长度
         */
       warper.current.scrollLeft >= childDomInit.current.scrollWidth
          ? (warper.current.scrollLeft = 0)
          : warper.current.scrollLeft++
      }, speed)
    }
    return () => {
      clearTimeout(timer)
    }
}, [isScrolle])

// 鼠标移动,移除方法
const hoverHandler = (flag) => setIsScrolle(flag)

 return (
    <>
      <div>
        <span className="mesage-text">消息通知:</span>
        <div className="parent" ref={warper} style={{ marginLeft: '90px' }}>
           <div className="child" ref={childDomInit}>
            {context.map((item: any, index) => (
              <span
                key={index}
                onMouseOver={() => hoverHandler(false)}
                onMouseLeave={() => hoverHandler(true)}
              >
                <span style={{ fontSize: '16px' }}>{index + 1}.</span>
                {item.datetime}
              </span>
               ))}
          </div>
          <div className="child" ref={childDomCopy}></div>
        </div>
      </div>
    </>
  )
}

export default App

2.style.less

.parent {
  display: flex;
  height: 50px;
  overflow-x: scroll;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.parent::-webkit-scrollbar {
  display: none;
}
/*设置的子盒子高度大于父盒子,产生溢出效果*/
.child {
  display: inline-block;
  height: 50px;
  line-height: 50px;
  white-space: nowrap;
}

.child > span {
  height: 50px;
  margin: 2px 0;
  white-space: nowrap;
}
.mesage-text {
  position: absolute;
  margin-left: 10px;
  height: 50px;
  line-height: 50px;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值