当前位置: 首页 > Web前端 > JavaScript

Reactsliderscanimagecomponent(.tsx+.less,hookscomponent)

时间:2023-03-27 16:33:27 JavaScript

ps:slider样式直接移到下面https://www.chaos.com/blog/ho...组件实现部分重点:可见性:“hidden”是左半边图片占据口袋底部,左右半边图片是绝对定位的。配置滑块的mousedown和up事件,当鼠标按下时监听mousemove事件。为了实现“即使鼠标移动到滚动条,在浏览器外,或者在浏览器内从f12控制台松开”,也可以取消鼠标拖动——直接在document而不是document上配置事件监听器。身体。当图像缩放时,鼠标水平移动量moveX按比例变化,以达到一个相对静止的滑块位置。为了得到正确的鼠标移动值,“lastmousexposition”cursorX并没有存储为状态,它只是一个普通的全局变量。源码.tsximportReact,{useState,useEffect}from"react";import"./styles.less";exportdefaultfunctionApp(){return(测试拖拽组件

);}constSwiperWindow=({leftSrc="",rightSrc=""})=>{让cursorX=0;const[boxState,setBoxState]=useState({boxW:0,boxH:0});const[sliderW,setSliderW]=useState(40);//滑条的宽度constINITLEFT=-(sliderW/2);const[sliderLeft,setSliderLeft]=useState(INITLEFT);const[sliderMax,setSliderMax]=useState(0);const[moveX,setMoveX]=useState(0);const[scale,setScale]=useState(1);useEffect(()=>{setSliderW(document.querySelector(".slider")?.clientWidth||40);setSize(true);return()=>{document.removeEventListener("mousemove",onMouseMove);文档nt.removeEventListener("mouseup",onMouseUp);};},[]);useEffect(()=>{if(boxState.boxW){setSize(false);}},[document.querySelector(".scanBox")?.clientWidth,boxState.boxW]);constsetSize=(init:boolean=false)=>{让new_boxW=document.querySelector(".scanBox")?.clientWidth;让new_boxH=document.querySelector(".scanBox")?.clientHeight;constHalf=sliderW/2;如果(new_boxW){constnew_sliderMax=new_boxW-一半;setSliderMax(new_sliderMax);if(init){setSliderLeft(INITLEFT+new_boxW/2);setMoveX(new_boxW/2);setScale(new_boxW/2/new_boxW);}elseif(moveX){letnew_sliderLeft=INITLEFT+new_boxW*scale;constHalf=sliderW/2;constMIN=-一半;常数MAX=new_sliderMax;如果(new_sliderLeft<=MIN){new_sliderLeft=MIN;}if(new_sliderLeft>=MAX){new_sliderLeft=MAX;}setSliderLeft(new_sliderLeft);}setBoxState(Object.assign({boxW:new_boxW,boxH:new_boxH}));}};constonMouseDown=(e:any)=>{让new_cursorX=e.clientX;cursorX=new_cursorX;document.addEventListener("mousemove",onMouseMove);document.addEventListener("mouseup",onMouseUp);};constonMouseMove=(e:any)=>{//鼠标移动距离letmoveX=e.clientX-cursorX;设置移动X(移动X);让new_sliderLeft=sliderLeft+moveX;setScale((new_sliderLeft-INITLEFT)/boxState.boxW);constHalf=sliderW/2;constMIN=-一半;constMAX=sliderMax;如果(new_sliderLeft<=MIN){new_sliderLeft=MIN;}if(new_sliderLeft>=MAX){new_sliderLeft=MAX;}setSliderLeft(new_sliderLeft);};//当鼠标弹起触发事件constonMouseUp=(e:any)=>{cursorX=e.clientX;文档.removeEventListener("mousemove",onMouseMove);document.removeEventListener("mouseup",onMouseUp);};const{boxW,boxH}=boxState;返回(
{/*滑动条*/}onMouseDown(e)}onMouseUp={(e)=>onMouseUp(e)}className="slider"style={{left:sliderLeft}}>
??
);};.less.container{最大宽度:1200px;保证金:自动;宽度:100%;高度:自动;}.noSelect{用户选择:无;}.scanBox{位置:相对;宽度:继承;溢出:隐藏;}.scanBox{.slider{对齐项目:中心;游标:ew-resize;显示:弹性;弹性方向:列;高度:100%;证明内容:居中;左:268.768px;位置:绝对;顶部:0px;宽度:40px;z-指数:5;.line-top{背景:#ffffff;框阴影:0px3px1px-2pxrgba(0,0,0,0.2),0px2px2px0pxrgba(0,0,0,0.14),0px1px5px0pxrgba(0,0,0,0.12);弹性:01自动;高度:100%;宽度:2px;}.line-bottom{背景:#ffffff;框阴影:0px3px1px-2pxrgba(0,0,0,0.2),0px2px2px0pxrgba(0,0,0,0.14),0px1px5px0pxrgba(0,0,0,0.12);弹性:01自动;高度:100%;宽度:2px;}.round{对齐项目:中心;边框:2px实心#ffffff;边界半径:100%;框阴影:0px3px1px-2pxrgb(000/20%),0px2px2px0pxrgb(000/14%),0px1px5px0pxrgb(000/12%);框大小:边框框;显示:弹性;弹性:10自动;高度:40px;证明内容:居中;宽度:40px;变换:无;.arrow-left{border:inset6pxrgba(0,0,0,0);border-right:6pxsolid#ffffff;高度:0px;左边距:-10px;玛格右边:10px;宽度:0px;}.arrow-right{border:inset6pxrgba(0,0,0,0);border-left:6pxsolid#ffffff;高度:0px;右边距:-10px;宽度:0px;}}}.left{位置:绝对;顶部:0;左:0;z-指数:2;宽度:100%;高度:100%;溢出:隐藏;.leftPic{宽度:100%;高度:自动;-webkit-用户拖动:无;//不可拖动}}.right{position:absolute;顶部:0;左:0px;z-索引:1;宽度:100%;高度:100%;溢出:隐藏;.rightPic{宽度:100%;高度:自动;-webkit-用户拖动:无;//不可拖动}}}