Table des matières
Étape 4
Et si l'utilisateur modifie la taille de la police racine?
Pour ceux qui ne se soucient pas des situations extrêmes
Comment éviter le réajustement du texte
Texte de non-réalisation dans le conteneur
Résumer
Maison interface Web tutoriel CSS Taille de police à échelle linéaire avec CSS clamp () basé sur la fenêtre

Taille de police à échelle linéaire avec CSS clamp () basé sur la fenêtre

Apr 02, 2025 am 04:21 AM

Taille de police à échelle linéaire avec CSS clamp () basé sur la fenêtre

La typographie réactive a essayé de nombreuses méthodes dans le passé, telles que les requêtes multimédias et CSS calc ().

Cet article explorera une approche différente, qui consiste à évoluer le texte linéairement entre les tailles minimales et maximales à mesure que la largeur de la fenêtre augmente, dans le but de rendre son comportement plus prévisible à différentes tailles d'écran - le tout avec une seule ligne de code CSS, grâce à clamp() .

Le CSS Function clamp() est puissant. Il fonctionne à toutes fins, mais est particulièrement utile pour la typographie. Il fonctionne comme suit: il accepte trois valeurs:

 <code>clamp(minimum, preferred, maximum);</code>
Copier après la connexion

La valeur qu'il renvoie sera la valeur préférée jusqu'à ce que la valeur préférée soit inférieure à la valeur minimale (la valeur minimale sera renvoyée) ou supérieure à la valeur maximale (la valeur maximale sera renvoyée).

Donc, en supposant que vous ne définissez pas une valeur étrange et que vous la définissez entre les valeurs minimales et maximales, est-ce toujours la valeur préférée? Eh bien, vous devez utiliser des formules avec des valeurs préférées, par exemple:

 <code>.banner { width: clamp(200px, 50% 20px, 800px); /* 是的,您可以在clamp() 中进行数学运算!*/ }</code>
Copier après la connexion

Supposons que vous souhaitiez définir la taille minimale de la police de l'élément à 1 REM lorsque la largeur de la fenêtre est de 360px ou moins et que la taille maximale de la police est de 3,5 REM lorsque la largeur de la fenêtre est de 840px ou plus.

autrement dit:

 <code>1rem  = 360px 及以下缩放= 361px - 839px 3.5rem = 840px 及以上</code>
Copier après la connexion

Toute largeur de fenêtre entre 361 et 839 pixels nécessite une taille de police qui est linéairement mise à l'échelle entre 1REM et 3,5REM. L'utilisation clamp() est en fait très facile ! Par exemple, avec une largeur de la fenêtre de 600 pixels (entre 360 ​​et 840 pixels), nous obtiendrons la valeur intermédiaire entre 1REM et 3,5REM, c'est-à-dire 2.25rem.

L'objectif que nous essayons d'atteindre avec clamp() est appelé interpolation linéaire : obtient les informations intermédiaires entre deux points de données.

Voici quatre étapes pour faire ceci:

Étape 1

Sélectionnez les tailles de police minimales et maximales, ainsi que les largeurs de fenêtre minimales et maximales. Dans notre exemple, la taille de la police est 1REM et 3,5REM et la largeur est 360px et 840px.

Étape 2

Convertir la largeur en rem. Étant donné que 1REM sur la plupart des navigateurs est 16px par défaut (plus à ce sujet plus tard), nous l'utiliserons. Par conséquent, les largeurs de vision minimale et maximale seront respectivement de 22,5 REM et 52,5 REM.

Étape 3

Ici, nous serons légèrement biaisés vers l'aspect mathématique. Lorsqu'il est combiné, la largeur de la fenêtre et la taille de la police forment deux points sur les systèmes de coordonnées X et Y, et ces points forment une ligne.

Nous avons besoin de cette ligne - plus précisément, nous avons besoin de sa pente et de son intersection avec l'axe Y. Voici la méthode de calcul:

 <code>slope = (maxFontSize - minFontSize) / (maxWidth - minWidth) yAxisIntersection = -minWidth * slope minFontSize</code>
Copier après la connexion

Cela nous conduit à une valeur de pente de 0,0833 et à une valeur d'intersection de l'axe y de -0,875.

Étape 4

Maintenant, nous construisons clamp() . La formule de la valeur préférée est:

 <code>preferredValue = yAxisIntersection[rem] (slope * 100)[vw]</code>
Copier après la connexion

Ainsi, la fonction finit par être ceci:

 <code>.header { font-size: clamp(1rem, -0.875rem 8.333vw, 3.5rem); }</code>
Copier après la connexion

Vous pouvez visualiser les résultats dans la démonstration suivante:

Continuez et essayez-le. Comme vous pouvez le voir, lorsque la largeur de la fenêtre est de 840px, la taille de la police cesse de croître et lorsque la largeur de la fenêtre est de 360px, la taille de la police cesse de diminuer. Tout entre les changements de manière linéaire.

Et si l'utilisateur modifie la taille de la police racine?

Vous avez peut-être remarqué une petite faille dans cette approche: cela ne fonctionne que si la taille de la police racine est ce que vous pensez (16px dans l'exemple précédent) et ne change jamais.

Nous convertissons les largeurs 360px et 840px en unités REM en la divisant par 16, car nous supposons qu'il s'agit de la taille de la police racine. Si l'utilisateur définit sa préférence sur une autre taille de police racine, comme 18px au lieu du 16px par défaut, le calcul se déroulera et le texte ne redimensionnera pas comme nous l'avons prévu.

Nous n'avons qu'un moyen d'utiliser ici, qui est (1) faire les calculs nécessaires dans le code lorsque la page se charge, (2) écouter les modifications de la taille de la police racine, et (3) recalculer tout si quelque chose de modifications se produit.

Voici une fonction JavaScript utile pour effectuer des calculs:

 // Obtenez la largeur de la fenêtre dans les pixels et la taille de la police dans le clilter de fonction REM (Minwidthpx, maxwidthpx, minfontsize, maxfontsize) {
  const root = document.QuerySelector ("html");
  const pixelsperrem = nombre (getCompuledStyle (root) .fontize.slice (0, -2));

  const minwidth = minwidthpx / pixelsperrem;
  const maxwidth = maxwidthpx / pixelsperrem;

  const slope = (maxfontize - minfontize) / (maxwidth - minwidth);
  Const yaxisInthessection = -minwidth * pente minfontsize;

  return `clamp ($ {minfontsize} rem, $ {yaxisIntersection} rem $ {slope * 100} vw, $ {maxfontsize} rem)`;
}

// ClampBuilder (360, 840, 1, 3,5) -> "pince (1rem, -0.875rem 8.333vw, 3.5rem)"
Copier après la connexion

J'ai délibérément omis comment injecter la chaîne retournée dans CSS car il existe de nombreuses façons de le faire en fonction de vos besoins et si vous utilisez CSS natif, la bibliothèque CSS-in-JS ou autre chose. De plus, il n'y a pas d'événements natifs pour les changements de taille de police, nous devons donc vérifier manuellement. Nous pouvons utiliser setInterval pour vérifier une fois par seconde, mais cela peut affecter les performances.

Cela ressemble plus à une situation extrême. Peu de gens changent la taille de la police de leurs navigateurs, et même moins de personnes le changent lors de la visite de votre site Web. Mais si vous voulez que votre site Web soit aussi réactif que possible, c'est la meilleure façon de le faire.

Pour ceux qui ne se soucient pas des situations extrêmes

MISE À JOUR: Les ressources partagées ici ont cessé de fonctionner depuis la publication de cet article. Si vous recherchez une calculatrice pour aider à déterminer les tailles de police dans diverses fenêtres, envisagez d'utiliser un générateur de type fluide, qui utilise la typographie du fluide moderne.

Comment éviter le réajustement du texte

Un tel contrôle méticuleux sur la taille de la typographie nous permet de faire d'autres choses intéressantes, telles que l'empêche de texte de réajuster à différentes largeurs de la fenêtre.

C'est le comportement normal du texte.

Mais maintenant, avec notre contrôle, nous pouvons garder le texte le même nombre de lignes, enveloppant toujours des lignes au même mot, quelle que soit la largeur de la fenêtre que nous utilisons.

Alors, comment pouvons-nous faire cela? Premièrement, le rapport entre la taille de la police et la largeur de la fenêtre doit rester le même. Dans cet exemple, nous passons de 1REM à 320px à 3rem à 960px.

 <code>320 / 1 = 320 960 / 3 = 320</code>
Copier après la connexion

Si nous utilisons clampBuilder() écrite plus tôt, elle deviendra:

 const text = document.QuerySelector ("p");
text.style.fontsize = ClampBuilder (320, 960, 1, 3);
Copier après la connexion

Il maintient la même largeur / rapport de police. La raison pour laquelle nous le faisons est que nous devons nous assurer que le texte a la bonne taille à chaque largeur afin que nous puissions maintenir le même nombre de lignes. Il sera toujours réajusté à différentes largeurs, mais cela est nécessaire pour le prochain travail que nous devons faire.

Maintenant, nous devons obtenir de l'aide des unités de caractère CSS (CH), car avoir la bonne taille de police ne suffit pas. Une unité CH est équivalente à la largeur du glyphe "0" dans la police de l'élément. Nous voulons rendre le corps du texte aussi large que la fenêtre, non en réglant width: 100% , mais en utilisant width: Xch , où x est le nombre d'unités CH (ou 0) nécessaires pour remplir la fenêtre horizontalement.

Pour trouver X, nous devons diviser la largeur de la fenêtre minimale 320px par la taille CH de l'élément à la taille de la police lorsque la largeur de la fenêtre est de 320px. Dans ce cas, c'est 1 Rem.

Ne vous inquiétez pas, voici un extrait de code pour calculer la taille CH de l'élément:

 // Renvoie la largeur du glyphe "0" de l'élément (en pixels) à la taille de police souhaitée
fonction Calculatech (élément, fontsize) {
  const zero = document.CreateElement ("Span");
  zero.innertext = "0";
  zero.style.position = "absolu";
  zero.style.fontsize = FonTSize;

  element.ApendChild (zéro);
  const chpixels = zero.getBoundingClientRect (). largeur;
  element.removechild (zéro);

  return chpixels;
}
Copier après la connexion

Maintenant, nous pouvons continuer à définir la largeur du texte:

 fonction Calculatech (élément, FontSize) {...}

const text = document.QuerySelector ("p");
text.style.fontsize = ClampBuilder (320, 960, 1, 3);
text.style.width = `$ {320 / calculach (text," 1rem ")} ch`;
Copier après la connexion

Wow, attendez. Quelque chose de mal s'est produit. Il y a une barre de défilement horizontale qui gâche les choses!

Lorsque nous parlons de 320px, nous parlons de la largeur de la fenêtre, y compris la barre de défilement verticale. Par conséquent, la largeur du texte est définie sur la largeur de la zone visible plus la largeur de la barre de défilement, ce qui le fait déborder horizontalement.

Alors pourquoi ne pas utiliser une mesure qui ne contient pas la largeur de la barre de défilement verticale? Nous ne pouvons pas, c'est à cause de l'unité CSS VW. N'oubliez pas que nous utilisons VW dans clamp() pour contrôler la taille de la police. Vous verrez que VW comprend la largeur de la barre de défilement verticale, qui fait l'échelle de la police avec la largeur de la fenêtre, y compris la barre de défilement. Si nous voulons éviter tout réajustement, la largeur doit être proportionnelle à la largeur de la fenêtre, y compris la barre de défilement.

Alors que devons-nous faire? Quand nous le faisons:

 text.style.width = `$ {320 / calculach (text," 1rem ")} ch`;
Copier après la connexion

… Nous pouvons réduire le résultat en le multipliant par un nombre inférieur à 1. 0,9 peut résoudre le problème. Cela signifie que la largeur du texte sera de 90% de la largeur de la fenêtre, ce qui sera suffisant pour compenser le petit espace que la barre de défilement occupe. Nous pouvons le rendre plus étroit en utilisant des nombres plus petits (par exemple 0,6).

 fonction Calculatech (élément, FontSize) {...}

const text = document.QuerySelector ("p");
text.style.fontsize = ClampBuilder (20, 960, 1, 3);
text.style.width = `$ {320 / calculach (text," 1rem ") * 0,9} ch`;
Copier après la connexion

Vous pourriez avoir tendance à simplement soustraire quelques pixels de 320 pour ignorer la barre de défilement, comme ainsi:

 text.style.width = `$ {(320 - 30) / calculach (text," 1Rem ")} ch`;
Copier après la connexion

Le problème avec cela est qu'il restaurera le problème de rééducation! En effet, la soustraction de 320 détruira le rapport de la fenêtre / police.

La largeur du texte doit toujours être un pourcentage de la largeur de la fenêtre. Une autre chose à noter est que nous devons nous assurer que nous chargeons la même police sur chaque appareil qui utilise le site. Cela semble évident, n'est-ce pas? Eh bien, voici un petit détail qui pourrait dévier votre texte. Faire des choses comme font-family: sans-serif ne garantit pas que les mêmes polices sont utilisées dans chaque navigateur. sans-serif définira Arial sur Chrome pour Windows, mais Roboto sur Chrome pour Android. De plus, la géométrie de certaines polices peut provoquer un réajustement, même si vous faites tout correctement. Les polices de monowidth ont tendance à produire les meilleurs résultats. Par conséquent, assurez-vous de vous assurer que vos polices sont exactes.

Voir cet exemple non battant dans la démonstration suivante:

Texte de non-réalisation dans le conteneur

Ce que nous devons faire maintenant, c'est appliquer la taille et la largeur de la police au conteneur, pas directement à l'élément texte. Le texte en elle doit être défini sur width: 100% . Pour les paragraphes et les titres, ce n'est pas nécessaire car ce sont eux-mêmes des éléments au niveau du bloc et rempliront automatiquement la largeur du conteneur.

Un avantage de l'application de cette méthode dans un conteneur parent est que ses enfants répondront automatiquement et redimensionneront sans définir leur taille de police et leur largeur une par une. De plus, si nous devons modifier la taille de la police d'un seul élément sans affecter les autres, nous changeons simplement sa taille de police en n'importe quelle valeur EM et il sera naturellement relatif à la taille de la police du conteneur.

Le texte non raffinant est difficile, mais c'est un effet subtil qui peut apporter de bons résultats à la conception!

Résumer

Pour résumer, j'ai mis en place une petite démonstration de l'apparence de tout cela dans un scénario réel.

Dans cet dernier exemple, vous pouvez également modifier la taille de la police racine et clamp() recalcule automatiquement afin que le texte ait la bonne taille dans tous les cas.

Bien que l'objectif de cet article soit d'utiliser clamp() avec la taille de la police, cette même technique peut être utilisée pour recevoir tous les attributs CSS d'unités de longueur. Maintenant, je ne dis pas que vous devriez l'utiliser n'importe où. Plusieurs fois, une bonne font-size: 1rem suffit. Je veux juste vous montrer combien de contrôle vous pouvez avoir lorsque vous en avez besoin .

Personnellement, je crois que clamp() est l'une des meilleures choses de CSS et j'ai hâte de voir ce que les autres utilisent les gens qui trouveront car cela devient de plus en plus largement utilisé!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Travailler avec GraphQL Caching Travailler avec GraphQL Caching Mar 19, 2025 am 09:36 AM

Si vous avez récemment commencé à travailler avec GraphQL ou examiné ses avantages et ses inconvénients, vous avez sans aucun doute entendu des choses comme "GraphQL ne prend pas en charge la mise en cache" ou

Faire votre première transition Svelte personnalisée Faire votre première transition Svelte personnalisée Mar 15, 2025 am 11:08 AM

L'API de transition Svelte fournit un moyen d'animer les composants lorsqu'ils entrent ou quittent le document, y compris les transitions Svelte personnalisées.

Show, ne dit pas Show, ne dit pas Mar 16, 2025 am 11:49 AM

Combien de temps passez-vous à concevoir la présentation de contenu pour vos sites Web? Lorsque vous écrivez un nouveau blog ou créez une nouvelle page, pensez-vous à

Construire une application Ethereum à l'aide de Redwood.js et de la faune Construire une application Ethereum à l'aide de Redwood.js et de la faune Mar 28, 2025 am 09:18 AM

Avec la récente montée du prix du bitcoin sur 20k $ USD, et pour lui, récemment en train de briser 30k, je pensais que cela valait la peine de reprendre une profonde plongeon dans la création d'Ethereum

Comment utilisez-vous CSS pour créer des effets de texte, tels que des ombres de texte et des gradients? Comment utilisez-vous CSS pour créer des effets de texte, tels que des ombres de texte et des gradients? Mar 14, 2025 am 11:10 AM

L'article discute de l'utilisation de CSS pour les effets de texte comme les ombres et les gradients, les optimiser pour les performances et l'amélioration de l'expérience utilisateur. Il répertorie également les ressources pour les débutants (159 caractères)

Que diable sont les commandes NPM? Que diable sont les commandes NPM? Mar 15, 2025 am 11:36 AM

Les commandes NPM exécutent diverses tâches pour vous, soit en tant que processus unique ou en cours d'exécution pour des choses comme le démarrage d'un serveur ou la compilation de code.

Créer votre propre bragdoc avec Eleventy Créer votre propre bragdoc avec Eleventy Mar 18, 2025 am 11:23 AM

Quelle que soit le stade dans lequel vous vous trouvez en tant que développeur, les tâches que nous effectuons - qu'elles soient grandes ou petites - ont un impact énorme dans notre croissance personnelle et professionnelle.

Utilisons (x, x, x, x) pour parler de spécificité Utilisons (x, x, x, x) pour parler de spécificité Mar 24, 2025 am 10:37 AM

Je discutais avec Eric Meyer l'autre jour et je me suis souvenu d'une histoire d'Eric Meyer de mes années de formation. J'ai écrit un article de blog sur la spécificité CSS, et

See all articles