效果预览
关键代码
//调节窗口大小 useEffect(() => { if (conref.current) { conref.current.style.width = `${conref.current.clientWidth + delta}px` let t = conref.current.clientWidth + conref.current.offsetLeft + 2 start.current = t } }, [delta])//dom结构 { if (moving) { setdelta(e.clientX - start.current) } }} onMouseUp={(e) => { moving && setmoving(false) }} className="commentManager_body"> { articles && articles.map(item => {item.title}) } { start.current = e.touches[0].clientX }} onTouchMove={(e) => { setdelta(() => e.touches[0].clientX - start.current) }} onMouseDown={(e) => { setmoving(true); start.current = e.clientX + 5 }} onMouseUp={(e) => { moving && setmoving(false) }} className="adjustBar"> 原理
整个窗口分为三个区域,左侧为文章列表,右侧是用来展示对应文章评论的区域,中间设置了一个宽度为10的区域,用来调节两边区域的大小。
首先,将最大的容器设置为display:flex;
左边的容器设置一个初始宽度,
中间的元素设置固定宽度为10px
右侧容器设置flex:1;填充外层容器剩余空间
处理移动端
在中间的控制条上添加两个事件,一个是onTouchStart,用于记录在一开始触摸时的位置,另一个是onTouchMove,获取手指在屏幕上移动的位置,并减去开始的位置,获取x方向的偏移量。根据这个偏移量来调节左侧容器的宽度,并更新初始值,就实现了预期的效果。
处理PC端
与移动端不同,在PC端需要使用三个事件函数,onMouseDown,标记此时开始调节大小,设置最开始的位置,onMouseMove,获取鼠标移动到的位置,减去初始值获得x方向偏移量,根据偏移量调节左侧容器的宽度,onMouseUp,标记此时不需要调节大小。
注意的是PC端鼠标始终在屏幕上,所以需要一个变量来区分何时鼠标移动需要调节大小,何时不需要,同时将onMouseMove事件绑定在最外层盒子上,可以避免由于中间的控制条太窄,鼠标在移动时偏到外面,造成的move事件里的逻辑不能进行,得不到偏移量,最终导致调节过程不流畅。