28172 sujets

CSS et mise en forme, CSS3

Bonsoir à tous
J'ai une balise <div> qui contient un texte de longueur variable dans une balise <p>
Je voudrais que la ta taille s'ajuste au contenu de la façon suivante:
- si le contenu est court, disons jusque 15em, la largeur de la <div> doit s'adapter au contenu
- si le contenu est long, la largeur de la <div> doit être au plus "une certaine valeur", disons 25em
Comment styler cela en CSS?
Si je mets
min-width:15em;max-width:25em;
la taille est trop grande si le texte est très court.
Merci de votre aide
Modifié par PapyJP (03 May 2017 - 19:06)
Modérateur
Bonjour bonjour,

PapyJP a écrit :
Si je mets
min-width:15em;max-width:25em;
la taille est trop grande si le texte est très court.

Et bah normal vu que c'est la taille mini que vous avez défini...

PapyJP a écrit :

- si le contenu est court, disons jusque 15em, la largeur de la &lt;div&gt; doit s'adapter au contenu
- si le contenu est long, la largeur de la &lt;div&gt; doit être au plus "une certaine valeur", disons 25em

Et entre 15 et 25 du coup ?
Parceque si entre 0 et 15 ca doit s'adapter et entre 15 et 25 aussi, il ne faut pas mettre de min width.... simplement une hauteur max...
Merci de cette réponse
Je crois avoir mal exprimé le problème: il s'agit de textes très diffèrents, certains sur plusieurs lignes, donc pas de solution basée sur max-height.

Pour avoir un aperçu du problème, affichez la page http://tests.osirisnet.net/carte/carte_01.htm?fr et cliquez sur les point de la carte. Les textes en question s'affichent en cliquant sur les points rouges sur la carte.
La solution actuelle utilisé mal l'espace disponible, j'aimerais l'améliorer
Pour l'instant je ne vois pas de solution autre que de faire un calcul en JavaScript, même si cette situation a l'air tellement simple qu'elle devrait être traitable en pur CSS.
PapyJP a écrit :
même si cette situation a l'air tellement simple qu'elle devrait être traitable en pur CSS.


Bonjour,

J'ai des doutes à ce propos. Même si le Css permet au conteneur de s'adapter au contenu, il ne permet pas, à ma connaissance, d'être aussi précis. En effet, les conteneurs s'adaptent bêtement en s'ajustant sur la place occupée par le contenu mais sans tenir compte réellement de l'encombrement de ceux-ci. Il paraît impossible de pouvoir définir des points de rupture qui permettraient de modifier le comportement des conteneurs en fonction de la taille métrique de leur contenu.

On peut modifier l'adaptation d'un texte en fonction de la zone d'affichage par exemple qui elle a des valeurs calculées par le navigateur et prises en compte avant la phase de painting.

Au contraire,l'encombrement d'une phrase n'est pas calculée avant affichage donc on ne peut agir sur le comportement de son conteneur.

A titre d'exemple : A l'affichage de ma page, le moteur de rendu sait pertinemment que la zone d'affichage est de 100vw x 100 vh. Il est capable de m'indiquer cette taille au pixel près et ce avant même d'avoir chargé du Css.
Au moment où le navigateur charge le Css, le html est déjà chargé et les éléments sont affichés les uns à la suite des autres sans réel calcul mais en répondant tout de même aux propriétés primaires qui lui ont été inculquées.
Lorsque le Css est appliqué, les propriétés sont apposées une à une aux éléments : taille de police, modèles de boites etc etc Quand celui-ci en arrive aux propriétés concernant les tailles de boite, il n'a aucun moyen de calculer la taille finale du contenu pour la prendre en considération dans la taille du conteneur. Les dimensions ne seront connues qu'après coup soit après l'application complète du Css.

A mon sens, la problématique n'est pas solvable par le Css uniquement.


Je ne vois que 2 possibilités, chacune avec leurs avantages et leurs inconvénients.
[1] Par l'utilisation d'un langage client. C'est la méthode que vous utilisez actuellement. Soit appliqué en surcouche un programme JS qui calculera après coup la taille du contenu et fera opérer l'ajustement du conteneur.
L'avantage est la précision que cette méthode offre car l'espace occupé par le texte est calculé sur le rendu final.
L'inconvénient est qu'il fasse intervenir un code côté client qui ajoute une exécution supplémentaire sur la page et donc augmente le temps d'exécution du code, charge un peu plus le CPU et tout ce qui va avec.

[2] Par l'utilisation d'un langage serveur. On peut imaginer calculer le nombre de caractère en amont et apposer une classe Css qui dépendra de celui-ci.
L'avantage : Annihiler les inconvénients de la méthode [1].
Inconvénient : Nous perdons la précision implacable de la méthode [1] si tant est qu'elle puisse être indispensable.
Perso j'aurais plutôt tendance à opter pour cette méthode ; vous connaissez mes affinités avec JS. Mais cette méthode oblige à considérer alors qu'un caractère est égal à 1 rem (même si en pratique ce n'est pas tout à fait vrai dans la mesure où "O" est plus large que "i" à moins d'utiliser une police monospace). Or si dans votre Css, le contenu est défini à une valeur différente, ça peut vite devenir impossible à maintenir et galère à faire évoluer.


Qu'en pensez-vous ?
Modifié par Greg_Lumiere (04 May 2017 - 10:22)
Administrateur
Hello,

J'ai une bonne et une mauvaise nouvelle.

Comme souvent, CSS est capable de répondre à la question : il s'agit de la valeur-fonction minmax() (https://developer.mozilla.org/fr/docs/Web/CSS/minmax), et la compatibilité est la même que Grid Layout, à savoir les navigateurs modernes.
Modifié par Raphael (04 May 2017 - 10:18)
C'est aujourd'hui qu'il a besoin de la fonctionnalité, pas post mortem Smiley cligne Smiley lol

Trêve de plaisanterie, fonction intéressante dont je ne manquerais pas de suivre l'évolution.
Bonjour.

@Raphael :
minmax n'est, sauf erreur de ma part, disponible qu'à travers Gridlayout et celui-ci donne priorité au contenant et divise un espace défini. Or, ici, l'espace occupé par le texte est variable. Donc, non, je ne saisis pas comment cette fonction pourrait s'appliquer dans ce cas précis.

Smiley sweatdrop
@Greg_Lumiere
Merci de cette réponse et de l'explication du mécanisme sous-jacent.

Comme j'ai commencé à faire du JS bien avant que le CSS ait atteint son niveau actuel, ça fait très longtemps que j'ai fait en JS des choses de ce genre, mais j'espère toujours qu'il y a dans un coin de la spec CSS une combinaison de propriétés à laquelle je n'ai pas pensé qui permette de traiter élégamment le problème.
Ou bien je laisse les choses en l'état, bien que je ne les trouve pas satisfaisantes, ou bien je ferai quelque chose en JS, par exemple utiliser la solution d'ajouter une classe qui tienne compte de la taille du contenu, chose à laquelle je n'avais pas pensé.

Merci aux autres membres de ce forum qui se sont manifestés.
Effectivement, comme dit Greg_Lumiere, je verrai minmax en son temps... si je suis toujours de ce monde quand ça se produira. A la vitesse à laquelle ça avance, c'est peu vraisemblale.
Encore une fois, je ne suis pas à la recherche d'une solution parce que je n'en ai pas (je suis toujours jusqu'à présent arrivé à faire ce que je voulais avec n'importe quel langage informatique, et ce depuis mes débuts dans ce métier en 1967) mais à progresser dans ma connaissance du CSS à l'occasion de ce que je pense être un petit problème, pour une amélioration marginale d'une page. Comme cette page fait abondamment appel au JS, ce n'est pas vraiment dramatique d'ajouter les quelques lignes nécessaires quand j'en aurai le temps.

Le nombre de choses que j'ai pu apprendre en posant des questions sur ce forum est phénoménal, d'autant plus que quand on est retraité on n'a plus accès à la compétence du voisin de bureau. Je ne saurais trop vous remercier tous pour cela!
Modifié par PapyJP (04 May 2017 - 13:53)
De rien, c'est toujours un plaisir.

J'aime que vous vous interrogiez de cette façon et mettez ce forum à contribution. en effet, vos sujets sont toujours fort intéressants et vos problématiques si bien détaillées et pleines de bon sens donnent envie de se creuser les méninges. D'autant qu'il n'est pas rare qu'ils me conduisent à en apprendre toujours plus (moi non plus je ne peux compter sur le collègue du bureau).

Alors je ne dirais qu'une chose : Continuez à vous remettre en question et bonne continuation ! (oui ça fait deux choses, ben c'est comme ça, na !) Smiley biggrin
J'ai fait ajouté les 12 lignes de code nécessaires à modifier la classe d'une <div> en fonction de la longueur de texte des <p> quelle contient.
J'obtiens un résultat satisfaisant.
Merci encore pour m'avoir aidé à éclaircir mes idées.