Trucsweb.com

Trucsweb 1997-2017 - 20 ans de partage.

CSS

RDFFav

Le flyout ou la fenêtre modale fixe et adaptative en pure CSS

Un petit menu rapide, une annonce importante, un chat ou le simple abonnement au bulletin électronique, la fenêtre modale fixe est aujourd’hui présente partout. Et pas besoin d’être un geek, un petit bout de code CSS sans une seule ligne de JavaScript et avec une animation en prime.fenêtre, windows, flyout, fixed

Fenêtre modale fixe 2

Un petit menu rapide, une annonce importante, le partage, un chat ou le simple abonnement au bulletin électronique, la fenêtre modale fixe est aujourd’hui présente un peu partout. Et pas besoin d’être un geek, un petit bout de code CSS sans une seule ligne de JavaScript fait le travail, et ce avec une petite animation en prime.

En gros, il faut un élément avec une position fixe et jouer sur cette position à l’aide de la propriété bottom, dans le cas d’une fenêtre en bas de page.

Mobile en premier!

Mais tout d’abord, pensons mobile! C’est-à-dire, avec une position relative, pleine largeur. C’est pourquoi il faut bien choisir l’endroit où sera affichée notre fenêtre en version mobile, en l’occurrence juste avant le pied de page (footer) :

<body>
  <header>
    <h1>Fenêtre fixe</h1>
  </header>
  <main>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit...</p>
  </main>
  <div id="oAbonnement" class="card cAbonnement">
    <div class="card-header">Fenêtre fixe</div>
  </div>
  <footer class="text-center;">Pied de page</footer>
</body>

On peut l’ajuster à son gout, dimensions, marges, couleurs, barre de défilement. J’utilise ici une simple classe Bootstrap « cards » mais toute combinaison HTML/CSS est valable. Or à partir de là, notre fenêtre se résume à une bande sous le contenu de la page. Ce qui évite tous les tracas d’une énième position fixe qui se juxtaposeraient par exemple en version mobile.

Position fixe (en bas à droite de la page)

« Mobil first » c’est le minimum min-width. La classe sera prise en charge dès que l’écran aura un minimum de 767px de large. Et c’est ici que le fun commence, avec une position fixe et surtout, une position négative, en gardant une petite marge bottom: -205px pour le bouton-titre toujours visible.

@media (min-width: 767px) {
  .cAbonnement {
    /* Hauteur de la fenêtre */
    height:250px;
    /* Position fixe négative */
    position: fixed;
    bottom: -205px;
    right: 10px;
    /* Au dessus le contenu! */
    z-index: 2;
  }
}

Pour l’ouvrir, ajoutons un bouton dans l’entête, la marge :

<div id="oAbonnement" class="card cAbonnement">
  <div class="card-header">
     <a href="#oAbonnement">Fenêtre fixe</a>
  </div>
  <div class="card-body">
    Contenu de la fenêtre...
  </div>
  <div class="card-footer text-muted">
    Pied de la fenêtre
  </div>
</div>

Et un autre pour la fermer, cette fois pour changer le focus, n’importe où (#/) :

<style>
@media (min-width: 767px) {
  .cAbonnement {
    height:250px;
    position: fixed;
    bottom: -205px;
    right: 10px;
    z-index: 2;
  }
  #oAbonnement:target {
    bottom: 0px;
  }
}
</style>

<div id="oAbonnement" class="card cAbonnement">
  <div class="card-header">
    <a class="d-none d-md-inline-block float-right" href="#/">X</a>
    <a href="#oAbonnement">Fenêtre fixe</a>
  </div>
  <div class="card-body">
    Contenu de la fenêtre...
  </div>
  <div class="card-footer text-muted">
    Pied de la fenêtre
  </div>
</div>

Noter que le lien est aligné à droite float-right et affiché seulement sur les plus grands écrans d-none d-sm-inline-block à l’aide des classes Bootstrap 4. Nous aurions pu tout simplement utiliser un médiaquery avec un display:none par défaut et un simple float:right.

Code complet avec animation

On change la position du bas, l’animation doit faire de même transition: bottom .5s ease; :

<!doctype html>
<html lang="fr-CA">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>fenêtre modale fixe et adaptative en pure CSS - Trucsweb.com</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous" />
    <style>
    @media (min-width: 767px) {
      .cAbonnement {
        height:250px;
        max-width:400px;
        position: fixed;
        bottom: -205px;
        right: 10px;
        overflow: hidden;
        -webkit-transition: bottom .5s ease;
        transition: bottom .5s ease;
        z-index: 2;
        -webkit-border-top-left-radius: 3px;
        -webkit-border-top-right-radius: 3px;
        -moz-border-radius-topleft: 3px;
        -moz-border-radius-topright: 3px;
        border-top-left-radius: 3px;
        border-top-right-radius: 3px;
      }
      .cAbonnement .card-body {overflow-y: auto;height:140px;}
      #oAbonnement:target {
        bottom: 0px;
      }
    }
    </style>
  </head>
  <body>
    <header>
     <h1>Fenêtre modale fixe et adaptative en pure CSS</h1>
    </header>
  
    <main>
      <p>Lorem ipsum dolor sit amet...</p>
    </main>

    <div id="oAbonnement" class="card cAbonnement">
      <div class="card-header">
        <a class="d-none d-md-inline-block float-right" href="#/">X</a>
        <a href="#oAbonnement" class="d-block">Fenêtre fixe</a>
      </div>
      <div class="card-body">
        <form>
          <div class="form-row">
            <p class="text-center" style="text-align:center;width:100%">Abonnez-vous à notre bulletin électronique,<br />c'est simple et gratuit!</p>
            <div class="my-1 mx-auto">
              <label class="sr-only" for="inlineFormInputGroupUsername">Courriel</label>
              <div class="input-group">
                <input type="text" class="form-control" id="inlineFormInputGroupUsername" placeholder="Courriel">
                <div class="input-group-append">
                  <button type="submit" class="input-group-text btn-primary">Abonnez-moi</button>
                </div>
              </div>
            </div>
          </div>
        </form>
      </div>
      <div class="card-footer text-muted">Pied de la fenêtre fixe</div>
    </div>

    <footer class="text-center">Copyright © 1997-2018 Oznog - Trucsweb.com</footer>
    
  </body>
</html>

Dans ce dernier exemple, j’ajoute une barre de défilement vertical overflow-y pour un contenu dynamique. Mais ça reste d’une grande simplicité... Amusez-vous!

Exemple sans dépendance à Bootstrap 4
<!doctype html>
<html lang="fr-CA">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <title>fenêtre modale fixe et adaptative en pure CSS - Trucsweb.com</title>
    <style>
    /* Mobile en premier */
    .conteneur {
      max-width:1200px;
      margin:0 auto;
    }
    .cAbonnement {
      color:#366556;
      background-color:#b2d6cb;
      font-family:Arial,Helvetica Neue,Helvetica,sans-serif;
    }
    .cTete, .cPied {
      display:none;
    }
    .cAbonnement a {
      display:block;
      text-decoration:none;
      padding:6px 15px;
      color:#366556;
      font-weight: 100;
      -webkit-transition:.5s;
      transition:.5s;
    }
    .cAbonnement a:hover {
      color:#fff;
      background-color:#366556;
    }
    .cCorps {
      background-color:#f2f8f6;
      padding:15px;
      text-align:center;
    }
    .cPied {
      text-align:center;
    }
    footer {
      text-align:center;
    }
    /* Écrans supérieur à 767px */
    @media (min-width: 767px) {
      .cAbonnement {
        height:200px;
        max-width:400px;
        position: fixed;
        bottom: -170px;
        right: 10px;
        overflow: hidden;
        -webkit-transition: bottom .5s ease;
        transition: bottom .5s ease;
        z-index: 2;
        -webkit-border-top-left-radius: 3px;
        -webkit-border-top-right-radius: 3px;
        -moz-border-radius-topleft: 3px;
        -moz-border-radius-topright: 3px;
        border-top-left-radius: 3px;
        border-top-right-radius: 3px;
      }
      .cAbonnement .cCorps {
        overflow-y: auto;
        height:112px;
        border-right:1px solid #b2d6cb;
        border-left:1px solid #b2d6cb
      }
      #oAbonnement:target {
        bottom: 0px;
      }
      .cTete, .cPied {
        display:block;
      }
      .cFermer {
        float:right;
      }
    }
    </style>
  </head>
  <body>
    <header class="conteneur">
     <h1>Fenêtre modale fixe et adaptative en pure CSS</h1>
    </header>
  
    <main class="conteneur">
      <p>Lorem ipsum dolor sit amet...</p>
    </main>

    <div id="oAbonnement" class="cAbonnement">
      <div class="cTete">
        <a class="cFermer" href="#/">X</a>
        <a href="#oAbonnement">Fenêtre fixe</a>
      </div>
      <div class="cCorps">
        <form>
            <p>Abonnez-vous à notre bulletin électronique</p>
            <label>Courriel</label>
            <input type="text" placeholder="Courriel">
            <button type="submit">Abonnez-moi</button>
        </form>
      </div>
      <div class="cPied"><a href="#/">Fermer la fenêtre</a></div>
    </div>

    <footer class="conteneur">Copyright © 1997-2018 Oznog - Trucsweb.com</footer>
    
  </body>
</html>
, Analyste programmeurConception oznogco multimédia (http://oznogco.com), Trucsweb
Dernière mise à jour :

Commentaires

9/10 sur 1 revues.
       Visites : 752 - Pages vues : 768
X

Trucsweb.com Connexion

X

Trucsweb.com Mot de passe perdu

X

Trucsweb.com Conditions générales

Conditions

Responsabilité

La responsabilité des Trucsweb.com ne pourra être engagée en cas de faits indépendants de sa volonté. Les informations mises à disposition sur ce site le sont uniquement à titre purement informatif et ne sauraient constituer en aucun cas un conseil ou une recommandation de quelque nature que ce soit.

Aucun contrôle n'est exercé sur les références et ressources externes, l'utilisateur reconnaît que les Trucsweb.com n'assume aucune responsabilité relative à la mise à disposition de ces ressources, et ne peut être tenue responsable quant à leur contenu.

Droit applicable et juridiction compétente

Les règles en matière de droit, applicables aux contenus et aux transmissions de données sur et autour du site, sont déterminées par la loi canadienne. En cas de litige, n'ayant pu faire l'objet d'un accord à l'amiable, seuls les tribunaux canadien sont compétents.

X

Trucsweb.com Trucsweb

X

Trucsweb.com Glossaire

X

Trucsweb.com Trucsweb

X

Trucsweb.com Trucsweb

Conditions

Aucun message!

Merci.

X
Aucun message!
X

Trucsweb.com Créer un compte