Изменение CSS свойств элемента во время перетаскивания файла - PullRequest
0 голосов
/ 10 марта 2020

Я установил перетаскивание в моем Vue JS веб-приложении. Элемент представляет собой простой div, который обрабатывает файл при его перетаскивании на него.

Я использовал https://www.raymondcamden.com/2019/08/08/drag-and-drop-file-upload-in-vuejs в качестве ориентира.

HTML:

<div v-if="status == 'upload'">
    <h3> Please fill the data sheet and upload it here!</h3>
    <div class="downbox" @drop.prevent="addFile" @dragover.prevent>
        <span style="font-size: 60px"><font-awesome-icon icon='cloud-upload-alt'/></span>
        <br>
        Click to Browse 
        <br>
        or Drag and Drop a File Here
    </div>
</div>

JS:

addFile: function(e){
            let droppedFiles = e.dataTransfer.files;
            if ((droppedFiles[0].name).slice(-5) !== '.xlsx') {
                this.$swal({
                    text: "Please upload a file of type .xlsx",
                    title: "Incorrect File Type!",
                    icon: "error",
                })
                this.status = 'upload'
            }
            else {
            this.file = droppedFiles
            this.status = 'show'
            }

        },

removeFile: function(){
    this.file = null
    this.status = 'upload'
}

CSS:

    .downbox {
  width: 500px;
  border-radius: 50px;
  border-width: 6px;
  border-color: white;
  border-style: dashed;
  background-color: #7a2ab3;
  padding: 10px;
  font-size: 25px;
  font-weight: bold;
  transition: 0.6s;
  margin-left: auto;
  margin-right: auto;
}

.downbox:hover{
  background-color: #c56bc5;
}

Как видите, цвет фона изменяется при наведении мыши на div.

Однако, когда я перетаскиваю файл в div, это изменение цвета не отображается. Так что я не знаю, считается ли это ": hover", если вы перетаскиваете файл.

В любом случае я хотел бы знать, что я могу добавить в код, чтобы сделать CSS Изменение свойства background-color при перетаскивании файла в div.

Ответы [ 3 ]

1 голос
/ 10 марта 2020

Я использую следующее решение (здесь упрощенно):

<template>
   <div ref="drag" :class="{over: isOver}">
      ...
   </div>
</template>


<script>
...
mounted () {
   // add the needed event listeners to the container
   this.$refs.drag.addEventListener("dragover", () => {
        this.isOver = true; // add class on drag over
      });
   this.$refs.drag.addEventListener("dragleave", () => {
        this.isOver= false; // remove class on drag leave
      }); 
}

</script>
<css>
.over {...}
</css>
1 голос
/ 10 марта 2020

Проверьте это решение, очевидно, вы должны использовать координаты X и Y:

{ ссылка }

0 голосов
/ 20 марта 2020

Вы можете прослушивать события dragenter и dragleave, чтобы справиться с этим. Но это может быть сложно, если у вас есть другие элементы в вашем элементе удаления, потому что они будут вызывать dragleave события в вашей цели удаления, которые вы захотите игнорировать. Но что-то вроде этого должно работать:

<div :class="['downbox', drag_over ? 'over' : '']"
  @dragenter="dragEnter"
  @dragleave="dragLeave"
  @dragover.prevent
  @drop.prevent="addFile"
>
  <div ref="others">
    <span style="font-size: 60px"><font-awesome-icon icon='cloud-upload-alt'/></span>
    <br>
    Click to Browse 
    <br>
    or Drag and Drop a File Here
  </div>
</div>

В ваших обработчиках событий используйте over_others, чтобы решить, следует ли устанавливать drag_over на false, что вы не хотите делать, если вы все еще перетаскивая на дочерний элемент. (см. также, информация о Vue $ refs )

У вас могут быть трудности с диапазоном в 60 пикселей и значком font-awesome-icon, но вы можете расширить его принцип этих элементов, если они доставляют вам неприятности.

data() {
  return {
    drag_over: false,   // dragging over the target OR any child element
    over_others: false, // dragging over a child element
  }
},
methods: {
  dragEnter(e) {
    if(e.target === this.$refs.others) this.over_others = true
    else this.drag_over = true
  },
  dragLeave(e) {
    if(e.target === this.$refs.others) this.over_others = false
    else if(!this.over_others) this.drag_over = false
  },
  // ...
}

И добавьте класс css:

.downbox:hover,
.downbox.over {
  background-color: #c56bc5;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...