273 votes

Ajouter du texte centré au milieu d'une règle horizontale

Je me demande quelles sont les options dont on dispose dans le format xhtml 1.0 strict pour créer une ligne de part et d'autre d'un texte comme ceci :

Section one
----------------------- Next section -----------------------
Section two

J'ai pensé à faire des choses fantaisistes comme ça :

<div style="float:left; width: 44%;"><hr/></div>
<div style="float:right; width: 44%;"><hr/></div>
Next section

Ou encore, parce que les éléments ci-dessus présentent des problèmes d'alignement (vertical et horizontal) :

<table><tr>
<td style="width:47%"><hr/></td>
<td style="vertical-align:middle; text-align: center">Next section</td>
<td style="width:47%"><hr/></td>
</tr></table>

Cela pose également des problèmes d'alignement, que je résous avec ce désordre :

<table><tr>
<td style="border-bottom: 1px solid gray; width: 47%">&nbsp;</td>
<td style="vertical-align:middle;text-align:center" rowspan="2">Next section</td>
<td style="border-bottom: 1px solid gray; width: 47%">&nbsp;</td>
</tr><tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr></table>

En plus des problèmes d'alignement, les deux options donnent l'impression d'être "fudgy", et je vous serais très reconnaissant si vous aviez déjà vu ce problème et si vous connaissiez une solution élégante.

3 votes

Voici un autre fil de discussion avec un défi sans balises supplémentaires - et une solution ! stackoverflow.com/questions/12648513/

1 votes

stackoverflow.com/questions/5214127/ est toujours la meilleure solution.

0 votes

Une réponse utile ici serait d'utiliser la grille CSS.

231voto

Fletcher Moore Points 3650

Pourquoi pas :

<div style="width: 100%; height: 20px; border-bottom: 1px solid black; text-align: center">
  <span style="font-size: 40px; background-color: #F3F5F6; padding: 0 10px;">
    Section Title <!--Padding is optional-->
  </span>
</div>

Regarde ça JSFiddle .

Vous pouvez utiliser vw o % pour le rendre réactif .

2 votes

Il est un peu difficile d'obtenir la valeur maximale exacte. Ce n'est pas exactement -0.5em ;

0 votes

Parfait. "Responsive" aussi

4 votes

Voir ma réponse pour une solution qui ne vous oblige pas à spécifier la couleur de fond ou la largeur.

202voto

MartinF Points 1525

Le moyen de résoudre ce problème sans connaître la largeur et la couleur de fond est le suivant :

Structure

<div class="strike">
   <span>Kringle</span>
</div>

CSS

.strike {
    display: block;
    text-align: center;
    overflow: hidden;
    white-space: nowrap; 
}

.strike > span {
    position: relative;
    display: inline-block;
}

.strike > span:before,
.strike > span:after {
    content: "";
    position: absolute;
    top: 50%;
    width: 9999px;
    height: 1px;
    background: red;
}

.strike > span:before {
    right: 100%;
    margin-right: 15px;
}

.strike > span:after {
    left: 100%;
    margin-left: 15px;
}

Ejemplo: http://jsfiddle.net/z8Hnz/

Double ligne

Pour créer une double ligne, utilisez l'une des options suivantes :

1) Espace fixe entre les lignes

.strike > span:before,
.strike > span:after {
    content: "";
    position: absolute;
    top: 50%;
    width: 9999px;
    border-top: 4px double red;

Ejemplo: http://jsfiddle.net/z8Hnz/103/

2) Espace personnalisé entre les lignes

.strike > span:before,
.strike > span:after {
    content: "";
    position: absolute;
    top: 50%;
    width: 9999px;
    height: 5px; /* space between lines */
    margin-top: -2px; /* adjust vertical align */
    border-top: 1px solid red;
    border-bottom: 1px solid red;
}

Ejemplo: http://jsfiddle.net/z8Hnz/105/


Version de SASS (SCSS)

Sur la base de cette solution, j'ai ajouté le SCSS "avec propriété de couleur" si cela peut aider quelqu'un...

//mixins.scss
@mixin bg-strike($color) {

    display: block;
    text-align: center;
    overflow: hidden;
    white-space: nowrap; 

    > span {

        position: relative;
        display: inline-block;

        &:before,
        &:after {
            content: "";
            position: absolute;
            top: 50%;
            width: 9999px;
            height: 1px;
            background: $color;
        }

        &:before {
            right: 100%;
            margin-right: 15px;
        }

        &:after {
            left: 100%;
            margin-left: 15px;
        }
    }
}

exemple d'utilisation :

//content.scss
h2 {
    @include bg-strike($col1);
    color: $col1;
}

0 votes

Cette version fonctionne mieux si vous utilisez une image pour la ligne - ou du moins, elle est plus facile à modifier et reste réactive.

0 votes

Très beau travail ! Pouvez-vous utiliser votre magie pour créer une double ligne ? (Sinon, je me contenterai d'utiliser une petite image de fond répétitive).

3 votes

Superbe extrait ! Merci :)

53voto

Diodeus Points 67946

Essayez ça :

.divider {
    width:500px;
    text-align:center;
}

.divider hr {
    margin-left:auto;
    margin-right:auto;
    width:40%;

}

.left {
    float:left;
}

.right {
    float:right;
}

<div class="divider">
    <hr class="left"/>TEXT<hr class="right" />
</div>

Aperçu en direct sur jsFiddle .

4 votes

Il fonctionne parfaitement et utilise <hr /> donc qu'est-ce qui peut bien clocher dans cette réponse ? Je ne dis rien.

4 votes

+1 Pas besoin de jouer avec la couleur de l'arrière-plan ou d'utiliser les balises de manière inattendue. L'inconvénient est que .divider hr La largeur dépend de la longueur du texte. Suggestion : .divider y .divider hr Les largeurs doivent être spécifiées en em unités. Pour obtenir hr largeur, utilisez ( .divider largeur moins le nombre de caractères) / 2 .

1 votes

40% n'est pas correct ici. Si le texte est plus long, il sera mal aligné.

24voto

Robert Kajic Points 2416

Je viens de rencontrer le même problème, voici une façon de le résoudre :

<table width="100%">
  <tr>
    <td><hr /></td>
    <td style="width:1px; padding: 0 10px; white-space: nowrap;">Some text</td>
    <td><hr /></td>
  </tr>
</table>​

Il fonctionne sans définir d'arrière-plan sur l'élément de texte, c'est-à-dire qu'il sera beau quel que soit l'arrière-plan derrière lui.

Vous pouvez l'essayer ici : http://jsfiddle.net/88vgS/

0 votes

Ça ne résout pas le problème de l'OP. Cela crée deux lignes avec du texte entre elles. Il veut une ligne qui soit interrompue à mi-chemin, avec du texte à la section interrompue, puis la ligne continue.

2 votes

Il fait effectivement ce que l'OP demande. Vous pouvez le voir à jsfiddle.net/88vgS

0 votes

De même, qu'est-ce qu'une ligne interrompue en partie, avec du texte à la section interrompue, si ce n'est deux lignes avec du texte entre elles ?

9voto

willoller Points 3404

UPDATE : Cela ne fonctionnera pas avec HTML5

Consultez plutôt cette question pour plus de techniques : Défi CSS, puis-je le faire sans introduire plus de HTML ?


Utilicé line-height:0 pour créer l'effet dans l'en-tête de mon site guérilla-alumnus.com

<div class="description">
   <span>Text</span>
</div>

.description {
   border-top:1px dotted #AAAAAA;
}

.description span {
   background:white none repeat scroll 0 0;
   line-height:0;
   padding:0.1em 1.5em;
   position:relative;
}

Une autre bonne méthode est sur http://robots.thoughtbot.com/

Il utilise une image de fond et des flotteurs pour obtenir un effet sympa.

1 votes

J'aime bien, ça a l'air super sur ton site, mais je n'ai pas réussi à le faire fonctionner (je soupçonne une interférence de jQuery css) :( Mais c'est vraiment cool.

0 votes

Je pense que votre h1 pousse la portée vers le bas.

1 votes

Il s'agit d'un "hack" qui utilise le comportement de rendu différent pour DOCTYPE XTHML 1.0 Transitional. Si vous utilisez DOCTYPE html (pour HTML5), cela ne fonctionnera PAS.

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