React-dnd: DragPreview๋Š” ์ž์‹ ๋…ธ๋“œ์—์„œ translate3d๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ž˜๋ชป ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 08์›” 19์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: react-dnd/react-dnd

์•ผ!

์šฐ๋ฆฌ๋Š” ์–ด๋–ค ์‹œ์ ์—์„œ translate3d CSS ์Šคํƒ€์ผ์„ ํฌํ•จํ•˜๋Š” ์š”์†Œ๋ฅผ ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ์ „์ฒด ๋“œ๋ž˜๊ทธ ๋ ˆ์ด์–ด์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” translate3d๊ฐ€ ๋ฃจํŠธ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ž์‹ ๋…ธ๋“œ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ด์œ ๋ฅผ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค. (์ž‘๋™ํ•˜๋ ค๋ฉด ReactDnD๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” CDN์„ ์ฐพ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— "./scripts/react-dnd-1.1.4/dist"ํด๋”์— ReactDnD.min.js๋ฅผ ๋ฐฐ์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค).

๋„์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>DragPreview with wrong position example</title>

        <script src="http://fb.me/react-with-addons-0.13.3.js"></script>
        <script src="http://fb.me/JSXTransformer-0.13.3.js"></script>
        <script src="scripts/react-dnd-1.1.4/dist/ReactDnD.min.js"></script>

        <style>
            .ReactDnDElement {
                background: red;
                overflow: hidden;
                width: 200px;
                height: 100px;
            }

            .ReactDnDElement .wrapper {
                display: flex;
                align-items: center;
                width: 600px;
                height: 100%;
                transform: translate3d(-275px, 0, 0);
            }

            .ReactDnDElement .wrapper div {
                width: 150px;
                height: 50%;
            }

            .ReactDnDElement .wrapper div.green { background: green; }
            .ReactDnDElement .wrapper div.blue { background: blue; }
            .ReactDnDElement .wrapper div.yellow { background: yellow; }
            .ReactDnDElement .wrapper div.magenta { background: magenta; }
        </style>
    </head>

    <body>
        <script type="text/jsx">
            /* ReactDnDApp */

            var ReactDnDApp = React.createClass({
                render: function() {
                    return (
                        <ReactDnDElement></ReactDnDElement>
                    );
                }
            });

            ReactDnDApp = ReactDnD.DragDropContext(ReactDnD.HTML5)(ReactDnDApp)


            /* ReactDnDElement */

            var ReactDnDElement = React.createClass({
                render: function() {
                    return this.props.connectDragSource(
                        this.props.connectDragPreview(
                            <div className="ReactDnDElement">
                                <div className="wrapper">
                                    <div className="green"></div>
                                    <div className="blue"></div>
                                    <div className="yellow"></div>
                                    <div className="magenta"></div>
                                </div>
                            </div>
                        )
                    );
                }
            });

            ReactDnDElement = ReactDnD.DragSource("dndElement", {
                beginDrag: function(props) {
                    return {};
                }
            }, function(connect, monitor) {
                return {
                    connectDragSource: connect.dragSource(),
                    connectDragPreview: connect.dragPreview()
                };
            })(ReactDnDElement);


            /* RUN IT! */

            React.render(React.createElement(ReactDnDApp), document.body);
        </script>
    </body>
</html>
bug wontfix

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ธŒ๋ผ์šฐ์ € ๋‹ด๋‹น์ž๊ฐ€ ๊ณง์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. HTML5 ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์€ IE5 ๋™์ž‘์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ‘œ์ค€ํ™”๋˜์—ˆ์œผ๋ฉฐ ์˜ค๋žซ๋™์•ˆ ๊นจ์ง€๊ณ  ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์›น์ด ๋” ๋ณต์žก ํ•ด์ง์— ๋”ฐ๋ผ ๋” ๋‚˜์•„์ง€์ง€ ์•Š๊ณ  ๋” ๋‚˜๋น ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž์ถคํ˜• ๋งˆ์šฐ์Šค ๋ฐ ํ„ฐ์น˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด๋ฉฐ ๊ทธ๋Ÿฌํ•œ React DnD ๋ฐฑ์—”๋“œ๊ฐ€ ๊ฒŒ์‹œ๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  5 ๋Œ“๊ธ€

๊ธฐ๋ณธ html5 ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๊ธฐ๋Šฅ์—๋„ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ html5 ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ์‹œ๋„ํ•˜๋ฉด firefox ๋ฐ safari์—์„œ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ Chrome ๋ฐ Opera์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

react-dnd๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์ด ๋ฌธ์ œ๋Š” ์‚ฌํŒŒ๋ฆฌ์— ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ ํฌ๋กฌ, ์˜คํŽ˜๋ผ ๋ฐ FIREFOX์—์„œ๋Š” ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

ํฌ๋กฌ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค : https://code.google.com/p/chromium/issues/detail?id=525604

์ด ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋Š” ์˜๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ถˆ์พŒํ•œ ๊ฒƒ๋“ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ๋‹จ์ง€ ๋‘ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ  ๊ทธ๊ฒƒ์„ ์ž‘๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค.

์ด๊ฒƒ์€ ๋”์ฐํ•œ ๋ธŒ๋ผ์šฐ์ € ๋ถˆ์ผ์น˜ ์ค‘ ํ•˜๋‚˜ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ x ๋ฐ y ์— ์ „๋‹ฌ ๋œ ๊ฐ’ dataTransfer.setDragImage ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ํ•ด์„๋˜์–ด ๋‹ค๋ฅธ ๋•Œ ๋ถ€๋ชจ ์˜คํ”„์…‹ ๋ถ€์ •์ ์œผ๋กœ ์œ„์น˜์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ์š”์†Œ์˜ ์ž์‹. ๋ณ€ํ™˜์„ ์–‘์ˆ˜๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋งˆ์ˆ ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Firefox์˜ ์ผ๋ถ€ ๊ธฐ๋ณธ HTML5 ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์˜ˆ์ œ์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” x ๋ฐ y ์ง€์ •ํ•˜์ง€ ์•Š์•˜๊ณ  ๊ธฐ๋ณธ๊ฐ’์ด "์ž‘๋™ โ€. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ๋‚˜ํƒ€๋‚˜๋Š” ๋“œ๋ž˜๊ทธ ๋œ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค _.

์—ฌ๊ธฐ์— ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ์˜์‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธ ์†Œ์Šค ๋…ธ๋“œ์˜ ๊นŠ์ด ์ค‘์ฒฉ ๋œ ์ž์‹์ด ์™ผ์ชฝ ๋˜๋Š” ์œ„์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด setDragImage(node, x, y) ๊ฐ€ ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ˆ˜์ •ํ•˜๋ ค๊ณ ํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ํ™•์‹คํžˆ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ˆ์ •์ ์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ซ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ์‹ญ์‹œ์˜ค. ์ง€๊ธˆ์€ ๋“œ๋ž˜๊ทธ ์†Œ์Šค ๋‚ด๋ถ€์—์„œ ๋ถ€์ •์ ์ธ ๋ณ€ํ™˜์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. connectDragSource _inside_ ๋ณ€ํ™˜ ๋œ ๋ž˜ํผ๋ฅผ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.ReactDnDElement {
    background: red;
    overflow: hidden;
    width: 200px;
    height: 100px;
}

.ReactDnDElement .transform {
    transform: translate3d(-275px, 0, 0);
    width: 100%;
    height: 100%;
}

.ReactDnDElement .wrapper {
    display: flex;
    align-items: center;
    width: 600px;
    height: 100%;
}

.ReactDnDElement .wrapper div {
    width: 150px;
    height: 50%;
}

.ReactDnDElement .wrapper div.green { background: green; }
.ReactDnDElement .wrapper div.blue { background: blue; }
.ReactDnDElement .wrapper div.yellow { background: yellow; }
.ReactDnDElement .wrapper div.magenta { background: magenta; }
var ReactDnDElement = React.createClass({
    render: function() {
      return (
        <div className="ReactDnDElement">
          <div className="transform">
            {this.props.connectDragSource(
              <div className="wrapper">
                <div className="green"></div>
                <div className="blue"></div>
                <div className="yellow"></div>
                <div className="magenta"></div>
              </div>
            )}
          </div>
        </div>
      );
    }
});

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ ‡๊ฒŒํ•˜๋ฉด ํ•˜์œ„ ๋ถ€๋ถ„ ๋งŒ ๋“œ๋ž˜๊ทธ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

screen shot 2015-09-17 at 17 48 31

๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ œ์•ˆ ํ•  ์ˆ˜์žˆ๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํฐ ๋ฌธ์ œ๋ผ๋ฉด HTML5 ๋Œ€์‹  ๋Œ€์ฒด React DnD ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด # 70๊ณผ ๊ฐ™์€ ๋งˆ์šฐ์Šค ๋ฐฑ์—”๋“œ๋Š” setDragImage ์— ์˜์กดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. setDragImage ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๋งž์ถค ๋“œ๋ž˜๊ทธ ๋ ˆ์ด์–ด ๋ฅผ ์‚ฌ์šฉ

์•ผ! ์ด๊ฑธ ๋ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋„ค, ์ •๋ง ๋ถˆ์พŒํ•œ ๊ฒƒ! ๋ธŒ๋ผ์šฐ์ € ๋‹ด๋‹น์ž๊ฐ€ ๊ณง์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ๋‹ด๋‹น์ž๊ฐ€ ๊ณง์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. HTML5 ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์€ IE5 ๋™์ž‘์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ‘œ์ค€ํ™”๋˜์—ˆ์œผ๋ฉฐ ์˜ค๋žซ๋™์•ˆ ๊นจ์ง€๊ณ  ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์›น์ด ๋” ๋ณต์žก ํ•ด์ง์— ๋”ฐ๋ผ ๋” ๋‚˜์•„์ง€์ง€ ์•Š๊ณ  ๋” ๋‚˜๋น ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž์ถคํ˜• ๋งˆ์šฐ์Šค ๋ฐ ํ„ฐ์น˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด๋ฉฐ ๊ทธ๋Ÿฌํ•œ React DnD ๋ฐฑ์—”๋“œ๊ฐ€ ๊ฒŒ์‹œ๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰