【问题标题】:How to modify the dragging effect when using HTML5 drag-and-drop?使用HTML5拖拽时如何修改拖拽效果?
【发布时间】:2019-01-02 02:52:37
【问题描述】:

我正在为我的网络应用程序使用 angularJS,我需要编写一个包含拖动操作的组件。当我试图完成这个目标时,我发现很难控制指针周围的拖动效果,因为它不是一个真实的元素,而是一个图像剪切(我假设)。目前,拖动图像是被拖动元素的副本,包含悬停效果,甚至具有来自其父元素的白色背景。 (我剪了两张图显示在下面)

那么如何用css或者js修改拖拽效果呢?

我为触发dragstart事件时被拖动的元素添加了一个类“is-dragging”,并更改了被拖动元素的样式。但是拖动的图像保持不变。

html

<div ng-if="current == -1" class="form-library">
    <div ng-repeat="(key, item) in formMap"
         class="form-type-items"
         ng-class="{'is-dragging': dragInfo.type == 'add' && key == dragInfo.data.type}"
         draggable="true"
         ng-dragstart="onDragStart($event, key)"
         ng-dragend="onDragEnd($event)">
         <div class="form-type-icon">
             <i class="{{'iconfont icon-'+item.icon}}"></i>
         </div>
         <span class="form-type-name">{{ item.name }}</span>
    </div>
</div>

scss

&:hover {
    .form-type-name {
        color: $brand-color-1;
    }
    .form-type-icon {
        .iconfont {
            color: $brand-color-1;
        }
    }
}
&.is-dragging {
   opacity: 0.36;
   background-color: transparent;
   .form-type-name {
       color: $gray-2;
   }
   .form-type-icon {
       .iconfont {
           color: $gray-2;
       }
   }
}

【问题讨论】:

    标签: javascript angularjs html drag-and-drop


    【解决方案1】:

    看起来样式是在拖动开始后应用的,所以拖动的视觉副本是刚开始拖动时实例中元素的浅表副本。作为一种解决方法,您可以尝试先应用样式,然后在元素上设置可拖动属性,并在元素释放后将其删除

    <div ng-if="current == -1" class="form-library">
        <div ng-repeat="(key, item) in formMap"
                class="form-type-items"
                ng-class="{'is-dragging': dragInfo.type == 'add' && key == dragInfo.data.type}"
                draggable="true"
                on-mousedown="onMouseDown($event, key)"
                on-mouseup="onMouseUp($event)">
                <div class="form-type-icon">
                    <i class="{{'iconfont icon-'+item.icon}}"></i>
                </div>
                <span class="form-type-name">{{ item.name }}</span>
        </div>
    </div>
    
    
    <script>
    function onMouseDown(e) {
        // set variable that will apply necessary class to TRUE
    
        // then add draggable attribute
        e.target.setAttribute('draggable', true)
    }
    
    
    function onMouseUp(e) {
        // set variable for drabble class to FALSE
    
        // then remove draggable attribute
        e.target.setAttribute('draggable', false)
    }
    
    </script>
    

    【讨论】:

    • 谢谢!正如你所说,我在 dragstart 之前更改了 mousedown 回调中的类,它似乎可以工作,甚至解决了拖动图像时的白色背景问题,有点连线。
    • 更新:我发现在拖动开始后应用样式的真正原因是使用 angularJS ng-class 来更改元素的样式。如果我只是在 dragstart 回调中写e.target.className += ' is-dragging';,拖动图像将根据需要进行更改。我认为这是因为angularJS在使用ng-class时在dragstrart执行后重新渲染了元素。
    • 是的,看起来像是被 angularJS 框架忽略的东西!