代码之家  ›  专栏  ›  技术社区  ›  KeelRisk

为什么拖动(拖放/拖动)元素会导致dropzone(div)部分消失?

  •  1
  • KeelRisk  · 技术社区  · 8 年前

    使用HTML5拖放,当拖动元素时,dropzone部分从UI中消失,如屏幕截图所示。图像中部分缺失的div有一个红色边界。当我从下面的代码中删除“hr”标记时,它可以工作,并且在拖动元素时div不会消失!这只发生在Chrome浏览器中。所有代码如下。有人知道为什么会这样吗?

    <!DOCTYPE html>
    
    <html>
    <head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
    
    <style>
        .objects {
            display: inline-block;
            background-color: #FFF3CC;
            border: #DFBC6A 1px solid;
            width: 50px;
            height: 50px;
            margin: 10px;
            padding: 8px;
            font-size: 18px;
            text-align: center;
            box-shadow: 2px 2px 2px #999;
            cursor: move;
        }
    
        #drop_zone {
            background-color: #EEE;
            border: #f00 1px solid;
            width: 280px;
            height: 200px;
            padding: 8px;
            font-size: 18px;
        }
    </style>
    
    <script>
            function _(id){
               return document.getElementById(id);
            }
            var droppedIn = false;
            function drag_start(event) {
    
                 _('app_status').innerHTML = "Dragging the " + 
    event.target.getAttribute('id');
    
                event.dataTransfer.dropEffect = "move";
                event.dataTransfer.setData("text", 
    event.target.getAttribute('id') );
            }
            function drag_enter(event) {
                _('app_status').innerHTML = "You are dragging over the 
    "+event.target.getAttribute('id');
            }
            function drag_leave(event) {
                _('app_status').innerHTML = "You left the 
    "+event.target.getAttribute('id');
            }
            function drag_drop(event) {
                event.preventDefault(); /* Prevent undesirable default behavior 
    while dropping */
                var elem_id = event.dataTransfer.getData("text");
                event.target.appendChild( _(elem_id) );
                _('app_status').innerHTML = "Dropped "+elem_id+" into the 
    "+event.target.getAttribute('id');
                _(elem_id).removeAttribute("draggable");
                _(elem_id).style.cursor = "default";
                droppedIn = true;
            }
            function drag_end(event) {
                if(droppedIn == false){
                    _('app_status').innerHTML = "You let the 
    "+event.target.getAttribute('id')+" go.";
                }
                droppedIn = false;
            }
            function readDropZone(){
        alert('dropzone');
                for(var i=0; i < _("drop_zone").children.length; i++){
                    alert(_("drop_zone").children[i].id+" is in the drop zone");
                }
                /* Run Ajax request to pass any data to your server */
            }
    </script>
    
    </head>
    <body>
    
    <h2 id="app_status">App status...</h2>
    
    <h1>Drop Zone</h1>
    
    <div id="drop_zone" ondragenter="drag_enter(event)" 
    ondrop="drag_drop(event)" ondragover="return false" 
    ondragleave="drag_leave(event)"></div>
    <div id="object1" class="objects" draggable="true" 
    ondragstart="drag_start(event)" ondragend="drag_end(event)">object 1</div>
    <div id="object2" class="objects" draggable="true" 
    ondragstart="drag_start(event)" ondragend="drag_end(event)">object 2</div>
    <div id="object3" class="objects" draggable="true" 
    ondragstart="drag_start(event)" ondragend="drag_end(event)">object 3</div>
    
    <hr />
    <br />
    <button onclick="readDropZone()">Get Object Data</button>
    
    
    </body>
    </html>
    

    DIV display cut off

    1 回复  |  直到 8 年前
        1
  •  1
  •   camelsWriteInCamelCase    8 年前

    在我的测试中,即使我删除了 <hr /> ,仍然再现了错误。我注意到,它发生在改变 h2#app_status 文本如果你包装 div#drop_zone 接下来的元素包括 div#object... 有了div inline-block 作为展示风格,那么就不会有这样的消失。

    <style>
       #drop-zone-wrapper {display: inline-block;}
    </style>
    
    <div id="drop-zone-wrapper">
        <div id="drop_zone" ondragenter="drag_enter(event)"
             ondrop="drag_drop(event)" ondragover="return false"
             ondragleave="drag_leave(event)"></div>
        <div id="object1" class="objects" draggable="true"
             ondragstart="drag_start(event)" ondragend="drag_end(event)">object 1</div>
        <div id="object2" class="objects" draggable="true"
             ondragstart="drag_start(event)" ondragend="drag_end(event)">object 2</div>
        <div id="object3" class="objects" draggable="true"
             ondragstart="drag_start(event)" ondragend="drag_end(event)">object 3</div>
    </div>