Swiper轮播图实现

在这里插入图片描述
如上图,列表左右滚动轮播,用户鼠标移动到轮播区域,动画停止,鼠标移开轮播继续。
此例子实现技术框架是用的React+CSS。
主要用的是css的transform和transition来实现左右切换动画效果。
React代码:

import React, { useState, useRef, useEffect } from 'react';
import styles from './index.module.css';

export default function Swiper() {
  const dataSource = [
    'https://t7.baidu.com/it/u=1732966997,2981886582&fm=193&f=GIF',
    'https://t7.baidu.com/it/u=1785207335,3397162108&fm=193&f=GIF',
    'https://t7.baidu.com/it/u=3423293041,3900166648&fm=193&f=GIF',
    'https://t7.baidu.com/it/u=3659156856,3928250034&fm=193&f=GIF',
    'https://t7.baidu.com/it/u=826329656,2212580321&fm=193&f=GIF',
  ];
  const [tabIndex, setTabIndex] = useState(0);
  const [isScroll, setIsScroll] = useState(true);// 用于当鼠标移入时,轮播停止
  const scrollerRef = useRef(null);
  const timer = useRef(null);

  useEffect(() => {
    timer.current = setInterval(() => {
      if (!isScroll) return;
      const dom = scrollerRef.current;
      if (dom && dom.style) {
        const _tabIndex = tabIndex === dataSource.length - 1 ? 0 : tabIndex + 1;
        const width = dom.children[tabIndex].clientWidth;
        dom.style.transform = `translateX(${-tabIndex * width}px)`;
        setTabIndex(_tabIndex);
      }
    }, 1 * 1000);
    return () => {
      timer.current && window.clearInterval(timer.current);
    };
  }, [isScroll, tabIndex, dataSource]);

  return (
    <div className={styles.container}>
      <div
        className={styles.wrapper}
        ref={scrollerRef}
        onMouseEnter={() => setIsScroll(false)}
        onMouseLeave={() => setIsScroll(true)}
      >
        {dataSource.map((item, index) => (
          <div className={styles.item} key={index}>
            <img src={item} className={styles.image} alt={index} />
          </div>
        ))}
      </div>
    </div>
  );
}

Css :

.container {
  height: 300px;
  width: 500px;
  overflow: hidden;
  .wrapper {
    transform: translate(0);
    transition: transform 0.3s;
    width: 100%;
    display: flex;
    .item {
      flex: 0 0 100%;
      height: 300px;
      .image {
        width: 100%;
        height: 100%;
      }
    }
  }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值