J'ai créé une solution pour cela.
$(function () {
var dropZoneId = "drop-zone";
var buttonId = "clickHere";
var mouseOverClass = "mouse-over";
var dropZone = $("#" + dropZoneId);
var ooleft = dropZone.offset().left;
var ooright = dropZone.outerWidth() + ooleft;
var ootop = dropZone.offset().top;
var oobottom = dropZone.outerHeight() + ootop;
var inputFile = dropZone.find("input");
document.getElementById(dropZoneId).addEventListener("dragover", function (e) {
e.preventDefault();
e.stopPropagation();
dropZone.addClass(mouseOverClass);
var x = e.pageX;
var y = e.pageY;
if (!(x < ooleft || x > ooright || y < ootop || y > oobottom)) {
inputFile.offset({ top: y - 15, left: x - 100 });
} else {
inputFile.offset({ top: -400, left: -400 });
}
}, true);
if (buttonId != "") {
var clickZone = $("#" + buttonId);
var oleft = clickZone.offset().left;
var oright = clickZone.outerWidth() + oleft;
var otop = clickZone.offset().top;
var obottom = clickZone.outerHeight() + otop;
$("#" + buttonId).mousemove(function (e) {
var x = e.pageX;
var y = e.pageY;
if (!(x < oleft || x > oright || y < otop || y > obottom)) {
inputFile.offset({ top: y - 15, left: x - 160 });
} else {
inputFile.offset({ top: -400, left: -400 });
}
});
}
document.getElementById(dropZoneId).addEventListener("drop", function (e) {
$("#" + dropZoneId).removeClass(mouseOverClass);
}, true);
})
#drop-zone {
/*Sort of important*/
width: 300px;
/*Sort of important*/
height: 200px;
position:absolute;
left:50%;
top:100px;
margin-left:-150px;
border: 2px dashed rgba(0,0,0,.3);
border-radius: 20px;
font-family: Arial;
text-align: center;
position: relative;
line-height: 180px;
font-size: 20px;
color: rgba(0,0,0,.3);
}
#drop-zone input {
/*Important*/
position: absolute;
/*Important*/
cursor: pointer;
left: 0px;
top: 0px;
/*Important This is only comment out for demonstration purposes.
opacity:0; */
}
/*Important*/
#drop-zone.mouse-over {
border: 2px dashed rgba(0,0,0,.5);
color: rgba(0,0,0,.5);
}
/*If you dont want the button*/
#clickHere {
position: absolute;
cursor: pointer;
left: 50%;
top: 50%;
margin-left: -50px;
margin-top: 20px;
line-height: 26px;
color: white;
font-size: 12px;
width: 100px;
height: 26px;
border-radius: 4px;
background-color: #3b85c3;
}
#clickHere:hover {
background-color: #4499DD;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="drop-zone">
Drop files here...
<div id="clickHere">
or click here..
<input type="file" name="file" id="file" />
</div>
</div>
La fonctionnalité de glisser-déposer de cette méthode ne fonctionne qu'avec Chrome, Firefox et Safari. (Je ne sais pas si elle fonctionne avec IE10), mais pour les autres navigateurs, le bouton "Ou cliquez ici" fonctionne bien.
Le champ de saisie suit simplement votre souris lorsque vous faites glisser un fichier sur une zone, et j'ai également ajouté un bouton
Décommentez opacity:0 ; l'entrée du fichier est seulement visible pour que vous puissiez voir ce qui se passe.
2 votes
Préparez-vous à souffrir si vous voulez inclure mac/safari dans vos compatibilités.
1 votes
@Shark8 En fait, Safari/Mac est l'un des rares navigateurs à prendre en charge cette fonctionnalité.
0 votes
En fait, aucun des navigateurs ne le permet. Le champ de saisie du fichier est en lecture seule (pour des raisons de sécurité) et c'est là le problème. Stupide sécurité !
2 votes
Par este Je voulais dire "glisser-déposer des fichiers - plusieurs à la fois - dans une entrée de fichier HTML standard".
4 votes
Glisser/déposer plusieurs fichiers vers
input type="file" multiple
fonctionne bien dans Safari0 votes
Firefox (20.0.1 sur Windows au moins) vous permet de faire simplement glisser un fichier dans un contrôle de fichier d'entrée.
0 votes
Les bons navigateurs le font, mais ce n'est pas le problème.