Introduction
Dans le monde numérique d'aujourd'hui, améliorer l'expérience utilisateur est crucial pour toute application web. Une manière efficace de le faire est de pouvoir télécharger des fichiers en glissant-déposant en utilisant JavaScript. Cette fonctionnalité permet aux utilisateurs de télécharger des fichiers en les glissant simplement dans une zone désignée, rendant le processus plus intuitif. Dans ce guide, nous vous expliquerons comment créer un code pour télécharger des fichiers par glisser-déposer à partir de zéro, avec des aperçus d'images et une soumission automatique du formulaire.submission.
Code de base pour glisser-déposer des fichiers
Vous trouverez ci-dessous la structure de code de base pour créer un téléverseur de fichiers par glisser-déposer. À la fin de cet article, le code complet est fourni pour une référence facile.
Structure HTML
Commencez par créer une structure HTML simple qui comprend un élément input caché et un conteneur pour la zone de glisser-déposer. Cette configuration vous permettra d'améliorer visuellement l'interface de glisser-déposer par la suite.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Drag-and-Drop File Uploader</title> <link rel="stylesheet" href="style.css"> </head> <h1>Drag-and-Drop File Uploader</h1> <div id="drop-area">Drag file here to upload</div> <form id="upload-form" action="/" method="post" enctype="multipart/form-data"> <input type="file" name="docfile" id="file-selector" multiple hidden> <div id="preview-container"></div> </form> <script src="script.js"></script> </body> </html> |
Style CSS
L'étape suivante consiste à ajouter des styles CSS de base pour améliorer l'attrait visuel de la zone de glisser-déposer et des aperçus de fichiers. Cela contribue à créer une interface utilisateur plus engageante.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /* style.css */ body { font-family: Arial, sans-serif; margin: 0; padding: 20px; } h1 { text-align: center; } #drop-area { width: 400px; height: 200px; margin: 20px auto; border: 2px dashed #cccccc; text-align: center; line-height: 200px; cursor: pointer; } #preview-container { text-align: center; } |
JavaScript pour gérer le glisser-déposer
Maintenant, plongeons dans le code JavaScript qui alimente la fonctionnalité de glisser-déposer. Ce script gère le glisser-déposer des fichiers, leur prévisualisation, ainsi que la soumission automatique du formulaire.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // script.js const dropArea = document.getElementById('drop-area'); const fileSelector = document.getElementById('file-selector'); const fileInput = document.getElementById('file-selector'); const uploadForm = document.getElementById('upload-form'); function preventDefaults(event) { event.preventDefault(); event.stopPropagation(); } dropArea.addEventListener('dragover', preventDefaults); dropArea.addEventListener('dragenter', preventDefaults); dropArea.addEventListener('dragleave', preventDefaults); dropArea.addEventListener('drop', handleDrop); function handleDrop(event) { preventDefaults(event); const files = event.dataTransfer.files; if (files.length) { fileInput.files = files; } } |
Fonctionnalités supplémentaires pour améliorer l'expérience utilisateur
Mise en surbrillance de la zone de dépôt
Un aspect clé d'une interface de glisser-déposer conviviale est le retour visuel lors des interactions de l'utilisateur. Par exemple, vous pouvez changer la couleur de fond ou le style de bordure de la zone de dépôt lorsque l'utilisateur glisse des fichiers au-dessus. Cela permet aux utilisateurs de savoir que la zone de dépôt est active et prête à recevoir des fichiers.
1 2 3 4 5 6 | dropArea.addEventListener('dragover', () => { dropArea.classList.add('highlight'); }); dropArea.addEventListener('dragleave', () => { dropArea.classList.remove('highlight'); }); |
Et le CSS correspondant :
1 2 3 4 | .highlight { border-color: #4CAF50; background-color: #f0f0f0; } |
Soumission automatique du formulaire
Pour une expérience utilisateur transparente, vous pouvez configurer le formulaire pour qu'il se soumette automatiquement lorsque des fichiers sont déposés dans la zone. Cela élimine la nécessité pour les utilisateurs de cliquer manuellement sur un bouton de soumission.
1 2 3 | function submitFormAutomatically() { uploadForm.submit(); } |
Enfin, intégrez la fonction submitFormAutomatically() dans la fonction handleDrop :
1 2 3 4 5 6 7 8 | function handleDrop(event) { preventDefaults(event); const files = event.dataTransfer.files; if (files.length) { fileInput.files = files; submitFormAutomatically(); } } |
Création d'un aperçu des images
Au lieu de la soumission automatique du formulaire, vous pouvez souhaiter fournir aux utilisateurs un aperçu des fichiers qu'ils sont sur le point de téléverser. Cela est particulièrement utile pour les fichiers image.
CSS pour les aperçus d'images :
1 2 3 4 5 6 7 | .preview-image { object-fit: cover; width: 100px; height: 100px; margin: 10px; border: 1px solid #ddd; } |
JavaScript pour les aperçus d'images :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function previewFiles(files) { const previewContainer = document.getElementById('preview-container'); previewContainer.innerHTML = ''; Array.from(files).forEach(file => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onloadend = function () { const img = document.createElement('img'); img.src = reader.result; img.classList.add('preview-image'); previewContainer.appendChild(img); }; }); } |
Enfin, intégrez la fonction previewFiles(files) dans la fonction handleDrop :
1 2 3 4 5 6 7 8 | function handleDrop(event) { preventDefaults(event); const files = event.dataTransfer.files; if (files.length) { fileInput.files = files; previewFiles(files); } } |
Exemples de code complets
Vous trouverez ci-dessous deux exemples de code complets. Le premier fournit une fonctionnalité de glisser-déposer de base, et le second inclut des fonctionnalités supplémentaires telles que la mise en surbrillance de la zone de dépôt et les aperçus d'images.
Exemple de code 1 : Glisser-déposer de base
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Drag-and-Drop File Uploader</title> <style> /* style.css */ body { font-family: Arial, sans-serif; margin: 0; padding: 20px; } h1 { text-align: center; } #drop-area { width: 400px; height: 200px; margin: 20px auto; border: 2px dashed #cccccc; text-align: center; line-height: 200px; cursor: pointer; } #preview-container { text-align: center; } </style> </head> <body> <h1>Drag-and-Drop File Uploader</h1> <div id="drop-area">Drag files here to upload</div> <form id="upload-form" action="/" method="post" enctype="multipart/form-data"> <input type="file" name="docfile" id="file-selector" multiple hidden> <div id="preview-container"></div> </form> <script type="text/javascript"> // script.js const dropArea = document.getElementById('drop-area'); const fileSelector = document.getElementById('file-selector'); const fileInput = document.getElementById('file-selector'); const uploadForm = document.getElementById('upload-form'); function preventDefaults(event) { event.preventDefault(); event.stopPropagation(); } dropArea.addEventListener('dragover', preventDefaults); dropArea.addEventListener('dragenter', preventDefaults); dropArea.addEventListener('dragleave', preventDefaults); dropArea.addEventListener('drop', handleDrop); function handleDrop(event) { preventDefaults(event); const files = event.dataTransfer.files; if (files.length) { fileInput.files = files; } } </script> </body> </html> |
Exemple de code 2 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Drag-and-Drop File Uploader</title> <style> /* style.css */ body { font-family: Arial, sans-serif; margin: 0; padding: 20px; } h1 { text-align: center; } #drop-area { width: 400px; height: 200px; margin: 20px auto; border: 2px dashed #cccccc; text-align: center; line-height: 200px; cursor: pointer; } #preview-container { text-align: center; } .highlight { border-color: #4CAF50; background-color: #f0f0f0; } .preview-image { object-fit: cover; width: 100px; height: 100px; margin: 10px; border: 1px solid #ddd; } </style> </head> <body> <h1>Drag-and-Drop File Uploader</h1> <div id="drop-area">Drag file here to upload</div> <form id="upload-form" action="/" method="post" enctype="multipart/form-data"> <input type="file" name="docfile" id="file-selector" multiple hidden> <div id="preview-container"></div> </form> <script type="text/javascript"> // script.js const dropArea = document.getElementById('drop-area'); const fileSelector = document.getElementById('file-selector'); const fileInput = document.getElementById('file-selector'); const uploadForm = document.getElementById('upload-form'); function preventDefaults(event) { event.preventDefault(); event.stopPropagation(); } dropArea.addEventListener('dragover', preventDefaults); dropArea.addEventListener('dragenter', preventDefaults); dropArea.addEventListener('dragleave', preventDefaults); dropArea.addEventListener('drop', handleDrop); function handleDrop(event) { preventDefaults(event); const files = event.dataTransfer.files; if (files.length) { fileInput.files = files; previewFiles(files); } } dropArea.addEventListener('dragover', () => { dropArea.classList.add('highlight'); }); dropArea.addEventListener('dragleave', () => { dropArea.classList.remove('highlight'); }); function previewFiles(files) { const previewContainer = document.getElementById('preview-container'); previewContainer.innerHTML = ''; Array.from(files).forEach(file => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onloadend = function () { const img = document.createElement('img'); img.src = reader.result; img.classList.add('preview-image'); previewContainer.appendChild(img); }; }); } </script> </body> </html> |
Références
Pour en savoir plus et pour des implémentations plus avancées, consultez les ressources suivantes :
Links | Site |
---|---|
how-to-make-a-drag-and-drop-file-uploader | Uploadcare Blog |
MDN Web Docs: Drag and Drop API | Mozilla Developer Network |
HTML5 Drag and Drop Tutorial | Smashing Magazine |
Ces ressources offrent des explications détaillées et des exemples pour vous aider à améliorer et personnaliser votre téléverseur de fichiers par glisser-déposer.