Modal

Modals zijn schermelementen die de gebruiksflow onderbreken. Goed doordachte inhoud die op het juiste moment verschijnt zorgt ervoor dat de gebruiker de ervaring heeft die hij/zij verwacht.

Technische opmerkingen

De class .dso-scripted-height verwijdert op .dso-body in de large viewport de max-height-property.

Wanneer te gebruiken:

  • Onderbreking: de gebruiker dwingen een beslissing te nemen of een taak te voltooien voor een belangrijk deel van hun workflow. Stel jezelf de vraag, “wil ik de gebruiker echt onderbreken?”
  • Feedback of correctie: beslissingen bevestigen. Bijvoorbeeld: bij een “Weet je het zeker?”-moment.
  • Aandacht punt: de focus van de gebruiker expliciet richten op een enkel stuk inhoud, of het nu een afbeelding, artikel of video is.

Wanneer niet te gebruiken

Modals zijn bedoeld om belangrijke bevestigingen en beslissingen te benadrukken. Houd het simpel: stop er geen formulier, uitgebreide zoeklijst of andere ingewikkelde interacties in. Verwerk die op andere manieren in de pagina of interface.

Gedrag en toegankelijkheid

Let bij het gebruik van models op de volgende punten:

  1. Verplaats de focus naar een modal zodra die actief wordt. Binnen de modal moet de focus liggen op het eerste interactieve element.

  2. Een modal moet een accessible naam hebben en zowel visueel als in de code, voor screenreaders, zichzelf presenteren als een modal.

  3. Een modal moet te sluiten zijn op deze manieren:

    • met een close button (kruisje rechtsboven of annuleerknop in de footer)
    • met de escapeknop op het toetsenbord
    • buiten de modal klikken
  4. Een gebruiker moet altijd nog naar de adresbalk van de browser kunnen gaan als de modal actief is.

  5. Is er een modal actief? Zorg dan voor dat alle elementen die bedekt worden door het modalvenster met overlay niet toegankelijk zijn. Als een gebruiker de tabkey gebruikt, blijft de focus zo binnen de modal.

  6. Als de gebruiker de modal sluit, gaat de focus terug naar het element dat de modal heeft geopend. Zo kunnen gebruikers verdergaan waar ze gebleven waren.

Is de modal niet verschenen door een actie van de gebruiker? Plaats de focus dan op een logische plek.

Als een modal bijvoorbeeld ‘onPageLoad’ verschijnt, is het het beste om na het sluiten de focus aan het begin van de pagina te zetten.

<!-- When modal is open add .dso-modal-open to body -->

<body class="dso-modal-open">
    <!-- Modal markup. Can be placed anywhere inside <body> -->
    <div class="dso-modal" tabindex="-1" role="dialog" aria-labelledby="modal-no-close">
        <div class="dso-dialog" role="document">
            <div class="dso-header">
                <h2 id="modal-no-close">Activiteit toevoegen</h2>
                <button type="button" class="dso-close" aria-label="Sluiten"></button>
            </div>
            <div class="dso-body">
                <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
            </div>
            <div class="dso-footer">

                <button type="button" class="btn btn-link"><span>Annuleren</span></button>

                <button type="submit" class="btn btn-primary"><span>Toevoegen</span></button>

            </div>
        </div>
    </div>

    <div class="container">
        <!-- Page content -->
        <form>

            <fieldset>
                <legend>Contact</legend>

                <div class="form-group dso-input dso-input-text dso-required">
                    <div class="dso-label-container">
                        <label for="form-vertical-voornaam" class="control-label">
                            Voornaam
                        </label>

                    </div>
                    <div class="dso-field-container">
                        <input type="text" id="form-vertical-voornaam" class="form-control" required>

                    </div>

                </div>

                <div class="form-group dso-input dso-input-text">
                    <div class="dso-label-container">
                        <label for="form-vertical-achternaam" class="control-label">
                            Achternaam
                        </label>

                    </div>
                    <div class="dso-field-container">
                        <input type="text" id="form-vertical-achternaam" class="form-control">

                        <p class="dso-help-block" id="helpTextId_form-vertical-achternaam">Mag ook de familienaam zijn</p>

                    </div>

                </div>

                <div class="form-group dso-static">
                    <div class="dso-label-container">
                        <label class="control-label">Geslacht</label>

                    </div>
                    <div class="dso-field-container">
                        <p>Man</p>
                    </div>

                </div>

                <div class="form-group dso-input dso-input-text has-feedback">
                    <div class="dso-label-container">
                        <label for="form-vertical-geboortedatum" class="control-label">
                            Geboortedatum
                        </label>

                    </div>
                    <div class="dso-field-container">
                        <input type="text" id="form-vertical-geboortedatum" class="form-control">

                        <span class="form-control-feedback" aria-hidden="true"><svg class="di di-calendar">
                                <use href="../../dso-icons.svg#calendar" />
                            </svg></span>

                    </div>

                </div>

                <div class="form-group dso-input dso-input-email dso-required">
                    <div class="dso-label-container">
                        <label for="form-vertical-email" class="control-label">
                            E-mailadres
                        </label>

                    </div>
                    <div class="dso-field-container">
                        <input type="email" id="form-vertical-email" class="form-control" required>

                    </div>

                </div>

                <div class="form-group dso-input dso-input-text">
                    <div class="dso-label-container">
                        <label for="form-vertical-password" class="control-label">
                            Wachtwoord
                        </label>

                    </div>
                    <div class="dso-field-container">
                        <input type="text" id="form-vertical-password" class="form-control">

                    </div>

                </div>

                <div class="form-group dso-input dso-input-text">
                    <div class="dso-label-container">
                        <label for="form-vertical-password_bevestig" class="control-label">
                            Wachtwoord (bevestig)
                        </label>

                    </div>
                    <div class="dso-field-container">
                        <input type="text" id="form-vertical-password_bevestig" class="form-control">

                    </div>

                </div>

                <div class="form-group dso-confirm">
                    <div class="dso-field-container">
                        <div class="dso-selectable">
                            <input type="checkbox" id="form-vertical-nieuwsbrief" name="nieuwsbrief">
                            <label for="form-vertical-nieuwsbrief">
                                Stuur mij de maandelijkse nieuwsbrief
                            </label>
                        </div>

                        <p class="dso-help-block" id="helpTextId_form-vertical-nieuwsbrief">Uw gegevens zullen niet worden gedeeld met derden</p>

                    </div>
                </div>

            </fieldset>

            <fieldset>
                <legend>Bijlagen</legend>

                <div class="form-group dso-files">
                    <div class="dso-description dso-rich-content">
                        Geef een tekening van de nieuwe situatie in 1:100. Een situatietekening geeft een schets van de bestaande en de nieuwe situatie met daarop duidelijk de maatvoering en de schaalaanduiding (1:100).
                    </div>
                    <ul class="dso-filelist">

                        <li>
                            <div class="dso-filename" id="form-vertical-documenten-file-filename-0">
                                Schetsen_en_foto’s_1.pdf
                            </div>
                            <div class="dso-confidential dso-selectable">
                                <input type="checkbox" id="form-vertical-documenten-input-confirm-0" name="" value="" aria-describedby="form-vertical-documenten-file-filename-0" />
                                <label for="form-vertical-documenten-input-confirm-0">
                                    Vertrouwelijk
                                </label>
                            </div>

                            <button type="button" aria-describedby="form-vertical-documenten-file-filename-0" class="btn btn-link dso-remove"><span>Verwijder document</span></button>
                        </li>

                        <li>
                            <div class="dso-filename" id="form-vertical-documenten-file-filename-1">
                                Bijlagen_hoveniersbedrijf_de_heggeschaar_hoveniers.jpg
                            </div>
                            <div class="dso-confidential dso-selectable">
                                <input type="checkbox" id="form-vertical-documenten-input-confirm-1" name="" value="" checked aria-describedby="form-vertical-documenten-file-filename-1" />
                                <label for="form-vertical-documenten-input-confirm-1">
                                    Vertrouwelijk
                                </label>
                            </div>
                            <svg class="di di-status-warning">
                                <use href="../../dso-icons.svg#status-warning" />
                            </svg>
                            <button type="button" aria-describedby="form-vertical-documenten-file-filename-1" class="btn btn-link dso-remove"><span>Verwijder document</span></button>
                        </li>

                    </ul>

                    <div class="alert alert-warning" role="alert">

                        <div class="dso-rich-content">
                            <p>U vraagt of wij een document vertrouwelijk willen behandelen. Hiervoor moet u twee dingen doen:</p>
                            <ol>
                                <li>Voeg ook een publiceerbaar document zonder vertrouwelijke informatie toe.</li>
                                <li>Geef per document de reden op als toelichting op het verzoek in de laatste stap van uw aanvraag.</li>
                            </ol>
                            <p>Er zal worden beoordeeld of uw vraag terecht is. U krijgt hiervan bericht.</p>
                        </div>

                    </div>

                    <!-- To use an input type="file" element -->
                    <div class="dso-file-upload">
                        <input type="file" id="form-vertical-documenten-file-upload" />
                        <label class="btn btn-link" for="form-vertical-documenten-file-upload">
                            <svg class="di di-plus">
                                <use href="../../dso-icons.svg#plus" />
                            </svg><span>Document toevoegen</span>
                        </label>
                    </div>

                    <!-- Or to trigger the upload using a button element (not recommended) -->
                    <!--
    <button type="button"
  class="btn btn-link"><svg class="di di-plus">
  <use href="../../dso-icons.svg#plus" />
</svg><span >Document toevoegen</span></button>

  -->
                </div>

            </fieldset>

            <fieldset>
                <legend>Beleg</legend>

                <div class="form-group dso-select dso-multiple">
                    <div class="dso-label-container">
                        <label for="form-vertical-beleg" class="control-label">
                            Beleg
                        </label>

                    </div>
                    <div class="dso-field-container">
                        <select id="form-vertical-beleg" class="form-control" multiple>

                            <optgroup label="Vlees">

                                <option value="worst">Worst</option>

                                <option value="salami">Salami</option>

                                <option value="geit">Geit</option>

                            </optgroup>

                            <optgroup label="Vis">

                                <option value="zalm">Zalm</option>

                                <option value="makreel">Makreel</option>

                            </optgroup>

                        </select>

                    </div>

                </div>

            </fieldset>

            <fieldset>
                <legend>Auto merk</legend>

                <div class="form-group dso-select">
                    <div class="dso-label-container">
                        <label for="form-vertical-auto_merk" class="control-label">
                            Type auto
                        </label>

                    </div>
                    <div class="dso-field-container">
                        <select id="form-vertical-auto_merk" class="form-control">

                            <optgroup label="Europees">

                                <option value="alfa">Alfa Romeo</option>

                                <option value="fiat">Fiat</option>

                                <option value="mercedes" selected>Mercedes</option>

                                <option value="volkswagen">Volkswagen</option>

                            </optgroup>

                        </select>

                    </div>

                </div>

            </fieldset>

            <fieldset>
                <legend>Filter op type</legend>

                <div class="form-group dso-filter">
                    <div class="dso-label-container">
                        <label for="form-vertical-filter_type" class="control-label">
                            Type
                        </label>

                    </div>
                    <div class="dso-field-container">
                        <div class="dso-search-bar">
                            <div class="dso-search-bar-input">

                                <span class="dso-search-icon" aria-hidden="true"></span><input type="text" id="form-vertical-filter_type" placeholder="Bv. GTI" />

                                <button type="button">
                                    Zoekopdracht legen
                                </button>

                            </div>
                            <button type="button" class="btn btn-default sr-only">
                                Button
                            </button>
                        </div>

                    </div>

                </div>

            </fieldset>

            <fieldset>
                <legend>Aanhanger</legend>

                <fieldset class="form-group dso-radios">
                    <legend class="dso-label-container">
                        <label class="control-label">
                            Welke aanhanger
                        </label>

                    </legend>
                    <div class="dso-field-container">

                        <div class="dso-selectable">
                            <input type="radio" id="form-vertical-aanhanger-0" name="aanhanger" value="bak">
                            <label for="form-vertical-aanhanger-0">
                                Bak
                            </label>

                        </div>

                        <div class="dso-selectable">
                            <input type="radio" id="form-vertical-aanhanger-1" name="aanhanger" value="caravan" checked>
                            <label for="form-vertical-aanhanger-1">
                                Caravan
                            </label>

                        </div>

                        <div class="dso-selectable">
                            <input type="radio" id="form-vertical-aanhanger-2" name="aanhanger" value="fietsendrager">
                            <label for="form-vertical-aanhanger-2">
                                Fietsendrager
                            </label>

                        </div>

                        <div class="dso-selectable">
                            <input type="radio" id="form-vertical-aanhanger-3" name="aanhanger" value="oplegger">
                            <label for="form-vertical-aanhanger-3">
                                Oplegger
                            </label>

                        </div>

                    </div>

                </fieldset>

                <fieldset class="form-group dso-checkboxes">
                    <legend class="dso-label-container">
                        <label class="control-label">
                            Maak een keuze
                        </label>

                    </legend>
                    <div class="dso-field-container">

                        <div class="dso-selectable">
                            <input type="checkbox" id="form-vertical-input-checkbox-0" name="input-checkbox" value="1">
                            <label for="form-vertical-input-checkbox-0">
                                een
                            </label>

                        </div>

                        <div class="dso-selectable">
                            <input type="checkbox" id="form-vertical-input-checkbox-1" name="input-checkbox" value="2">
                            <label for="form-vertical-input-checkbox-1">
                                twee
                            </label>

                        </div>

                        <div class="dso-selectable">
                            <input type="checkbox" id="form-vertical-input-checkbox-2" name="input-checkbox" value="3">
                            <label for="form-vertical-input-checkbox-2">
                                drie
                            </label>

                        </div>

                    </div>

                </fieldset>

            </fieldset>

            <fieldset>
                <legend>Vraag</legend>

                <div class="form-group dso-textarea">
                    <div class="dso-label-container">
                        <label for="form-vertical-gekke_vraag" class="control-label">
                            Waarom heeft een tankstation dat 24 uur per dag open is een slot op de deur?
                        </label>

                    </div>
                    <div class="dso-field-container">
                        <textarea class="form-control" id="form-vertical-gekke_vraag" rows="5"></textarea>

                        <p class="dso-help-block" id="helpTextId_form-vertical-gekke_vraag">Deze vraag heeft een toelichting</p>

                    </div>

                </div>

            </fieldset>

            <fieldset>
                <legend>Vraag met infobutton</legend>

                <fieldset class="form-group dso-radios">
                    <legend class="dso-label-container">
                        <label class="control-label">
                            Soms laat de vraagstelling aan duidelijkheid te wensen over. Wenst u een toelichting hierop?
                        </label>

                        <button type="button" class="btn dso-info-button" aria-expanded="false">
                            <span class="sr-only">
                                Toelichting
                            </span>
                        </button>

                    </legend>
                    <div class="dso-field-container">

                        <div class="dso-selectable">
                            <input type="radio" id="form-vertical-input-radio-infobutton-0" name="input-radio-infobutton" value="1" checked>
                            <label for="form-vertical-input-radio-infobutton-0">
                                ja, de vraagstelling aan duidelijkheid te wensen over, ik wil graag een toelichting hierop
                            </label>

                            <button type="button" class="btn dso-info-button" aria-expanded="false">
                                <span class="sr-only">
                                    Toelichting
                                </span>
                            </button>

                        </div>

                        <div class="dso-selectable">
                            <input type="radio" id="form-vertical-input-radio-infobutton-1" name="input-radio-infobutton" value="2">
                            <label for="form-vertical-input-radio-infobutton-1">
                                nee, het is mij duidelijk
                            </label>

                        </div>

                    </div>

                </fieldset>

            </fieldset>

            <fieldset>
                <legend>Vraag met infobutton uitgeklapt</legend>

                <fieldset class="form-group dso-radios">
                    <legend class="dso-label-container">
                        <label class="control-label">
                            Toelichting op uw vraag
                        </label>

                        <button type="button" class="btn dso-info-button dso-open" aria-expanded="true">
                            <span class="sr-only">
                                Toelichting
                            </span>
                        </button>

                    </legend>
                    <div class="dso-field-container">

                        <div class="dso-selectable">
                            <input type="radio" id="form-vertical-input-radio-infobutton-open-0" name="input-radio-infobutton-open" value="1" checked>
                            <label for="form-vertical-input-radio-infobutton-open-0">
                                ja
                            </label>

                            <button type="button" class="btn dso-info-button" aria-expanded="false">
                                <span class="sr-only">
                                    Toelichting
                                </span>
                            </button>

                        </div>

                        <div class="dso-selectable">
                            <input type="radio" id="form-vertical-input-radio-infobutton-open-1" name="input-radio-infobutton-open" value="2">
                            <label for="form-vertical-input-radio-infobutton-open-1">
                                nee
                            </label>

                        </div>

                    </div>

                    <div class="dso-info">
                        <button type="button">
                            <span class="sr-only">Sluiten</span>
                        </button>
                        <div class="dso-rich-content">
                            <h4>Let op</h4>
                            <p>Bij verticale formulieren wordt het bij checkboxen en radio's onoverzichtelijk als de toelichting bij de vraag EN opties toont</p>

                        </div>
                    </div>

                </fieldset>

            </fieldset>

            <div class="dso-form-buttons">

                <button type="button" class="btn btn-link"><span>Annuleren</span></button>

                <button type="submit" class="btn btn-primary"><span>Verstuur</span></button>

            </div>

        </form>

    </div>

    <!-- Polyfill for svg use[href] with external uri -->
    <script src="../../svg4everybody.min.js"></script>
    <script>
        svg4everybody();
    </script>
</body>
<!-- When modal is open add .dso-modal-open to body -->
<body {{ className('dso-modal-open', [noMaxHeight, 'dso-scripted-height']) }}>
  <!-- Modal markup. Can be placed anywhere inside <body> -->
  {% render '@dialog', {body: body, dialog: dialog} %}

  <div class="container">
    <!-- Page content -->
    {% render '@form' %}
  </div>

  <!-- Polyfill for svg use[href] with external uri -->
  <script src="{{ '/svg4everybody.min.js' | path }}"></script>
  <script>svg4everybody();</script>
</body>
__title: Default
body: >-
  Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo
  ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis
  parturient montes, nascetur ridiculus mus.
dialog:
  id: modal-no-close
  heading: Activiteit toevoegen
  buttons:
    - name: cancelButton
      type: button
      modifier: link
      label: Annuleren
    - name: confirmButton
      type: submit
      modifier: primary
      label: Toevoegen