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

Mise en page CSS Discussion :

Déterminer la taille d'une image affichée dans un container


Sujet :

CSS

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut Déterminer la taille d'une image affichée dans un container
    Bonjour,
    J'affiche des images de tailles diverses dans un container de taille fixe (au sens css : width=700px et height=500px).
    Je conserve les proportions de l'image.
    Trois cas se présentent en fonction du rapport largeur/hauteur = 700/500 du container
    - l'image a un rapport =700/500 : l'image touche les bords haut, bas, droite et gauche du container.
    - l'image a un rapport >700/500 : l'image touche les bords gauche et droit du container, l'image est moins haute pour respecter les proportions.
    - l'image a un rapport <700/500 : l'image touche les bords haut et bas du container, l'image est moins large pour respecter les proportions.

    Connaissez vous une manière de connaitre par avance la taille finale de l'image en pixel connaissant 1)le rapport largeur/hauteur de l'image et 2)la taille du container (ici 700x500).

    J'espère avoir été clair.
    Merci

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    ça se calcule à l'aide du rapport R de l'image.
    si R > 700 / 500, la largeur finale sera 700 px et donc la hauteur sera 700 / R.
    et si R < 700 / 500, la hauteur finale sera 500 px et donc la largeur sera 500 × R.

  3. #3
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Merci, tout simple en effet.

  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
    Bonjour,
    Connaissez vous une manière de connaitre par avance la taille finale de l'image en pixel connaissant
    in fine quel est le but du jeu !?!

  5. #5
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Le but du jeu est de pouvoir associer à l'image affichée une sorte d'échelle afin de mettre en perspective les dimensions de l'image.
    Dans mon cas, je vais montrer une feuille A4 à coté de chaque image (photo de tableau). Je dois alors définir le container en pixels qui va accueillir cette "feuille A4".
    Exemple : Nom : Capture d’écran 2023-03-04 123611.jpg
Affichages : 191
Taille : 70,1 Ko
    Reste plus qu'à faire les conversions pour les autres tailles.

  6. #6
    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
    J'ai repris un peu le fil de tes discussions et suis tombé sur cette galerie, GALERIE ALAIN WALTER, qui visiblement reprend pas mal de tes problématiques.

    Il y a pas mal de chose à dire et notamment celle qui me paraît être la principale est que tes images font partie intégrante de ta page et dans ce cas ne doivent être en aucun cas affichées en background mais dans des balises <img> sans quoi ta pas n'a pour ainsi dire aucun contenu.

    Un autre point important est que tes éléments <li> doivent être enfant d’élément <ul>, ou <ol>, ce qui rend ta page non conforme mais ce n'est pas une catastrophe les moteurs de rendu s'en sortant plutôt bien

    Tu uses et abuses, à mon avis, inutilement des FLEX et des GRID. IL me semblerait plus sain d'utiliser, pour chaque image d'une structure sémantique comme :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <figure>
      <figcation>
        Définition de l'image
      </figcation>
      <img src="ton-image" alt="description image" data-size="larg x haut" loading="lazy">
    </figure>
    Chaque <figure> pouvant être en display:flex pour la mise en page.

    Petite explication sur :
    • data-size="larg x haut" : pour pouvoir calculer dynamiquement la taille de ta vignette A4, d'autant que ces valeurs tu les connais ;
    • loading="lazy" pour charger suivant le besoin tes images qu'il serait bon de redimensionner à la baisse.


    Reste plus qu'à faire les conversions pour les autres tailles.
    C'est typiquement le boulot de JavaScript, côté client, sauf à le faire effectivement directement côté serveur. Il n'est cependant pas obligatoire de passer par une image, celle-ci étant réalisable aisément en HTML-CSS.

    Je n'ai pas pu résister à te faire une maquette possible, le calcul dynamique du format A4 étant intégré en fin de page.


    Nota :
    Pour l'occasion la structure d'une ligne est la suivante :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <figcaption>
      <h2>Le crépuscule sur la mer</h2>
      Acrylique sur toile<br>2023<br>100x50
      <span class="formatA4">A4</span>
    </figcaption>
    <img src="https://peindreamonampteuil.go.yj.fr/medias/2023_02_Le_crepuscule_sur_la_mer.jpg" data-size="100 x 50" alt="Le crépuscule sur la mer" loading="lazy">
    </figure>
    Le <span> pourrait être ajouté dynamiquement mais bon ...

    Je te laisse regarder la source et si tu as des questions n'hésite pas

  7. #7
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Ouah trop fort!
    Bravo, C'est exactement le rendu espéré. Je vais l'incorporer dans mon code existant.
    J'avoue que je n'ai pas tout compris dans la construction de l'image A4 : comment se fait le lien entre le script et l'affichage de l'image? Je ne suis pas au niveau , je code à l'ancienne.
    Quant à la taille des images, en effet, elles ne devraient pas dépasser 0,5 Mo étant donné que le container fait 700x500... Je dois les convertir.

    Merci beaucoup

  8. #8
    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
    J'avoue que je n'ai pas tout compris dans la construction de l'image A4
    A quel niveau, si c'est pour sa construction : Effet de coin plié, folded corner.

    L'image A4 est cachée par défaut, display:none, et lorsque l'image tableau est chargée on la redimensionne, règle de trois, et on la passe en display:block, sauf si trop grande par rapport à l'image tableau.

    C'est la fonction JavaScript qui s'en charge :
    Code JavaScript : 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
    document.addEventListener("DOMContentLoaded", () => {
      const A4_WIDTH = 21.0;
      const A4_HEIGHT = 29.7;
      const A4_RAPPORT = A4_WIDTH / A4_HEIGHT;
     
      const images = document.querySelectorAll("figure img");
      images.forEach((img) => {
        img.onload = () => {
          const parent = img.parentNode;
          // taille image affichée
          const actualWidth = img.width;
          // lecture data-size
          const data = img.dataset.size?.split("x");
          // taille image originale
          const initialWidth = data ? data[0] : img.naturalWidth;
          // width-height A4 / image
          const widthImgA4 = A4_WIDTH / initialWidth * actualWidth;
          const heightImgA4 = widthImgA4 / A4_RAPPORT;
          // affichage si besoin
          if (widthImgA4 < img.width && heightImgA4 < img.height) {
            const elemA4 = parent.querySelector(".formatA4");
            if(elemA4){
              elemA4.setAttribute("draggable", true);
              elemA4.style.width = widthImgA4 + "px";
              elemA4.style.height = heightImgA4 + "px";
              elemA4.style.display = "block";
            }
          }
        }
      });
    });

  9. #9
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Je ne comprenais pas quel mécanisme faisait que l'image A4 était construite.
    J'ai enfin compris que le script est en attente (addEventListener) du chargement d'une image pour construire l'image A4 : le foreach sur img dans le cas d'un chargement (onload).

    Sans vouloir abuser, j'ai néanmoins un petit souci :
    L'image A4 s'affiche parfaitement au premier affichage de la page, mais si je fais Retour pour la page d'accueil puis je reviens à nouveau sur cette page, la page A4 ne s'affiche plus.
    Quelque chose à réinitialiser avant le Retour?

    Merci

  10. #10
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    Sans vouloir abuser, j'ai néanmoins un petit souci :
    L'image A4 s'affiche parfaitement au premier affichage de la page, mais si je fais Retour pour la page d'accueil puis je reviens à nouveau sur cette page, la page A4 ne s'affiche plus.
    Quelque chose à réinitialiser avant le Retour?Merci
    vous parlez d'un souci avec la page suivante ?
    https://peindreamonampteuil.go.yj.fr/galerieAW.php

    je ne vois pas ce que vous décrivez, je vois bien le même résultat en faisant "retour".
    j'ai la dernière version de firefox, peut-être que vous avez un souci de navigateur comme par exemple un cache bizarre ?

  11. #11
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Bonjour

    J'ai bien la dernière version FF : 110.0.1 64 bits.
    J'ai mis depuis longtemps le cache à 0 octet pour éviter ses effets de bord.

    Lorsque la page avec les tableaux est affichée la 1ère fois, les images A4 sont aussi affichées.
    Si je rafraichis la page, ou bien si je clique sur le bouton Retour puis reviens sur cette page les images A4 n'apparaissent plus.

  12. #12
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Je confirme le problème de la feuille A4, je dois faire un CTRL-F4 lors du retour à la page après un 'Retour'.
    C'est donc un problème de cache.
    Je suis également avec FF, test avec Edge : idem

  13. #13
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Alors c'est le cache coté serveur car le cache navigateur n'est pas utilisé.

    J'ai ajouté une deuxième galerie :
    - clic pour sélectionner 1ère galerie : les tableaux sont affichés avec l'image A4.
    - Retour
    - clic pour sélectionner 2ème galerie : les tableaux sont affichés avec l'image A4.
    -Retour
    - clic sur l'une ou l'autre des galeries : les tableaux sont affichés sans l'image A4.

  14. #14
    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 viens effectivement de voir ce dont tu parles et qui n'est pas forcément reproductible suivant le navigateur utilisé.

    Je te propose de remplacer le code JavaScript actuel par celui ci-dessous :
    Code JavaScript : 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
    /**
     * A mettre en fin de page
     */
    function ajusteA4(img) {
      const A4_WIDTH = 21.0;
      const A4_HEIGHT = 29.7;
      const A4_RAPPORT = A4_WIDTH / A4_HEIGHT;
     
      console.log(img.src)
      const parent = img.parentNode;
      // taille image affichée
      const actualWidth = img.width;
      // lecture data-size
      const data = img.dataset.size?.split("x");
      // taille image originale
      const initialWidth = data ? data[0] : img.naturalWidth;
      // width-height A4 / image
      const widthImgA4 = A4_WIDTH / initialWidth * actualWidth;
      const heightImgA4 = widthImgA4 / A4_RAPPORT;
      // affichage si besoin
      if (widthImgA4 < img.width && heightImgA4 < img.height) {
        const elemA4 = parent.querySelector(".formatA4");
        if (elemA4) {
          elemA4.setAttribute("draggable", true);
          elemA4.style.width = widthImgA4 + "px";
          elemA4.style.height = heightImgA4 + "px";
          elemA4.style.display = "block";
        }
      }
    }
     
    const images = document.querySelectorAll("figure img");
    images.forEach((img) => {
      const imgW = img.naturalWidth;
      const imgH = img.naturalHeight;
      // image non encore chargée
      if (!(imgW * imgH)) {
        img.addEventListener("load", () => ajusteA4(img));
      }
      // image chargée
      else {
        ajusteA4(img);
      }
    });
    c'est une approche à peine différente. A tester donc !

  15. #15
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Bonjour à tous

    NoSmoking, ta solution fonctionne à merveille. , plus de pb au rechargement de la page.
    C'est super .

    J'ai analysé ton code afin de comprendre un peu (je ne connais pas javascript, mais je devine les grandes lignes). Je vois que tu récupères via img.natural.width les vrais dimensions de l'image.
    Mais d'où viennent ces valeurs? Est ce dans les propriétés du fichier image?

    Merci

    Je vais cloturer la discussion car c'est largement résolu.
    Merci à ceux qui y ont contribué, mention spéciale à NoSmoking.
    J'espère que cela servira à d'autres.

  16. #16
    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
    Dans le code fourni au post#14, tu peux supprimer la ligne 9, console.log(img.src), qui n’était là que pour vérifier le passage ou non dans la fonction lors du retour.

    plus de pb au rechargement de la page.
    Je n'ai pas souvenir d'avoir déjà rencontré ce soucis ...



    Mais d'où viennent ces valeurs? Est ce dans les propriétés du fichier image?
    Ce sont les valeurs intrinsèques des images, les dimensions auxquelles s'afficherait l'image dans le navigateur en absence de directives de dimensionnement.

    Justement, concernant ces images il te faut user de plus de rigueur dans leur dimensionnement, voilà ce que j'ai rapidement relevé :
    Image Taille Affichage Dim. A4 Vue A4
    2022_10_pouring_N_4.jpg 2546 x 2558 547 x 550 382.9 x 541.5 oui
    2022_10_pouring_N_5.jpg 2690 x 2676 553 x 550 387.1 x 547.5 oui
    2022_10_pouring_N_6.jpg 2739 x 2686 561 x 550 392.7 x 550.4 NON
    2022_10_pouring_N_8.jpg 2706 x 2715 548 x 550 383.6 x 542.5 oui
    2022_10_pouring_N_10.jpg 2512 x 2512 550 x 550 385.0 x 544.5 oui
    Toutes ces toiles ont la même dimension, 30x30, mais toutes ne présenterons pas l'image A4 du fait du mauvais rapport largeur/hauteur.
    Seule l'image « 2022_10_pouring_N_10.jpg » respecte ce rapport de 1.

    Ce n'est pas en soi trop problématique mais tu pourrais avoir des questions !

  17. #17
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Bonjour

    Citation Envoyé par NoSmoking Voir le message
    Dans le code fourni au post#14, tu peux supprimer la ligne 9, !
    Oui c'est fait

    Citation Envoyé par NoSmoking Voir le message
    Je n'ai pas souvenir d'avoir déjà rencontré ce soucis ... !
    Les feuilles A4 ne s'affichaient pas après un rechargement de page.

    Pour ce qui est des tailles d'images, effectivement à partir de mes images photos, je devrais les redécouper en gardant la proportion largeur/hauteur.

    D'ailleurs, j'avais une question sur l'emplacement de l'image A4. Je ne vois pas pourquoi elle se place là, si loin du texte du tableau, au dessus d'elle : j'ai regardé les objets avec l'inspecteur ; je n'y vois pas de directive d'espacement qui le justifie. Une idée?

    Merci

  18. #18
    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
    D'ailleurs, j'avais une question sur l'emplacement de l'image A4. Je ne vois pas pourquoi elle se place là, si loin du texte du tableau, au dessus d'elle : j'ai regardé les objets avec l'inspecteur ; je n'y vois pas de directive d'espacement qui le justifie. Une idée?
    Je n'ai fait que repoduire, à peu près, ce que l'on voyait sur la capture que tu nous as fourni post #5.

    Le positionnement se fait par rapport à la <figure> conteneur et suivant cette règle, simplifiée pour l'occasion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    figure.row {
      position: relative;  /* pour servir de référent */
    }
    .row .formatA4 {
      position: absolute;  /* impératif pour le placement au pixel */
      bottom: 1em;         /* position à 1em (≈16px par défaut) du bord bas */
      left: 1em;           /* position à 1em (≈16px par défaut) du bord gauche */
    }

  19. #19
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Oui j'ai compris.
    J'ai changé le bottom par un top qui me cale par rapport au haut de la zone, c'est ce que je voulais.
    Merci

  20. #20
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Bonjour Mathieu,
    Je voudrais modifier le code que tu m'avais suggéré pour l'affichage de l'image et je ne comprends pas deux points subtils.
    Dans la ligne suivante :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
        print '  <img src="' . htmlentities($image,ENT_QUOTES) . '" alt="' . htmlentities($texte,ENT_QUOTES) . '" data-size="' . htmlspecialchars($dim) . '" loading="lazy">';
    Tu définis l'attribut data-size qui va contenir les dimensions du tableau : 100x40 par exemple
    Ensuite cette fonction va être appelé pour chaque image affichée :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function ajusteA4(img) {
    ...
      // lecture data-size
      const data = img.dataset.size?.split("x");                        //LIGNE A
      // taille image originale
      const initialWidth = data ? data[0] : img.naturalWidth;      //LIGNE B
    Sur le principe c'est clair.
    Je devine ensuite dans la LIGNE A qu'on récupère dans data[0] et data[1] les valeurs 100 et 40 (avec mon exemple plus haut), mais je ne trouve pas de signification au ? qui est un opérateur conditionnel, non?
    Après, dans la LIGNE B, on utilise data (qui est un tableau) comme étant une condition pour déterminer si on prend data[0] ou img.naturalWidth. C'est incompréhensible pour moi car data est un tableau.

    Peux tu m'éclairer s'il te plait?
    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/02/2020, 09h54
  2. Comment connaître la Taille d'une image chargée dans mx.controls.Loader ?
    Par Mister Paul dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 31/12/2010, 00h01
  3. ImageJ, redimensionner une image affichée dans la frame
    Par diophantes dans le forum ImageJ
    Réponses: 0
    Dernier message: 20/10/2008, 22h21
  4. [C#2.0]Récup d'une image affichée dans un webbrowser
    Par SLE dans le forum Windows Forms
    Réponses: 3
    Dernier message: 13/05/2008, 08h40
  5. [VB.NET] afficher une image stockée dans une table
    Par matonfire dans le forum ASP.NET
    Réponses: 4
    Dernier message: 19/03/2004, 11h21

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