Des posts "draggables" en homepage

Plusieurs fois demandé, voici un exemple de code permettant de placer des éléments aléatoirement dans l’espace de la page, et pouvant être déplacés avec la souris.

Comment aborder ce genre de cas ?

Ce cas est surtout intéressant parce qu’àpartir d’une demande, il faut rechercher les solutions techniques pour y répondre.

Nous devons être en mesure de :
 disposer aléatoirement des éléments dans l’espace d’un bloc
 permettre leur déplacement par drag & drop
 mettre àl’avant plan le bloc lorsqu’il est cliqué

Ces trois choses passent par du javascript, et la première chose àfaire sera de trouver une librairie javascript pour gérer le "drag & drop". Une recherche rapide sur le net permet de trouver plusieurs librairies open source le permettant. Après avoir lu la documentation et regardé les démos, j’ai choisi la librairie displace, très légère et qui permet de faire le travail.

Test "hors Wordpress"

La première chose àfaire est de modéliser notre demande en dehors du thème wordpress. Ça peut sembler idiot, mais parfois les librairies peuvent s’avérer difficile àmettre en place. Dominer techniquement la mise en place des éléments en htl/css/javascript est donc une bonne façon de vérifier qu’on est capable de mettre au travail la librairie. Si un problème survient qui empêche le bon fonctionnement du code, il sera plus facile de débugguer ou décider que ce n’est pas la bonne librairie pour la tâche qui nous incombe.

Voici le code qui permet de tester la base, sans le placement aléatoire, juste pour voir si le drag & drop fonctionne :

<!DOCTYPE html>
<html lang="">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Un test de drag & drop</title>
        <script src="displace.min.js"></script>
    </head>

    <body>
        <section id="moveable-container">
            <article class="moveable">Element un<br><a href="http://www.codrdrops.net">Un lien</a></article>
            <article class="moveable">Element deux</article>
            <article class="moveable">Element trois</article>
            <article class="moveable">Element quatre</article>
            <article class="moveable">Element cinq</article>
        </section>


        <style>
            .moveable {
                position:absolute;
                top:100px;
                left:100px;
                width:300px;
                height:200px;
                padding:10px;
                box-sizing: border-box;
                border:1px solid red;
                background-color:white;
            }
            .active {
                background-color:white;
                box-shadow:5px 5px 0 rgba(255,0,0,0.2);
            }

            section {
                border:1px solid #000;
                height:70vh;
                position:relative;
            }
        </style>
        <script>
            var blocsContainer=document.querySelector("#moveable-container")
            var blocs=blocsContainer.querySelectorAll(".moveable")

            // activer le drad & drop
            const displace = window.displacejs
            var zactuel=1

            document.querySelectorAll('.moveable').forEach(function(elem){
                var el = elem
                var options = {
                    constrain: true,
                    onMouseDown: active,
                    onMouseUp: inactive,
                }
                displace(el, options)

                function active(el){
                    el.classList.add('active')
                    el.style.zIndex=zactuel
                    zactuel++
                }
                function inactive(el){
                    el.classList.remove('active')
                }
            })
        </script>
    </body>
</html>

Pour que ce code fonctionne, il faut que la librairie displace.min.js soit placée dans le même répertoire que notre page html, évidemment. On obtient après quelques mouvements, ceci :

Il manque deux choses pour ce code :
 le placement aléatoire des blocs
 le changement de position en cas de changement de taille de la page

Je vous épargne ces codes que je place dans la démo complète ici :

Code en version pur html/css/javascript
Avec la librairie

Créer un tempate part pour le code

Une fois le test réussi, on place le code dans un template part de Wordpress.
L’utilisation d’un template part n’est pas obligatoire, mais permet d’isoler facilement le code.

Voici la portion de code et la librairie displace.min.js, qui doit être placée dans le dossier assets/ (sans quoi ça ne marchera pas, évidement.

Le template part et la librairie displace
N’oubliez pas de placer ces éléments au bon endroit : le template part dans le dossier morceaux/ et le fichier javascript dans assets/

Le code pour placer ce template part dans la page home.php du thème "theme_base" :

<?php
get_template_part( 'morceaux/posts-draggable' );
?>