28172 sujets

CSS et mise en forme, CSS3

Bonjour à tous
Toujours dans le cadre de la refonte des groupes d'images, je tombe sur le problème suivant
page https://tests.osirisnet.net/news/@@n_02_22.htm
Si je réduis la largeur à celle d'un iPhone (375px) j'obtiens
upload/1666520617-48769-row3.png
Comment corriger le CSS pour que le groupe d'image reste dans les limites de la fenêtre ?
Modifié par PapyJP (25 Oct 2022 - 11:49)
Modérateur
Bonjour,

tu indiques un max-width , peut-être le reduire ou utilisé une autre unité? (par exemple entre 35 et 40vw)

<img src="/news/photo/xxxxxxx_01v.jpg" alt="" onclick="PopupImage(event)" data-img="/news/photo/xxxxxx_01.jpg" style="max-height: 10.5882rem; max-width: 38vw;">


Tu peut aussi passer plusieurs valeur avec clamp, pour basculer de l'une vers l'autre. ( https://developer.mozilla.org/fr/docs/Web/CSS/clamp )

max-width: clamp( 50px, 36vw ,15.8824rem );


Cdt
Modifié par gcyrillus (23 Oct 2022 - 14:05)
Il faut bien comprendre le contexte dans lequel je travaille.
Le propriétaire du site écrit quelque chose comme

<div class="cluster width60"> 
    <!-- c'est un dire un groupe d'images largeur max 60% de la page -->
    <script>diapo(image1)</script>
    <script>diapo(image2)</script>
</div>

C'est à moi, en utilisant JavaScript et CSS, de faire en sorte que ça ait une présentation plus ou moins conforme à ce qu'il désire.
Dans le site officiel actuel https://www.osirisnet.net/news/n_02_22.htm
les tailles d'images sont calculées par JavaScript au chargement de la page et à chaque changement de taille ou d'orientation de la fenêtre et j'obtiens
upload/1666529157-48769-row4.png

Ce que je cherche actuellement à faire c'est obtenir l'équivalent par CSS, et je n'arrive pas à le faire.
Sur le fond, ça n'a pas grande importance, ce n'est pas comme si je n'avais pas du tout de solution, mais comme je l'ai déjà dit je n'aime pas jeter l'éponge.

Ce que je constate en analysant la page par l'outil de développement de FireFox, c'est que
div.cluster prend une largeur de 397 px alors que le max-width calculé est de 180px
Les deux figure.diapo ont une largeur de 190px alors qu'elles ont width:50% donct au maximum elles devraient avoir width 90px
Cela veut donc dire que ce sont les images qui l'emportent.
Ces images sont définies avec max-width:16rem
La raison de cette expression c'est que la valeur de rem est calculée par
@media screen and (max-width:1024px) {
	html {font-size:1.7vw;}
}
@media screen and (max-width:705px) {
	html {font-size:12px;}
}

c'est ce qui permet de rendre la page responsive en gardant le texte lisible.
Ici on a rem=12px donc max-width=12*16 = 180px, donc c'est bien la taille des images qui l'emporte sur les tailles maximum données pour leur conteneur.
La question n°1 c'est pourquoi le conteneur n'impose pas sa taille max.
La question n°2 c'est comment faire pour éviter ça, quelle valeur et quelle unité utiliser ?

Je vais essayer de trouver quelque chose dans ce sens.
Modifié par PapyJP (24 Oct 2022 - 17:42)
Bonjour,
si tu réduis encore ces images, elle vont s'afficher en très petit, à un point où ça n'aura plus beaucoup d'intérêt, sur un très petit écran (comme l'exemple de la version officielle du site que tu donnes). Et ici un écart apparaît entre "Les" et "archéologues".
Il vaudrait mieux alors que ces images passent à la ligne, non. En version plus large, je trouve très bien que du texte se mette autour. Mais vers 574, le "Les" de "Les archéologues" commence à être seul, jusqu'à la valeur de 504, où le texte passe en-dessous des images. C'est à partir de 482, que ces images commencent à déborder. Je crois que là, il faudrait décider de les faire passer en-dessous, ce qui réglerait ton problème.

Je n'ai testé qu'avec le module adaptatif de Firefox, il se peut que sur un vrai mobile, ce que je décrit se passe un peu différemment, mais le principe est là.
Pour l'instant j'ai trouvé comment faire pour que les images restent les mêmes que dans la version actuelle: j'exprime les max-width des images en vw, sachant que sur grand écran la zone d'affichage fait au maximum 1024px.
Voir https://tests.osirisnet.net/news/@@n_02_22.htm
Cela semble marcher, du moins j'espère, je vais tester ce que ça donne sur quelques dizaines de pages.

@Bongota
Tu as raison sur tous ces points, mais la plupart des images ne sont que des boutons qui permettent d'afficher l'image réelle en plein écran quand on clique dessus, ce n'est donc pas trop gênant que les images soient très petites.
Le propriétaire du site ne se préoccupe pas trop du rendu des pages sur téléphone, mais ce à quoi je tiens dans un premier temps c'est que ça puisse au moins s'afficher.
Je vais regarder comment traiter les problèmes que tu me signales à juste titre, quelque chose comme faire que en dessous d'une certaine largeur les images se mettent sur une ligne à part, j'ai déjà des idées sur la façon de faire ça, mais une chose à la fois!
Modifié par PapyJP (24 Oct 2022 - 17:44)
Même si j'ai trouvé une solution, je n'ai pas la réponse à
PapyJP a écrit :

La question n°1 c'est pourquoi le conteneur n'impose pas sa taille max.

Le HTML généré est du genre

<div class="cluster">
    ....
    <div class="group">
        <figure class="diapo" style="max-width:43%">
            <img>...</img>
        </figure>
        <figure class="diapo" style="max-width:52%">
            <img>...</img>
        </figure>
    </div>
</div>

Ce que je voudrais, c'est que la largeur d'une <figure> s'impose à l' <img> qu'elle contient.
Comme ce n'est pas le cas, j'ai ajouté style:"max-width:...vw" dans <img>
Que faudrait-il faire pour que ce ne soit pas nécessaire ?
Je n'ai pas trouvé dans le CSS ce qui provoque ce comportement.
Merci de bien vouloir m'apporter vos lumières.
J'ai trouvé le problème : j'avais écrit width:max-content au lieu de max-width:max-content.
Modérateur
PapyJP a écrit :

Qu'est-ce qui fait que ce sont les images qui imposent leur largeur au conteneur et non l'inverse ?
Smiley mur


A premiere vue :
* float:left;
* un display:table
* flex-shrink:0

Mais il y a aussi du flex

on n'arrive pas trop à savoir quelle valeur de display est finalement appliquée (ah si il y a un !important)

Le display:table n'est plus nécessaire me semble t-il car je vois aussi un flex en colonne

Flex à parfois des soucis de calcul, un min-width:0; ou overflow:hidden; est généralement ce qui est utilisé pour le régler.

Un flex-basis: XX pour diapo serait mieux venu pour donner une largeur au figure .Les max-width ne serait donc plus nécessaire via js sur les images en réglant ce comportement de flex

j'ai essayer de ressortir quelques uns des styles pour y voir plus clair , mais , c'est sans le js et probablement incomplet.exemple retirant le display:table et ajoutant un min-width:0 et un flex-basis : 50% à .diap . styles injectés sur figure et image retirée ausi. Mais je ne suis pas certain que cela puisse t'aider car le nombre de figures dans un conteneur varient sur le site (1 à XX )
https://codepen.io/gc-nomade/pen/QWxWaKg

Cdt
Modifié par gcyrillus (25 Oct 2022 - 16:58)
La nuit portant conseil je crois comprendre pourquoi ça ne fonctionne pas : d
ans certains cas il feudrait que ce soit les images qui imposent la largeur du conteneur, dans d’autres cas c’est l’inverse.
Si je savais clairement distinguer ces cas, la solution serait facile. Poue le moment je ne sais pas le faire.
En gros c’est "si la largeur du contenu est plus petite que la largeur max du contenant, le contenant doit se réduire. Si c’est l’inverse c’est le contenu qui doit se réduire"
L’énoncé du problème est simple, sa solution en CSS en mode responsive ne l’est pas.
Une idée?
Modérateur
Bonjour,
PapyJP a écrit :

En gros c’est "si la largeur du contenu est plus petite que la largeur max du contenant, le contenant doit se réduire. Si c’est l’inverse c’est le contenu qui doit se réduire"


ca c'est pour le visuel.

Peut-être faut-il reprendre les choses par étapes (reduire le HTML aussi ?)

Les "cluster" peuvent être accrocher à droite ou à gauche : donc un float est okay

Ils peuvent contenir de 1 image a plusieurs sur plusieurs lignes flex-wrap est okay , pour de grande serie, pas de float à priori et éventuellement un justify-content:center ?

ils peuvent contenir images + description mais toutes les images sur une ligne devraient avoir la même hauteur . Oups ! solution, passer la légende au dessus de l'image avec un fond légèrement opaque pour ne pas avoir à se soucier du nombre de lignes possible, un compromis peut-être à faire ici ?

Les largeurs/hauteurs , hmm voilà le souci où l'on peut se servir des médiaqueries pour donner ou pas une dimension aux figures et effectuer quelques tests de rendu . faut-il privilégier une hauteur plutôt qu'une largeur ?

Combien d'image ? avec :nth-last-child(n):first-child on pourrait filtrer selon la position de la première image par rapport à la dernière. et donner des valeur de width/height différentes pour mieux se "melanger" aux textes adjacents.

Quelles sont les tailles max et min que peuvent avoir les images à affichée, ainsi que leur ratios ?
Quelles seraient les longueurs max des textes ?

Est ce que j'ai oublié quelque chose d'essentiel ? (edit: ah oui, le site à une largeur max, au dela de laquelle les valeur en vw ne sont plus pertinentes)

Cdt
Modifié par gcyrillus (26 Oct 2022 - 11:03)
\ô/

J'ai regardé rapidement, et avant que gcyrillus ne fasse son analyse, tu pourrais peut-être t'en sortir en jouant avec max-inline-size et max-width.
En prenant cet exemple
<div class="group">
  <figure class="diapo">
    <img src="https://via.placeholder.com/200x400.png/ddeeff/006699">
    <figcaption>...</figcaption>
  </figure>
  <figure class="diapo">
    <img src="https://via.placeholder.com/400x200.png/ffddee/990066">
    <figcaption>...</figcaption>
  </figure>
</div>

et en lui appliquant ce css
.group {
  display: flex;
  gap: .5em;
}
.diapo {
                                  /* attention à l'ordre */
  max-inline-size: min-content;   /* (1) */
  max-width: 20em;                /* (2) */
  margin: 0;
}
.diapo img {
  max-width: 100%;
}

cela répond à ta demande
PapyJP a écrit :
En gros c’est "si la largeur du contenu est plus petite que la largeur max du contenant, le contenant doit se réduire. Si c’est l’inverse c’est le contenu qui doit se réduire"
Merci de cette piste
Je ne connaissais pas max-inline-size
Je vais regarder de ce côté-là