最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • react-draggable 前端可拖动容器的使用

    正文概述 掘金(Eric . 小文哥 ?)   2020-12-10   1783

    最近想开发一个可拖动组件。他可以实现左右布局。通过左右拖动来改变左右两个窗口的大小。 也可以实现上下布局,通过上下拖动来改变上下两个窗口的大小。

    react-draggable

    react-draggable 是react中的一个可拖动组件库。他可以指定x , y轴的拖动,可以监听一系列拖动事件

    组件的引用

    import Draggable from 'react-draggable'
    <Draggable
          axis={isHorizontal ? 'x' : 'y'}
          handle=".handle"
          position={position}
          onStart={}
          onDrag={}
          onStop={}
    >
          <div className='handle' >
          </div>
      </Draggable>
    

    其中handle指明了,我们拖动的元素 div.handle

    我们可以让Dragable组件,置于一个relative定们的容器中,然后让.handle元素在其中absolute定位

    <div className={`my-draggable`} >
        <Draggable />
    </div>
    
    .my-draggable{
        width: 100%;
        height: 100%;
        position: relative;
        overflow: hidden;
        .handle{
            position: absolute;
            z-index:10;
            top: 0;
            bottom: 0;
            cursor: col-resize;
            padding:0 10px;
            margin-left: -10px;
        }
    }
    

    之后我们可以监听 onDrag事件。onDrag事件中,我们可以获取到e.pageXe.pageY。但由于这两个属性是基于页面定位,他与我们拖动的handle之间,存在一个相对位置差。因些,我们可以让元素在拖动开始时onStart,记录到一个值。在onDrag中,来监听改变。最后,元素的值为onDragonStart值的相对值

        let left = (move && start) ?  size + move - start : size;
        let position = { x : left, y : 0 };
    	<Draggable
            axis='x'
            handle=".handle"
            position={position}
            onStart={(e) => {
                setStart(e.pageX);
            }}
            onDrag={(e) => {
                setMove(e.pageX)
            }}
            onStop={(e) => {
                if(!start || !move){
                    return;
                }
                let newSize = size + move - start;
                if(newSize < 0){
                    newSize = 0;
                }
                if(newSize > max){
                    newSize = max;
                }
                setSize(size + move - start)
                setStart(null);
                setMove(null);
            }}
            >
            <div className='handle' >
            </div>
        </Draggable>
    

    这样,我们就能让handle真正的拖动起来。

    对于左右两个容器的大小,可以通过handle的位置来确定

    let style1={}  , style2 = {} , position;
    let left = (move && start) ?  size + move - start : size;
    style1 = {
        left : 0 , width : `${left}px` , background : 'red'
    }
    style2 = {
        left : `${left}px`  , right : 0 , background: 'blue'
    }
    position = { x : left, y : 0 };
    <div className='draggable-box' style={style1}>{children[0]}</div>
    <div className='draggable-box' style={style2}>{children.slice(1)}</div>
    

    组件使用

    <MyDraggable  size={200} axis='x' >
        <div className='left' style={{}}>
            abc 
        </div>
        <div className='right'>
            <img src='https://img.qiyuandi.com/images/5/reactwbko2ncqhcz.jpg' />
        </div>
    </MyDraggable>
    

    react-draggable常用属性介绍

    属性默认值介绍
    axisxhandle拖动的方向,可选值 x ,yhandle指定拖动handle的classpositionhandle的位置,需要实时改变,否则handle无法拖动,类似于react的受控组件onStrat方法拖动开始onDrag方法拖动中

    | onStop | 方法 | 拖动结束 |

    源码下载

    源码下载


    起源地下载网 » react-draggable 前端可拖动容器的使用

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元