IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Webdesign & Ergonomie Discussion :

animation css non prise en compte aleatoirement


Sujet :

Webdesign & Ergonomie

  1. #1
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 452
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 452
    Points : 4 601
    Points
    4 601
    Par défaut animation css non prise en compte aleatoirement
    bonjour, j'essaie de mettre en place un system de "page qui defile" full-page & non-stop avec une bare de chargement.
    j'ai 2 question :
    pour une raison de simplicite, je ne veux utiliser qu'1 seule variable de temps qui serai commune au JS & CSS
    1) est-il mieux de la definir en CSS, et de la recuperer en JS, oubien de la definir en JS, et le JS va definir le CSS ? (dans mon exemple, je la definie en CSS, et le JS va la recuperer)

    2) pourquoi, aleatoirement, mon animation de #timer (bare de chargement) n'a pas sa transition qui s'active ? (est-ce un probleme de timing pour l'ajout de la class .loading ?

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <div id="container">
        <div class="slider" data-num-slide="1" data-display="true">
            <div class="title">slide 1</div>
        </div>
        <div class="slider" data-num-slide="2">
            <div class="title">slide 2</div>
        </div>
        <div class="slider" data-num-slide="3">
            <div class="title">slide 3</div>
        </div>
        <div class="slider" data-num-slide="4">
            <div class="title">slide 4</div>
        </div>
        <div class="slider" data-num-slide="5">
            <div class="title">slide 5</div>
        </div>
    </div>
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    :root {
        --main-color-h: 208;
        --main-color-s: 50%;
        /* 2 variables (js & css) cannot concat with ms in transition... */
        --loader-time-js: 3000; /* ms */
        --loader-time-css: 3000ms;
    }
    html, body {
        margin: 0;
        padding: 0;
        width: 100%;
        height: 100%;
    }
    #container {
        width: 100%;
        height: 100%;
        overflow: hidden;
    }
    .slider {
        width: 100%;
        height: 0;
        position: relative;
        font-size: 2em;
        color: #fff;
     
    }
    .slider[data-display="true"] { height: 100%; }
     
    .slider[data-num-slide="1"] { background-color: hsl(var(--main-color-h) var(--main-color-s) 30%); } /* testing... */
    .slider[data-num-slide="2"] { background-color: hsl(var(--main-color-h) var(--main-color-s) 35%); } /* testing... */
    .slider[data-num-slide="3"] { background-color: hsl(var(--main-color-h) var(--main-color-s) 40%); } /* testing... */
    .slider[data-num-slide="4"] { background-color: hsl(var(--main-color-h) var(--main-color-s) 45%); } /* testing... */
    .slider[data-num-slide="5"] { background-color: hsl(var(--main-color-h) var(--main-color-s) 50%); } /* testing... */
     
    .slider .title {
        position: absolute;
        top: 1em;
        left: 50%;
    }
    #timer {
        position: fixed;
        top: 0;
        left: 0;
        height: 5px;
        width: 0;
        background-color: hsl(0 0% 0% / 50%);
        z-index: 1;
    }
    #timer.loading {
        width: 100%;
        transition: width var(--loader-time-css) linear;
    }
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    let stopLoad = false;
        /*setTimeout(() => {
            stopLoad = true;
        }, 1E4);*/
        const TIMER = getComputedStyle(document.documentElement).getPropertyValue('--loader-time-js');
        let $timer;
        function removeTimer() {
            if($timer) {
                $timer.remove();
            }
        }
        function createTimer() {
            $timer = document.createElement('div');
            $timer.id = 'timer';
            document.body.append($timer);
            setTimeout(() => {
                requestAnimationFrame(() => { // testing solutions for #timer bug
                    $timer.className = 'loading';
                });
            });
        }
        function updateSlide() {
            removeTimer();
            if(stopLoad) { return; }
            createTimer();
            setTimeout(() => {
                const currentDisplay = document.querySelector('.slider[data-display="true"]');
                let nextDisplay = document.querySelector('.slider[data-display="true"] + div.slider');
                if(!nextDisplay) {
                    nextDisplay = document.querySelector('.slider');
                }
                delete currentDisplay.dataset.display;
                nextDisplay.dataset.display = true;
                updateSlide();
            }, TIMER);
        }
        updateSlide();
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    1) est-il mieux de la definir en CSS, et de la recuperer en JS, oubien de la definir en JS, et le JS va definir le CSS ? (dans mon exemple, je la definie en CSS, et le JS va la recuperer)
    réponse de normand, cela dépend de ce que l'on fait et surtout avec quoi on est le plus à l'aise, sans qu'il faille que cela impacte la lisibilité.

    Une solution est également de rajouter la variable CSS via JavaScript et elem.style.setProperty("--width", x +"%"); par exemple.

    On peut encore mettre un data-duration="3000s" dans la balise elle même, c'est devenu un classique.


    2) pourquoi, aleatoirement, mon animation de #timer (bare de chargement) n'a pas sa transition qui s'active ? (est-ce un probleme de timing pour l'ajout de la class .loading ?
    Pas trop vu le soucis en testant rapidement mais je note que plus on essaie de synchroniser et moins cela le fait
    Dans ton cas j'utiliserais une animation pour gérer les différentes étapes en plaçant un écouteur sur l'événement animationiteration de ta barre de progression.
    Par exemple :
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #barre-defilement {
      width: 0;
      height: 2em;
      background-color: #BCA;
      animation: left-to-right 3s linear infinite 0s;   /* infinite permet cette gestion */
    }
    @keyframes left-to-right {
      from {width:0;}
      to   {width:100%;}
    }
    en JavaScript cela se gére simplement comme suit :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const elem = document.getElementById("barre-defilement");
    elem.addEventListener("animationiteration", (e)=> {
      // ici le fonction de mise à jour
    })

  3. #3
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 452
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 452
    Points : 4 601
    Points
    4 601
    Par défaut
    salut,

    je ne conaissais pas l'event animationiteration. mais quand je le test, il ne se declanche qu'1 seule fois

    je suis finalement parti sur la solution du JS qui met a jour la variable CSS.

    pour ce qui est de mon bug aleatoire, il se produit plus souvent quand l'animation est trop rapide ( < 2sec). ma limite min etant de 10sec, je ne devrai pas rencontrer ce bug, mais j'aime bien comprendre le pourquoi du comment
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    je ne conaissais pas l'event animationiteration. mais quand je le test, il ne se declanche qu'1 seule fois
    Il te manque sûrement quelque chose car cela fonctionne très bien, voir l'exemple que je mets en fin de post. Un avantage est que tu peux également gérer la mise en pause simplement.


    je suis finalement parti sur la solution du JS qui met a jour la variable CSS.
    Elles servent également à cela, et de plus en plus.


    pour ce qui est de mon bug aleatoire, il se produit plus souvent quand l'animation est trop rapide ( < 2sec). ma limite min etant de 10sec, je ne devrai pas rencontrer ce bug, mais j'aime bien comprendre le pourquoi du comment
    Peut-être un collision entre les deux setTimeout, J'essaierais en enlevant purement et simplement celui dans ta fonction createTimer, il ne m'apparaît pas comme indispensable.

    L'exemple :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    109
    110
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>animationend et animationiteration</title>
    <meta name="Author" content="NoSmoking">
    <meta name="DVP-discussion" content="d2163647">
    <meta name="category" content="css,js">
    <meta name="description" content="Utilisation animationend et animationiteration au lieu de setTimeout">
    <style>
    html, body {margin: 0;padding: 0;font: 1em/1.5 Verdana,sans-serif;}
    h1, h2, h3 {margin: .25em 0;color: #069;}
    #barre-defilement {
      z-index: 1;
      width: 0;
      height: 1em;
      background-color: #069;
      animation: left-to-right 3s linear infinite 0s;
    }
    #barre-defilement.stop-animation {
      animation-play-state: paused;
    }
    @keyframes left-to-right {
      from {width: 0;}
      to {width: 100%;}
    }
    #wrapper > * {
      display: none;
      margin: auto;
      max-width: 30em;
      text-align: center;
    }
    #wrapper > *[aria-hidden="false"] {
      display: block;
    }
    button svg {
      width: 100%;
      height: 100%;
    }
    #btn-stop-animation {
      z-index: 1;
      position: fixed;
      top: 2px;
      right: 2px;
      width: 5em;
      border: 1px solid #888;
      overflow: hidden;
      font-size: 1em;
      line-height: 0;
      background-color: #FFF8;
      cursor: pointer;
      aspect-ratio: 1 /1;
    }
    #btn-stop-animation:hover {
      background-color: #FFF;
    }
    #btn-stop-animation.play-animation svg:first-child {
      display: none;
    }
     
    </style>
    <div id="barre-defilement"></div>
    <button id="btn-stop-animation">
      <svg><use href="#icon-pause"></use></svg>
      <svg><use href="#icon-play"></use></svg>
    </button>
    <div id="wrapper">
      <div aria-hidden="false">
        <h1>Titre #1</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
        <p>Vestibulum ultricies laoreet orci, sit amet molestie nulla efficitur ac.</p>
      </div>
      <div>
        <h1>Titre #2</h1>
        <p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
        <p>Maecenas tellus elit, suscipit at laoreet et, tempor a orci.</p>
      </div>
      <div>
        <h1>Titre #3</h1>
        <p>Nulla in tortor nec est placerat condimentum in nec magna.</p>
        <p>Nunc sollicitudin sem eget purus ultrices, bibendum pharetra augue aliquet.</p>
      </div>
      <div>
        <h1>Titre #4</h1>
        <p>Mauris consectetur lectus ut laoreet finibus. In gravida, massa eget tempus fringilla, eros nisi gravida massa, at accumsan massa nisl vel quam.</p>
        <p>Donec maximus molestie enim, ac elementum nisi posuere a. Vivamus eu varius erat.</p>
      </div>
    </div>
    <script>
    "use strict";
    const elemDisplay = [...document.querySelectorAll("#wrapper > *")]; // children
    const elemAvance = document.getElementById("barre-defilement");
    elemAvance.addEventListener("animationiteration", (e) => {
      elemDisplay[0].setAttribute("aria-hidden", true);
      elemDisplay.push(elemDisplay.shift());
      elemDisplay[0].setAttribute("aria-hidden", false)
    });
    const btnStop = document.getElementById("btn-stop-animation");
    btnStop.addEventListener("click", (e) => {
      btnStop.classList.toggle("play-animation");
      elemAvance.classList.toggle("stop-animation");
    });
    </script>
    <svg style="display:none">
      <symbol id="icon-pause" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M5 4h3v12H5V4Zm7 0h3v12h-3V4Z"/></symbol>
      <symbol id="icon-play"  xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="m5 4 12 6-12 6z"/></symbol>
    </svg>
    </body>
    </html>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CSS 3] Animation css3 non prise en compte
    Par ZarKx dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 30/10/2015, 23h36
  2. CSS non prise en compte avec un innerHTML
    Par Thewil dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/05/2009, 09h11
  3. Modifications feuilles CSS non prises en compte immédiatement
    Par brouce80 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/08/2007, 15h40
  4. [C#][2.0] CSS non prise en compte
    Par Eome dans le forum ASP.NET
    Réponses: 3
    Dernier message: 11/07/2006, 11h52
  5. [css] Feuille de style non prise en compte
    Par Neuromancien2 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 29/06/2005, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo