美文网首页
react实现拖拽容器边框改变容器宽度

react实现拖拽容器边框改变容器宽度

作者: 我没事_就是有点难受 | 来源:发表于2021-06-07 20:50 被阅读0次

大概是想要这么个效果(只能拖拽中间的线条 拖动其他无效):


QQ20210606-205549-HD.gif

怎么实现这个效果呢?原生js中已经提供了相应的api:onmousedown(鼠标按下事件)、onmousemove(鼠标按下后元素移动事件)、onmouseup(松开鼠标事件),快忘记的同学正好可以熟悉巩固一波。

这无非就是一个计算, 通过ref拿到父容器宽度和左侧右侧的子容器宽度,移动事件中计算左侧容器宽度和右侧容器宽度。右侧width = 父容器width - 左侧容器width;

以下是组件核心代码:

import React, { useRef, useEffect, useCallback } from 'react'

import './draggleLayout.less';


const drag = ({ leftDom: ref1, rightDom: ref2, contentDom }, draggleLineDom) => {
    const _ref1 = ref1;
    const _ref2 = ref2;
    draggleLineDom.onmousedown = (e) => {
      let _e = e;
      const dir = 'horizontal'; // 设置好方向 可通过变量控制默认水平方向 horizontal | vertical
      const firstX = _e.clientX; // 获取第一次点击的横坐标
      const width = ref2.offsetWidth; // 获取到元素的宽度
      // 移动过程中对左右元素宽度计算赋值
      document.onmousemove = (_event) => {
        _e = _event;
        // 可扩展上下拖动等
        switch (dir) {
          case 'horizontal':
              _ref1.style.width = `${contentDom.offsetWidth - width + (_e.clientX - firstX)}px`;
              _ref2.style.width = `${width - (_e.clientX - firstX)}px`;
            break;
          default:
            break;
        }
      };
      // 在左侧和右侧元素父容器上绑定松开鼠标解绑拖拽事件
      contentDom.onmouseup = () => {
        document.onmousemove = null;
      };
      return false;
    };
};
export default function DraggleLayout({contentDom, leftDom, rightDom}) {
    const draggleLineRef = useRef();
    const init = useCallback(drag.bind(null, { leftDom, rightDom, contentDom }),
     [leftDom, rightDom, contentDom, draggleLineRef.current]);

    useEffect(() => {
        // 初始化绑定拖拽事件
        init(draggleLineRef.current);
    }, []);

    return (<div className='draggleLine-wrapper'><div className='draggleLine' ref={draggleLineRef}></div></div>)
}

使用示例:

import React, { useRef, useEffect, useState } from 'react'

import DraggleLayout from './DraggleLayout';
import './demo.less';

export default function Demo() {
    const contentRef = useRef();
    const leftDomRef = useRef();
    const rightDomRef = useRef();
    const [init, setInit] = useState(false);

    useEffect(() => {
        setInit(true);
    }, [])

    const draggleLayoutProps = {
        contentDom: contentRef.current,
        leftDom: leftDomRef.current,
        rightDom: rightDomRef.current,
    };
    return (
        <div className='content-wrapper' ref={contentRef}>
            <div className='left' ref={leftDomRef}>
                左侧
            </div>
            {/* 父组件加载完再加载子组件 从而通过ref拿到父组件的dom节点 */}
            {init && <DraggleLayout {...draggleLayoutProps} />}
            <div className='right' ref={rightDomRef}>右侧</div>
        </div>
    )
}

相关文章

  • react实现拖拽容器边框改变容器宽度

    大概是想要这么个效果(只能拖拽中间的线条 拖动其他无效): 怎么实现这个效果呢?原生js中已经提供了相应的api:...

  • 常用代码块

    1: 文字超出显示省略号 1)如果容器有固定宽度 2)如果容器没有固定的宽度 2: 去除按钮边框 3: 自定义To...

  • React 实现侧边栏拖拽

    项目背景:react+ts+less 常见使用按钮来实现侧边菜单缩起/展开,现用代码实现侧边栏拖拽宽度改变。 具...

  • RN(react native)入坑指南-04,布局容器

    react native 支持采用flex方式布局。默认情况下如果不设置flex容器的宽度,那么flex容器会10...

  • 容器查询(CSS Container Queries)

    容器查询的能力 容器查询它给予了 CSS,在不改变浏览器视口宽度的前提下,只是根据容器的宽度变化,对布局做成调整的...

  • 设计一种自适应的React卡片列表组件

    本文介绍一种用React实现的自适应的卡片列表组件,该组件根据卡片的宽度与间隔自动适应不同容器的宽度对卡片进行排列...

  • 使用better-scroll横向滚动2018-10-17

    使用better-scroll要使内层容器宽度大于外层容器才可以滚动,当内层容器宽度等于外层容器时,无法滚动,这时...

  • css中如何做到容器按比例缩放

    这次主要讨论应用padding属性实现容器的高度根据容器的宽度按比例缩放。 padding: css paddin...

  • 45、打字动画

    打字动画是对逐帧动画和闪烁动画的一种应用,核心思路是使用动画改变容器的宽度,容器自身带有不换行和超出隐藏效果。实现...

  • 自定义拖拽View

    封装简单拖拽视图view,效果如下: 实现思路: 通过箭头的滑动事件坐标动态变化改变容器的高度 上面在箭头Imag...

网友评论

      本文标题:react实现拖拽容器边框改变容器宽度

      本文链接:https://www.haomeiwen.com/subject/meoheltx.html