Comment insérer un saut de ligne avant un élément en utilisant CSS


170

J'ai l'impression d'avoir vu un moyen, en utilisant la propriété CSS content, d'insérer une balise de saut de ligne avant un élément. Évidemment, cela ne fonctionne pas:

#restart:before { content: '<br/>'; }

Mais comment faites-vous cela?


2
CSS ne sert pas à ajouter ou modifier du contenu, il sert à contrôler l'affichage du contenu.
Todd Moses

40
Il me semble que la mise en page et le flux (les sauts de ligne pourraient être envisagés non plus) sont définitivement du domaine du CSS.
Trevor

12
CSS sert absolument à ajouter ou modifier du contenu lorsqu'il s'agit d'un élément de style cohérent qui fait partie de votre thème. Surtout avec les systèmes de gestion de contenu comme Wordpress qui ne vous permettent pas de modifier votre contenu, c'est très utile. C'est pourquoi la propriété "content" existe. Pour ajouter et / ou modifier du contenu.
Fei Lauren

Réponses:


266

Il est possible d'utiliser la \A séquence d'échappement dans le contenu généré par l'élément psuedo. En savoir plus dans la spécification CSS2.

#restart:before { content: '\A'; }

Vous devrez peut-être également ajouter white-space:pre;à #restart.

Remarque: \Aindique la fin d'une ligne.

ps Un autre traitement à être

:before { content: ' '; display: block; }

11
Essayez également les espaces blancs: pré-emballage; si vous voulez que votre texte soit enveloppé.
Jazzy

6
Brillant. Il convient de noter, cependant, que pour que cela fonctionne - #restartdoit aussi êtredisplay: inline;
Troy Alford

23
Cela n'a pas fonctionné pour moi, j'ai utilisé à la :before { content: ' '; display: block; }place.
Bogdanio

1
Pour une raison quelconque, aucune des solutions ne fonctionne avec des inline-blockéléments. Ils n'iront tout simplement pas sur la ligne suivante. La seule solution était d'ajouter un vide <div></div>dans le HTML.
Adam Reis

2
Si la ligne n'a pas cassé, vous pouvez utiliser la propriété 'white-space': before {content: '\ A'; espace blanc: pré; }
Amr

35

S'il #restarts'agit d'un élément en ligne (par exemple <span>, <em>etc.), vous pouvez le transformer en élément de bloc en utilisant:

#restart { display: block; }

Cela aura pour effet d'assurer un saut de ligne avant et après l'élément.

Il n'y a pas de moyen pour CSS d'insérer quelque chose qui agit comme un saut de ligne uniquement avant un élément et non après. Vous pourriez peut-être provoquer un saut de ligne avant comme effet secondaire d'autres changements, par exemple float: left, ou clear: leftaprès un élément flottant, ou même quelque chose de fou comme #restart:before { content: 'a load of non-breaking spaces'; }mais ce n'est probablement pas une bonne idée dans le cas général.


1
Il ne peut pas être display: block - parce que j'aurais alors besoin d'afficher une largeur pour que l'élément empêche son arrière-plan de s'exécuter sur toute la page. Il doit pouvoir définir automatiquement la largeur de l'élément.
mheavers le

3
Un float: leftélément peut être d'une certaine utilité, car ils se rétrécissent pour s'adapter et commencent sur une nouvelle ligne. Sinon, ce que vous voulez peut ne pas être possible.
bobince le

contre-voté parce que parfois les développeurs travaillent dans un grand projet où ils n'ont pas le contrôle ou ne peuvent pas prendre la décision d'appliquer une autre solution.
eyurdakul

19

Cela fonctionne pour moi:

#restart:before {
    content: ' ';
    clear: right;
    display: block;
}

Pour une raison quelconque, les différents caractères Unicode pour la nouvelle ligne ne fonctionnaient pas pour moi ..? Cette solution a fait l'affaire - merci!
Gene Bo

1
Oui, mais que se passe-t-il lorsque vous devez également mettre du texte dans le contenu !? réponse
Sándor Zuboly

12

Mettez simplement un caractère de nouvelle ligne Unicode dans le pseudo élément avant:

#restart:before { content: '\00000A'; }

11

Suivre CSS a fonctionné pour moi:

/* newline before element */
#myelementId:before{
    content:"\a";
    white-space: pre;
}

Excellente idée avec css simple
NaveenDA

Cela a fonctionné comme un charme pour moi. J'utilise ceci:content: 'bar: \a' attr(data-description);
Jimmy Adaro

C'est la bonne réponse 👍
cronoklee

10

Il y a deux raisons pour lesquelles vous ne pouvez pas ajouter de contenu généré via CSS comme vous le souhaitez:

  1. le contenu généré accepte le contenu et non le balisage. Le balisage ne sera pas évalué mais affiché uniquement.

  2. :beforeet le :aftercontenu généré est ajouté dans l'élément, donc même ajouter un espace ou une lettre et le définir comme blockne fonctionnera pas.

Il existe un ::outsidepseudo élément qui pourrait faire ce que vous voulez. Cependant, il ne semble y avoir aucune prise en charge du navigateur. (En savoir plus ici: http://www.w3.org/TR/css3-content/#wrapping )

Le mieux est d'utiliser un peu de jQuery ici:

$('<br />').insertBefore('#restart');

Exemple: http://jsfiddle.net/jasongennaro/sJGH9/1/


"Utilisation de CSS". J'ai trouvé une réponse similaire à celle de Jesse Kinsman.
RonnyKnoxville

4

Oui, tout à fait faisable, mais c'est définitivement un hack total (les gens peuvent vous donner des regards sales pour écrire un tel code).

Voici le HTML:

<div>lorem ipdum dolor sit <span id="restart">amit e pluribus unum</span></div>

Voici le CSS:

#restart:before { content: 'hiddentext'; font-size:0; display:block; line-height:0; }

Voici le violon: http://jsfiddle.net/AprNY/


+1 Pour la créativité. J'ai quelque chose que j'inclus d'une source externe et je ne peux pas modifier le HTML réel ... cela semble fonctionner très bien :) Merci!
contre-être

3

Essayez ce qui suit:

#restart::before {
  content: '';
  display: block;
}

Un conseil: ajoutez au moins un commentaire sur une seule ligne pour que vos messages ne finissent pas dans le VLQQ par défaut.
Deduplicator

1

en supposant que vous vouliez que la hauteur de la ligne soit de 20 px

  .restart:before { 
     content: 'First Line';
     padding-bottom:20px;
  }
  .restart:after { 
    content: 'Second-line';
    position:absolute;
    top:40px;
  }

1

Je n'ai eu aucune chance d'insérer une pause avec: avant. Ma solution était d'ajouter un span avec une classe et de mettre le break à l'intérieur du span. Puis changez la classe pour afficher: aucun; ou afficher: bloquer au besoin.

HTML

    <div>
         <span class="ItmQty"><br /></span>
         <span class="otherclass">
              <asp:Label ID="QuantityLabel" runat="server" Text="Qty: ">      
              </asp:Label>
         </span>
         <div class="cartqty">
              <asp:TextBox ID="QuantityTextBox" runat="server" Text='<%# Bind("Quantity","{0:#}") %>' Width="50"></asp:TextBox>

         </div>
    </div>

CSS

@media only screen and (min-width: 854px)
{
    .ProjItmQty
    {
        display: block;
        clear: both;
    }
}
@media only screen and (min-width: 1003px)
{
    .ProjItmQty
    {
        display: none;
    }
}

J'espère que cela t'aides.


1

Vous pouvez remplir votre document avec des <br>balises et les activer / désactiver avec css comme tous les autres:

<style>
.hideBreaks {
 display:none;
}
</style>
<html>
just a text line<br class='hideBreaks'> for demonstration
</html>

0

Vous pouvez également utiliser l'entité HTML pré-encodée pour un saut de ligne &#10;dans votre contenu et cela aura le même effet.


0
body * { line-height: 127%; }
p:after { content: "\A "; display: block; white-space: pre; }

https://www.w3.org/TR/CSS2/generate.html#x18 The Content Proerty, "newlines" ... p n'ajoutera pas de marge ni de remplissage à la fin de p à l'intérieur du bloc parent (par exemple, corps ›section› p). Le saut de ligne "\ A" force l'espace de ligne, hauteur de ligne stylisée équivalente.


-1

Ajouter un margin-top:20px;à #restart. Ou quel que soit l'écart de taille que vous jugez approprié. Si c'est un élément en ligne, vous devrez ajouter display:blockou display:inline-blockbien que je ne pense pas qu'il inline-blockfonctionne sur les anciennes versions d'IE.


Non, le problème est que le type d'affichage de l'élément est un bloc en ligne, je dois donc faire une pause avant l'élément.
mheavers le

le type d'affichage est déjà inline-block. J'essaie de faire ce que j'ai demandé ci-dessus, en utilisant la propriété content.
mheavers le

Vous ne pouvez pas ajouter d'éléments html à l'aide de la propriété content, ce n'est pas possible.
punkrockbuddyholly

parce que votre réponse n'aurait pas résolu son problème. Regardez la réponse gagnante qui détaille un moyen de fournir un saut de ligne à l'aide de la propriété content (qui n'acceptera pas les éléments html). C'était peut-être une mauvaise compréhension de la question initiale.
pdwalker du

-1

Au lieu d'ajouter manuellement un saut de ligne d'une manière ou d'une autre, vous pouvez faire une implémentation border-bottom: 1px solid #ff0000qui prendra la bordure de l'élément et ne restituera border-<side>que le côté que vous spécifiez.


2
OP a demandé l'équivalent de <br>, non <hr>.
Beni Cherniavsky-Paskin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.