See the Pen jQoXOw by Karl Saunders (@Mobius1) on CodePen.

/* --------- DROPZONE INSTANCE --------- */
    const DROPZONE = new Dropzone("#dropzone", {
        autoProcessQueue: false,
        clickable: '#addFiles',
    });
    
    /* --------- SELECTABLE INSTANCE --------- */
    const SELECTABLE = new Selectable({
        appendTo: "#dropzone",
        ignore: "[data-dz-remove]", // stop remove button triggering selection
    });
    
    /* --------- SELECTABLE EVENTS --------- */
    SELECTABLE.on("end", (e, selected) => {
        // show the "removeFiles" button if we have selected files
        removeFiles.classList.toggle("active", selected.length);
    });
    
    /* --------- DROPZONE EVENTS --------- */
    DROPZONE.on("addedfile", function(file) {
        const el = file.previewElement;
        
        // add element to Selectable instance when added by Dropzone
        SELECTABLE.add(el);	
    });
    
    DROPZONE.on("removedfile", function(file) {
        const el = file.previewElement;
        
        // remove element from Selectable instance when removed by Dropzone
        SELECTABLE.remove(el);
    });

    /* --------- BUTTONS --------- */
    const removeFiles = document.getElementById("removeFiles");
    
    removeFiles.addEventListener("click", e => {
        // get files
        const files = DROPZONE.files;
        
        if ( files.length ) {
            for ( const file of files ) {
                // get the item instance from Selectable
                const el = SELECTABLE.get(file.previewElement);
                
                // if it's selected, then remove it.
                // Dropzone is set to listen to "removedfile" and 
                // will remove it from the Selectable instance
                if ( el.selected ) {
                    DROPZONE.removeFile(file);
                    
                    // hide the button
                    removeFiles.classList.remove("active");
                }
            }
        }
    });