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

JavaScript Discussion :

Navigateurs Change background


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    dessinateur
    Inscrit en
    Avril 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : dessinateur

    Informations forums :
    Inscription : Avril 2019
    Messages : 25
    Par défaut Navigateurs Change background
    Bonjour à tous,
    Ce code fonctionne très bien sur chrome, les backgrounds s’enchaînent bien lorsque je survole mon cadre.. Sur mozilla, une bref page blanche se produit lors du 1er mouseover et donc du 1er changement d’arrière plan... ensuite ils s'enchainent correctement.
    Sur IE, a chaque mouseover, ce bref instant 'blanc' fait surface

    Avez vous une idée (car cela me dérange..), ou peut êtrece code n'est il pas l'idéal.
    J'ai essayé avec addeventlistener mais le phénomène est le même..

    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
    <style>
    .cadre {
    position: absolute;
    width: auto;
    height: auto;
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out;
        }
    .image {
      display: block;
        width: auto;
        height: auto;
    }
     
    body
    {
    margin:0;
    padding: 0;
      background: url("img/FOND3.jpg") no-repeat center fixed; 
      -webkit-background-size: cover; /* pour Chrome et Safari */
      -moz-background-size: cover; /* pour Firefox */
      -o-background-size: cover; /* pour Opera */
      background-size: cover; /* version standardisée */
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out;}
    </style>
     
    <div id=cadre class=cadre onmouseover="over()"  onmouseout="out()" style='top:8%; left:8%;'><img src="img/svalbard.jpg"  class="image" alt="Le Svalbard" />
    </div>
     
    <script type="text/javascript">
    var body = document.getElementsByTagName ("body")[0];
    var cadre = document.getElementsById("cadre");
    function over() {
    body.style.backgroundImage = 'url(\'img/FOND3spitz.jpg\')';
    body.style.backgroundSize = "cover";
    }  
    function out() {
    body.style.backgroundImage = 'url(\'img/FOND3.jpg\')';
    body.style.backgroundSize = "cover";
    }   
    </script>

  2. #2
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 098
    Par défaut
    C’est un phénomène dont tu entendras parler sur le Web parfois sous le nom de « flicker » (littéralement « scintillement »). En général on l’évite en pré-chargeant les images. Quelques simples instructions comme suit suffisent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const $preloadImg = document.createElement("img");
    $preLoadImg.src = 'img/FOND3spitz.jpg';
    Sinon, tu peux tenter de changer la classe de <body> plutôt que changer le CSS directement. IE voudra peut-être mieux coopérer avec des images de fond déclarées dans un CSS statique.
    Code CSS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    body {
      background-image: url('img/FOND3.jpg');
      background-size: cover;
     
    body.hovered {
      background-image: url('img/FOND3spitz.jpg');
      background-size: cover;
    }

    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function over() {
      document.body.classList.add("hovered");
    }
     
    function out() {
      document.body.classList.remove("hovered");
    }
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre averti
    Homme Profil pro
    dessinateur
    Inscrit en
    Avril 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : dessinateur

    Informations forums :
    Inscription : Avril 2019
    Messages : 25
    Par défaut
    Merci pour ta réponse...
    Après vérification ce code ne fonctionne pas: la seconde image spitz ne s'affiche carrément plus
    Code : 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
     
    .cadre {
    position: absolute;
    width: auto;
    height: auto;
        }
    .image {
      display: block;
        width: auto;
        height: auto;
    }
    body
    {
    margin:0;
    padding: 0;
      background: url("img/FOND3.jpg") no-repeat center fixed; 
      -webkit-background-size: cover; /* pour Chrome et Safari */
      -moz-background-size: cover; /* pour Firefox */
      -o-background-size: cover; /* pour Opera */
      background-size: cover; /* version standardisée */
    -webkit-transition: all .3s ease-in-out;
    -moz-transition: all .3s ease-in-out;
    transition: all .3s ease-in-out;}
    </style>
     
    <div id=cadre class=cadre onmouseover="over()"  onmouseout="out()" style='top:8%; left:8%;'><img src="img/svalbard.jpg"  class="image" alt="Le Svalbard" />
    </div>
     
    <script type="text/javascript">
    const $preloadImg = document.createElement("img");
    $preLoadImg.src = 'img/FOND3spitz.jpg';
    var body = document.getElementsByTagName ("body")[0];
    var cadre = document.getElementsById("cadre");
    function over() {
    body.style.backgroundImage = 'url(\'img/FOND3spitz.jpg\')';
    body.style.backgroundSize = "cover";
    }  
    function out() {
    body.style.backgroundImage = 'url(\'img/FOND3.jpg\')';
    body.style.backgroundSize = "cover";
    }   
    </script>
    Concernant ta seconde façon de procéder, je ne comprends pas bien. Le bodybg doit se changer lorsque l'on survole un div 'cadre'. pourquoi body.hovered ? De plus j'ai plusieurs images de fond qui viendront en fonction des différents cadres que je survolerai.
    Merci pour ton aide

  4. #4
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 098
    Par défaut
    Citation Envoyé par Charal72 Voir le message
    Merci pour ta réponse...
    Après vérification ce code ne fonctionne pas: la seconde image spitz ne s'affiche carrément plus
    As-tu testé avec plusieurs navigateurs ?
    Si l’image est très volumineuse, il est possible que le navigateur n’arrive plus à la réafficher depuis le cache. Par exemple, j’ai déjà vu ça arriver avec Firefox. Vérifie la taille de tes images, compresse-les si c’est possible.

    Concernant ta seconde façon de procéder, je ne comprends pas bien. Le bodybg doit se changer lorsque l'on survole un div 'cadre'. pourquoi body.hovered ?
    C’est juste un nom de classe. Je l’ai peut-être mal choisi, j’aurais pu mettre par exemple .fond-alternatif.

    Si tu veux rajouter des cadres, il faut commencer à s’organiser un peu. Tu pourrais par exemple mettre l’URL de l’image dans un attribut data, puis la passer en paramètre à ta fonction over().

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div class="cadre" data-fond="img/FOND3spitz.jpg"> ... </div>
    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
    document.addEventListener("mouseover", function (event) {
      if (event.target.matches(".cadre")) {
        over(event.target.dataset.fond);
      }
    });
     
    document.addEventListener("mouseout", function (event) {
      if (event.target.matches(".cadre")) {
        out();
      }
    });
     
    function over(imageUrl) {
      document.body.style.backgroundImage = `url('${imageUrl}')`;
      document.body.style.backgroundSize = "cover";
    }
     
    function out() {
      document.body.style.backgroundImage = "url('img/FOND3.jpg')";
      document.body.style.backgroundSize = "cover";
    }

    J’ai choisi mouseenter et mouseleave plutôt que mouseover et mouseout car ils sont plus pratiques : ils n’émettent pas de faux positifs quand tu survoles un élément enfant de l’élément ciblé.

    J’ai également utilisé addEventListener pour éviter d’avoir des attributs on* partout dans le code HTML.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Membre averti
    Homme Profil pro
    dessinateur
    Inscrit en
    Avril 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : dessinateur

    Informations forums :
    Inscription : Avril 2019
    Messages : 25
    Par défaut
    Vérifie la taille de tes images, compresse-les si c’est possible.
    C'est fait..aucune modif. même résultat et mêmes effets que ceux cités précédemment.

    J’ai également utilisé addEventListener pour éviter d’avoir des attributs on* partout dans le code HTML.
    Désolé..je n'y arrive pas! toujours ce scintillement..je vais essayer en préloadant les imgs.

    Prend l’habitude de mettre soit des ' soit des ", mais ne les mélangent pas, ce sera plus facile de lire ton code et éventuellement l'interpréteur du navigateur sera content.
    Merci pour ce conseil.. mais il n'influe pas sur le résultat

  6. #6
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 098
    Par défaut
    Bonjour,
    j’ai fait une grosse bourde hier en essayant de déléguer les évènements mouseenter et mouseleave. Ces évènements, par conception, ne bouillonnent pas, on ne peut donc pas les déléguer.

    Du coup j’ai fait une page de test en utilisant la propriété relatedTarget des évènements mouseover et mouseout. Voici le code complet de ma page.
    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
    <!DOCTYPE html>
    <html lang="fr">
    <head>
      <meta charset="utf-8" />
      <title>Changement de fond au survol</title>
      <style>
     
      body {
        background-image: url('img/FOND3.jpg');
        background-size: cover;
        background-color: black;
        color: white;
      }
     
      body.fond-alternatif {
        background-image: url('img/FOND3spitz.jpg');
        background-color: red;
      }
     
      .cadre {
        width: 300px;
        height: 300px;
        background: rgba(196, 255, 112, 0.5);
      }
     
      .cadre div {
        width: 60px;
        height: 60px;
        display: inline-block;
        margin: 1em;
        background: rgba(255, 255, 255, 0.5);
      }
     
      </style>
    </head>
    <body>
     
    <h1>Changement de fond au survol</h1>
     
    <div class="cadre">
      <div></div>  <div></div>  <div></div>
    </div>
     
    <script> "use strict";
     
    const over = () => {
      document.body.classList.add("fond-alternatif");
    };
     
    const out = () => {
      document.body.classList.remove("fond-alternatif");
    };
     
    const isDescendant = (aChild, aParent) => {
      if (!aChild || !aParent) return false;
     
      let found = false;
      let element = aChild.parentElement;
      while (!found && element) {
        if (element === aParent) found = true;
        element = element.parentElement;
      }
      return found;
    };
     
    document.addEventListener("mouseover", (event) => {
      if (event.target.matches(".cadre")) {
        if (!isDescendant(event.relatedTarget, event.target)) {
          console.log("%cmouseover%c on en veut bien", "color: orange", "");
          over();
        }
        else {
          console.log("%cmouseover%c non merci", "color: orange", "");
        }
      }
    });
     
    document.addEventListener("mouseout", (event) => {
      if (event.target.matches(".cadre")) {
        if (!isDescendant(event.relatedTarget, event.target)) {
          console.log("%cmouseout%c on en veut bien", "color: cyan", "");
          out();
        }
        else {
          console.log("%cmouseout%c non merci", "color: cyan", "");
        }
      }
    });
     
    </script>
    </body>
    </html>

    J’ai mis une couleur de fond rouge pour bien voir le flash. Et j’ai bel et bien un flash rouge, sous Firefox et sous Vivaldi (un équivalent de Chrome que j’avais sous la main).

    Ça ne change rien de précharger l’image avec la technique document.createElement("img"). En fait, en regardant dans la console réseau, on voit que le problème se produit même quand les images ont un code 304 (qui signifie qu’elles sont obtenues depuis le cache du navigateur). Je pense que le problème est en fait lié à la compression de l’image (jpeg, png, etc.), et que la latence qui provoque le flash est dûe au temps que met le navigateur à décoder l’image en bitmap brut.

    Du coup je me suis dit : passons par un canevas pour décoder l’image à l’avance. Et ça a l’air de marcher… Mais accroche-toi, c’est plutôt velu

    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    <!DOCTYPE html>
    <html lang="fr">
    <head>
      <meta charset="utf-8" />
      <title>Changement de fond au survol</title>
      <style>
     
      body {
        background-image: url('img/FOND3.jpg');
        background-size: cover;
        background-color: black;
        color: white;
      }
     
      body.fond-alternatif {
        background-color: red;
      }
     
      .cadre {
        width: 300px;
        height: 300px;
        background: rgba(196, 255, 112, 0.5);
      }
     
      .cadre div {
        width: 60px;
        height: 60px;
        display: inline-block;
        margin: 1em;
        background: rgba(255, 255, 255, 0.5);
      }
     
      </style>
    </head>
    <body>
     
    <h1>Changement de fond au survol</h1>
     
    <div class="cadre">
      <div></div>  <div></div>  <div></div>
    </div>
     
    <script> "use strict";
     
    // changement : over reçoit une URL en paramètre, et on n’agit plus sur la classe,
    // on manipule directement backgroundImage
    const over = (imageUrl) => {
      document.body.style.backgroundImage = `url('${imageUrl}')`;
    };
     
    const out = () => {
      document.body.style.backgroundImage = "";
    };
     
    const isDescendant = (aChild, aParent) => {
      if (!aChild || !aParent) return false;
     
      let found = false;
      let element = aChild.parentElement;
      while (!found && element) {
        if (element === aParent) found = true;
        element = element.parentElement;
      }
      return found;
    };
     
    // on n’écoute pas tout de suite l’évènement mouseover,
    // on attend d’avoir décodé les images
     
    document.addEventListener("mouseout", (event) => {
      if (event.target.matches(".cadre")) {
        if (!isDescendant(event.relatedTarget, event.target)) {
          console.log("%cmouseout%c on en veut bien", "color: cyan", "");
          out();
        }
        else {
          console.log("%cmouseout%c non merci", "color: cyan", "");
        }
      }
    });
     
    // les images décodées sont représentées sous forme de blobs,
    // il faut les révoquer au déchargement de la page pour libérer la mémoire
    const urlsToRevoke = [];
    window.addEventListener("unload", () => {
      console.log(`revoking object URLs now (length = ${urlsToRevoke.length})`);
      for (const url of urlsToRevoke) {
        URL.revokeObjectURL(url);
      }
    });
     
    // la fonction de décodage, elle renvoie une promesse
    const decodeImage = (imageUrl) => new Promise((resolve, reject) => {
      const $img = document.createElement("img");
     
      $img.addEventListener("error", (error) => {
        // en cas d’erreur de chargement de l’image, on rejette la promesse
        reject(error);
      });
     
      $img.addEventListener("load", (loadEvent) => {
        if ($img.complete && $img.naturalWidth > 0) {
          // crée un canevas aux dimensions de l’image
          const $canvas = document.createElement("canvas");
          $canvas.width = $img.naturalWidth;
          $canvas.height = $img.naturalHeight;
     
          // dessine l’image dans le canevas
          const cx = $canvas.getContext("2d");
          cx.drawImage($img, 0, 0);
     
          // crée un blob à partir du canevas
          $canvas.toBlob((blob) => {
            // crée une URL « blob: »
            const blobURL = URL.createObjectURL(blob);
            urlsToRevoke.push(blobURL);
     
            // on résoud la promesse avec l’URL du blob
            resolve(blobURL);
          }, { type: "image/bmp" }); // type bitmap = sans compression
        }
      });
     
      // initie le chargement de l’image
      $img.src = imageUrl;
    });
     
    decodeImage("img/FOND3spitz.jpg").then((blobURL) => {
      // la fonction .then() est appelée quand la promesse est résolue,
     // on peut alors écouter mouseover
      document.addEventListener("mouseover", (event) => {
        if (event.target.matches(".cadre")) {
          if (!isDescendant(event.relatedTarget, event.target)) {
            console.log("%cmouseover%c on en veut bien", "color: orange", "");
            over(blobURL);
          }
          else {
            console.log("%cmouseover%c non merci", "color: orange", "");
          }
        }
      });
    });
     
    </script>
    </body>
    </html>
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 130
    Par défaut
    Salut

    Essais de modifier ta ligne 26 ainsi
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <div id="cadre" class="cadre" onmouseover="over()"  onmouseout="out()" style="top:8%; left:8%;"><img src="img/svalbard.jpg"  class="image" alt="Le Svalbard" />
    Prend l’habitude de mettre soit des ' soit des ", mais ne les mélangent pas, ce sera plus facile de lire ton code et éventuellement l'interpréteur du navigateur sera content.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

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

Discussions similaires

  1. pourquoi le programme html &css change selon le navigateur
    Par razily dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 04/06/2010, 13h17
  2. Navigateur : Google Chrome change de moteur de rendu 3D
    Par Gordon Fowler dans le forum Actualités
    Réponses: 10
    Dernier message: 15/10/2009, 18h03
  3. change textcolor or background color
    Par Namson dans le forum C
    Réponses: 3
    Dernier message: 07/01/2009, 23h31
  4. Background ligne change onclick
    Par poosh dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 25/07/2007, 12h41

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