66 votes

Étirer le texte pour l'adapter à la largeur de la division

J'ai un div avec une largeur fixe, mais le texte à l'intérieur du div peut changer.

Existe-t-il un moyen de définir, à l'aide d'une css ou autre, l'espacement entre les éléments suivants lettres pour que le texte remplisse toujours parfaitement le div ?

0 votes

Voulez-vous changer le "spacing between the letters" (dans le mot anglais letter-spacing ) ou le font-size ? Edit : ou comme dans la réponse de @SmudgerDan, l'espacement entre les mots ?

0 votes

L'espacement et la taille de la police peuvent être ajustés pour garantir le format du bloc.

1 votes

Pourquoi pas text-align:justify ?

39voto

Aakil Fernandes Points 748

Cela peut être fait avec text-align:justify et un petit hack. Voir ici :

div{
  background-color:gold;
  text-align:justify;
}

span{
  background-color:red;
  width:100%;
  height:1em;
  display:inline-block;
}

<div>
  Lorem ipsum sit dolor
  <span> </span>
</div>

L'astuce consiste à ajouter un élément après le texte qui se fait passer pour un mot vraiment long. Le faux mot est en fait un span élément avec display:inline-block y width:100% .

Dans mon exemple, le faux mot est en rouge et a une hauteur de 1em, mais le hack fonctionnera même sans.

1 votes

Cela fonctionne très bien si l'on veut diviser les mots de manière égale, mais je souhaite séparer les lettres de manière égale. Y a-t-il un moyen d'ajuster ce script pour faire cela ?

0 votes

Je ne suis pas sûr de ce que vous voulez dire par "séparer les lettres de manière égale". Voulez-vous dire que chaque lettre doit être séparée uniformément, sans tenir compte des espaces ?

6 votes

+1 pour la magie, pourrait même être amélioré en utilisant un sélecteur :after au lieu de l'élément span.

38voto

web-tiki Points 14660

Comme l'a dit Mark, text-align:justify; est la solution la plus simple. Cependant, pour un texte court, elle n'aura aucun effet. Le code jQuery suivant étire le texte à la largeur du conteneur.

Il calcule l'espace pour chaque caractère et définit letter-spacing en conséquence, le texte s'étend à la largeur du conteneur .

Si le texte est trop long pour tenir dans le conteneur, il le laisse s'étendre jusqu'aux lignes suivantes et place la fonction text-align:justify; au texte.

Voici une démo :

$.fn.strech_text = function(){
    var elmt          = $(this),
        cont_width    = elmt.width(),
        txt           = elmt.html(),
        one_line      = $('<span class="stretch_it">' + txt + '</span>'),
        nb_char       = elmt.text().length,
        spacing       = cont_width/nb_char,
        txt_width;

    elmt.html(one_line);
    txt_width = one_line.width();

    if (txt_width < cont_width){
        var  char_width     = txt_width/nb_char,
             ltr_spacing    = spacing - char_width + (spacing - char_width)/nb_char ; 

        one_line.css({'letter-spacing': ltr_spacing});
    } else {
        one_line.contents().unwrap();
        elmt.addClass('justify');
    }
};

$(document).ready(function () {
    $('.stretch').each(function(){
        $(this).strech_text();
    });
});

p { width:300px; padding: 10px 0;background:gold;}
a{text-decoration:none;}

.stretch_it{ white-space: nowrap; }
.justify{ text-align:justify; }

.one{font-size:10px;}
.two{font-size:20px;}
.three{font-size:30px;}
.four{font-size:40px;}
.arial{font-family:arial;}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p class="stretch one">Stretch me</p>
<p class="stretch two">Stretch me</p>
<p class="stretch three">Stretch <a href="#">link</a></p>
<p class="stretch two">I am too slong, an I would look ugly if I was displayed on one line so let me expand to several lines and justify me.</p>
<p  class="stretch arial one">Stretch me</p>
<p class="stretch arial three">Stretch me</p>
<p class="stretch arial four">Stretch me</p>
<p class="arial two">Don't stretch me</p>

Démonstration de violon Js

0 votes

Bonjour, comment puis-je supprimer le padding en haut et en bas du texte ?

5 votes

Cela m'a été très utile, j'ai apporté quelques modifications pour que le système fonctionne également en mode réactif : jsfiddle.net/DPRr9/347

0 votes

@zeleniy joli !

10voto

nathan Points 123

Une méthode HTML/CSS encore plus simple serait d'utiliser la méthode flexbox. Elle est aussi immédiatement réactive. Mais il convient de noter que les moteurs de recherche ne le prendront pas en compte si vous l'utilisez comme un h1 ou autre.

HTML :

<div class="wrapper">
<div>H</div>
<div>e</div>
<div>l</div>
<div>l</div>
<div>o</div>
<div>&nbsp</div>
<div>W</div>
<div>o</div>
<div>r</div>
<div>l</div>
<div>d</div>

CSS :

.wrapper{
  width: 100%;
  text-align: center;
  display: flex;
  flex-flow: row nowrap;
  justify-content: space-between;
  border: 1px solid black;
}

jsfiddle ici

3 votes

La meilleure solution 2016 selon moi

2 votes

Un peu plus facile avec la mise en page flex utiliser sur la div wrapper fxLayout="row" fxLayoutAlign="space-evenly center"

0 votes

Très bonne idée pour savoir en texte avancé et avec peu de javascript il peut également fonctionner avec du texte dynamique.

7voto

Mark Points 3280

Peut-être que ceci pourrait aider :

text-align:justify;

1 votes

Voici un exemple de texte que vous pouvez essayer : <div style="font:normal 12px Arial ; width:200px ;">Février</div>

6voto

wener Points 497

J'ai trouvé une meilleure solution pour les textes plus courts qu'une ligne, sans aucun js ou tag supplémentaire, seulement une classe.

.stretch{ 
  /* We got 2rem to stretch */
  width: 5rem;
  /* We know we only got one line */
  height: 1rem;

  text-align: justify; 
}
.stretch:after{
    /* used to stretch word */
    content: '';
    width: 100%;
    display: inline-block; 
}

<div class="stretch"></div>
<div class="stretch"></div>

1 votes

@Shammoo J'ai exécuté le code snippet, il fonctionne comme prévu, avez-vous testé le snippet.

0 votes

Où avez-vous eu 5rem ? Et pourquoi choisir une police de caractères verticale ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X