473 votes

Technique CSS pour une ligne horizontale avec des mots au milieu

J'essaie de créer une règle horizontale avec du texte au milieu. Par exemple :

----------------------------------- mon titre ici -----------------------------

Existe-t-il un moyen de faire cela en CSS ? Sans tous les tirets "-", évidemment.

0 votes

Est-ce pour l'intérieur d'un form tag ?

0 votes

Dans ce cas, comme l'a fait remarquer thirtydot en réponse à ma réponse, vous pouvez vous renseigner sur l'initiative de l'Union européenne en faveur de l'environnement. fieldset y legend éléments

0 votes

623voto

Darko Z Points 16570

Voici en gros comment je procéderais : la ligne est créée en définissant un paramètre border-bottom sur le contenant h2 puis en donnant le h2 un plus petit line-height . Le texte est ensuite placé dans un span avec un arrière-plan non-transparent.

h2 {
   width: 100%; 
   text-align: center; 
   border-bottom: 1px solid #000; 
   line-height: 0.1em;
   margin: 10px 0 20px; 
} 

h2 span { 
    background:#fff; 
    padding:0 10px; 
}

<h2><span>THIS IS A TEST</span></h2>
<p>this is some content other</p>

J'ai testé dans Chrome uniquement, mais il n'y a aucune raison pour que cela ne fonctionne pas dans d'autres navigateurs.

JSFiddle : http://jsfiddle.net/7jGHS/

3 votes

C'est ma solution préférée. Elle fonctionne également sous OSX, alors que certaines autres solutions ne fonctionnent pas. Si vous utilisez cette solution, n'oubliez pas de définir l'arrière-plan du span à la même couleur que l'arrière-plan de votre page, ce que je veux dire sera particulièrement évident si votre arrière-plan n'est pas blanc. ;)

1 votes

Y a-t-il un moyen de faire en sorte que ce soit un quart de la largeur ?

0 votes

@TroyCosentino oui, il suffit d'envelopper le h2/content dans un div qui fait un quart de la largeur.

400voto

Puigcerber Points 2245

Après avoir essayé différentes solutions, j'en ai trouvé une valable pour différentes largeurs de texte, n'importe quel arrière-plan possible et sans ajouter de balises supplémentaires.

h1 {
  overflow: hidden;
  text-align: center;
}

h1:before,
h1:after {
  background-color: #000;
  content: "";
  display: inline-block;
  height: 1px;
  position: relative;
  vertical-align: middle;
  width: 50%;
}

h1:before {
  right: 0.5em;
  margin-left: -50%;
}

h1:after {
  left: 0.5em;
  margin-right: -50%;
}

<h1>Heading</h1>
<h1>This is a longer heading</h1>

Je l'ai testé dans IE8, IE9, Firefox et Chrome. Vous pouvez le vérifier ici http://jsfiddle.net/Puigcerber/vLwDf/1/

2 votes

J'aime bien celui-là aussi. Pour obtenir un style où le texte est indenté de la gauche au lieu d'être centré, utilisez ce changement : h1 { overflow : hidden ; ` text-align : left ; ` text-indent : 40px ; `}

17 votes

C'est vraiment une bonne solution, d'autant plus qu'elle fonctionne avec n'importe quel arrière-plan et qu'elle ne nécessite pas une largeur définie pour l'élément d'en-tête.

2 votes

C'est génial. J'ai adapté un peu votre code pour aligner le texte à gauche et faire en sorte que l'élément :after élément la largeur du bloc. Je suis curieux : quel est le rôle exact de l'élément margin-right: -50% ? Lorsque je tâtonnais avec le code, l'absence de cette propriété entraînait la rupture de la décoration sur une autre ligne. Et même lorsque :after est affecté d'une largeur de 100 %, j'ai encore besoin de la marge droite négative de 50 % pour qu'il s'adapte. Pourquoi ?

60voto

Rafael Points 446

La méthode la plus courte et la meilleure :

span:after,
span:before{
    content:"\00a0\00a0\00a0\00a0\00a0";
    text-decoration:line-through;
}

<span> your text </span>

0 votes

Dans mon cas, la ligne semblait un peu trop épaisse, j'ai donc modifié la police en lui attribuant une autre famille de caractères : font-family: monospace; a bien fonctionné.

0 votes

C'est la meilleure réponse. Cela a fonctionné sans modifier ma mise en page.

0 votes

Naïf mais efficace !

54voto

Stephan Muller Points 8432

Ok, celui-ci est plus compliqué mais il fonctionne dans tout sauf IE<8

<div><span>text TEXT</span></div>

div {
    text-align: center;
    position: relative;
}
span {
    display: inline-block;    
}
span:before,
span:after {
    border-top: 1px solid black;
    display: block;
    height: 1px;
    content: " ";
    width: 40%;
    position: absolute;
    left: 0;
    top: 1.2em;
}
span:after {
   right: 0;  
   left: auto; 
}

Les éléments :before et :after sont positionnés de manière absolue, de sorte que nous pouvons en tirer un vers la gauche et un vers la droite. De plus, la largeur (40% dans ce cas) dépend beaucoup de la largeur du texte à l'intérieur je dois réfléchir à une solution pour cela. En tout cas, la top: 1.2em fait en sorte que les lignes restent plus ou moins au centre du texte, même si la taille de la police est différente.

Mais il semble bien fonctionner : http://jsfiddle.net/tUGrf/3/

3 votes

C'est intelligent, mais j'espère que l'OP ne veut pas de ça pour l'intérieur d'une maison. form étiquette. S'il le fait, comme vous le savez sûrement, il pourrait simplement utiliser fieldset y legend .

1 votes

Heh, tu as raison sur ce point. Ce n'est pas sémantiquement correct, mais c'est mieux que d'avoir recours à javascript pour quelque chose comme ça, je pense.

9 votes

La meilleure solution que j'ai trouvée et qui fonctionne bien lorsque l'écran est fermé et sans définir la couleur de fond du texte est la suivante jsfiddle.net/vLwDf/268

12voto

Stephan Muller Points 8432
<div><span>text TEXT</span></div>

div { 
  height: 1px; 
  border-top: 1px solid black; 
  text-align: center; 
  position: relative; 
}
span { 
  position: relative; 
  top: -.7em; 
  background: white; 
  display: inline-block; 
}

Donnez un padding à l'espacement pour créer plus d'espace entre le texte et la ligne.

Exemple : http://jsfiddle.net/tUGrf/

1 votes

Joli, le seul problème est que vous devez définir le fond en blanc et ne pouvez pas le définir en transparent.

0 votes

Dans ce cas, vous devrez travailler avec deux lignes, une de chaque côté. Cela va être difficile à réaliser de manière propre

0 votes

Mon approche préférée jusqu'à présent, mais malheureusement, elle ne fonctionne pas dans les clients de messagerie pour une raison quelconque (Gmail mobile et web).

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