【问题标题】:How can I limit a draggable element to the body, disable text selection and enable form inputs?如何将可拖动元素限制为正文、禁用文本选择和启用表单输入?
【发布时间】:2018-09-28 15:23:02
【问题描述】:

我正在使用react-draggable

我必须防止元素被拖到body 元素之外,防止文本选择并在可拖动元素内启用表单输入。

import React from "react";
import ReactDOM from "react-dom";
import Draggable from "react-draggable";

function App() {
  return (
    <div className="App">
      <div>Loren ipsum blah blah</div>
      <Draggable bounds='body'>
        <div className="inner">
          <h4>Drag me</h4>
          <textarea/>
          <input />
          <input type='checkbox' />
        </div>
      </Draggable>
   </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

上面的代码将阻止文本选择,但不能使用textareainput。复选框确实有效。

我尝试使用enableUserSelectHack={false} 来启用div.inner 中的表单输入。虽然输入已启用,但可以选择文本用户将光标拖到视口上方。

有没有办法在使用react-draggable时将可拖动元素限制为正文、禁用文本选择和启用表单输入?

【问题讨论】:

    标签: javascript reactjs draggable


    【解决方案1】:

    利用 React state 并创建一个按钮切换来允许/禁用拖动(同时,这会对输入产生相反的效果)。

    要限制可拖动区域,您可以像这样指定它:

    bounds={{left: number, top: number, right: number, bottom: number}}

    或者,使用:

    bounds="parent"

    限制节点的 offsetParent 内的移动(在下面的示例中,它是 &lt;div className="container"&gt;heightwidth)。

    更多信息可以在here找到。

    工作示例:https://codesandbox.io/s/k5n52xq70r(限制为styles.css 样式表中指定的heightwidth

    components/App.js

    import React, { Component } from "react";
    import Draggable from "react-draggable";
    
    export default class App extends Component {
      state = { disabled: false };
    
      toggleDraggable = () => this.setState(prevState => ({ disabled: !this.state.disabled }));
    
      render = () => {
        const { disabled } = this.state;
        return (
          <div className="container">
            <Draggable disabled={disabled} bounds="parent">
              <div style={{ width: 200 }} className={!disabled ? "draggable" : null}>
                <h4 style={{ height: 20, userSelect: "none" }}>{!disabled && "Drag Me"}</h4>
                <textarea disabled={!disabled} className="uk-textarea"/>
                <input disabled={!disabled} className="uk-input" />
                <input className="uk-checkbox" type="checkbox" disabled={!disabled}/>
                <br />
                <button className="uk-button uk-button-primary" onClick={this.toggleDraggable}>
                  {disabled ? "Enable" : "Disable"} Drag
                </button>
              </div>
            </Draggable>
          </div>
        );
      };
    }
    

    styles.css

    .container {
      height: calc(100vh - 50px);
      width: calc(100vh - 100px);
      padding: 20px;
    }
    
    .draggable {
      cursor: -webkit-grab;
      cursor: grab;
    }
    
    .uk-input,
    .uk-textarea,
    .uk-checkbox {
       margin-bottom: 10px;
    }
    

    【讨论】:

    • 完美运行。谢谢!
    【解决方案2】:

    在 Draggable 组件中设置 bounds="parent"。那么这将不允许您拖动直接父 元素宽度和高度

    <div sytle={{max-width: 50%;}}>
       <Draggable  bounds="parent"><div style={{ width: 50 }}className={!disabled ? "draggable" : null}>
            <h4 >DragMe</h4>
          </div>
    
        </Draggable>
       </div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多