静态效果图

功能
- 拖动后会默认居中当前最靠近中间元素
- 点击靠近中间位置的左右两个元素可以切换剧中元素
- 可选择hover时添加视频动画
代码
import React, {
useState, MouseEvent, useMemo, useEffect } from 'react';
import {
useEventListener, useThrottleFn } from 'ahooks';
import cx from './index.module.less';
interface Props {
imgWidth: number;
imgHeight: number;
}
interface ListItem {
img: string;
video: string;
index: number;
}
const imgList = [
{
img: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRc-daxzQsmo3cQ7M0TM4hOz3pX-1WKzB-V-w&usqp=CAU',
video: '',
},
{
img: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQXhun_JTTMmKDhvGv0vELHx41BS5hVL58mDA&usqp=CAU',
video: '',
},
{
img: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR1kno3P3RqG6qB-uJYBlglsznLVf4XLY_34A&usqp=CAU',
video: '',
},
{
img: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTz-VVabwdSkWiTFe4WTzj1WkD3ILkrEV0dQw&usqp=CAU',
video: '',
},
{
img: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRc-daxzQsmo3cQ7M0TM4hOz3pX-1WKzB-V-w&usqp=CAU',
video: '',
},
{
img: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQXhun_JTTMmKDhvGv0vELHx41BS5hVL58mDA&usqp=CAU',
video: '',
},
{
img: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR1kno3P3RqG6qB-uJYBlglsznLVf4XLY_34A&usqp=CAU',
video: '',
},
{
img: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTz-VVabwdSkWiTFe4WTzj1WkD3ILkrEV0dQw&usqp=CAU',
video: '',
},
{
img: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRc-daxzQsmo3cQ7M0TM4hOz3pX-1WKzB-V-w&usqp=CAU',
video: '',
},
{
img: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQXhun_JTTMmKDhvGv0vELHx41BS5hVL58mDA&usqp=CAU',
video: '',
},
];
export const Banner3D = ({
imgWidth = 400, imgHeight = 400 }: Props) => {
const [clientWidth, setClientWidth] = useState(document.documentElement.clientWidth);
const [mouseDrag, setMouseDrag] = useState(false);
const [mouseX, setMouseX] =