Retrait à partir de la deuxième ligne d'un paragraphe avec CSS

103

Comment mettre en retrait à partir de la deuxième ligne d'un paragraphe?

J'ai essayé

p {
    text-indent: 200px;
}
p:first-line {
    text-indent: 0;
}

et

p {
    margin-left: 200px;
}
p:first-line {
    margin-left: 0;
}

et

(with position:relative;)
p {
    left: 200px;
}
p:first-line {
    left: 0;
}
Ruben
la source
Pourquoi tous vos retraits de texte de première ligne sont-ils définis sur 0? De plus, je ne sais pas comment faire cela, mais celui qui manque dans cette liste est celui qui me semble le plus logique, le rembourrage.
Skarlinski

Réponses:

211

S'agit-il littéralement de la deuxième ligne que vous souhaitez indenter ou de la deuxième ligne (c'est-à-dire d'un retrait suspendu )?

Si c'est ce dernier, quelque chose du genre de ce JSFiddle serait approprié.

    div {
        padding-left: 1.5em;
        text-indent:-1.5em;
    }
    
    span {
        padding-left: 1.5em;
        text-indent:-1.5em;
    }
<div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</div>

<span>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</span>

Cet exemple montre comment l'utilisation de la même syntaxe CSS dans un DIV ou SPAN produit des effets différents.

rédacteur
la source
3
@Reuben Sur la base de votre commentaire qui a maintenant été supprimé, je suppose que vous avez fait en face de la deuxième ligne - et pour le bien des futurs visiteurs, peut-être que ce violon est meilleur, où la syntaxe est P pas div ou span. jsfiddle.net/gg9Hx
redditor
1
Pourquoi le padding-left puis le retrait de texte négatif? Pourquoi cela doit-il fonctionner comme ça? Cela semble étrange. Pourquoi pas juste un positif text-indent?
Don Cheadle
2
Le retrait de texte n'a aucun effet sur l'étendue. Il peut être retiré du style de la travée pour le même résultat.
Sam Hasler
25

Faire une marge gauche: environ 2em poussera tout le texte, y compris la première ligne, vers la droite 2em. Ensuite, ajoutez un retrait de texte (applicable à la première ligne) sous la forme -2em environ. Cela ramène la première ligne au début sans marge. Je l'ai essayé pour les balises de liste

<style>
    ul li{
      margin-left: 2em;
      text-indent: -2em;
    }
</style>
Vineetma
la source
24

Cela a fonctionné pour moi:

p { margin-left: -2em; 
 text-indent: 2em 
 }
Xoandre
la source
10
Cela semble faire le contraire de ce que le PO a demandé. La version de @ techillage est correcte. Vous devez échanger le moins autour
Alex Holsgrove
1
C'est presque exactement ce dont j'avais besoin. La réponse acceptée ne fonctionnera pas pour moi car je n'ai pas la liberté dans mon CMS d'ajouter des étendues de cette façon. Le seul problème que j'ai eu avec la solution ici, c'est que la marge de gauche tirera tout le paragraphe à l'extérieur d'un conteneur. J'ai donc ajouté 'position: relative' et 'left: 2em' et c'est parfait. Contrairement au commentaire de @AlexHolsgrove, la réponse de techillage n'a pas du tout fonctionné pour moi, mais peut-être parce que je ne fais pas cela sur un élément de liste.
Stu Furlong
2

J'avais besoin de mettre deux lignes en retrait pour permettre un premier mot plus grand dans un paragraphe. Une solution ponctuelle et fastidieuse consiste à placer du texte dans un élément SVG et à le positionner de la même manière qu'un <img>. L'utilisation de float et de la balise de hauteur du SVG définit combien de lignes seront indentées, par exemple

<p style="color: blue; font-size: large; padding-top: 4px;">
<svg height="44" width="260" style="float:left;margin-top:-8px;"><text x="0" y="36" fill="blue" font-family="Verdana" font-size="36">Lorum Ipsum</text></svg> 
dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
  • La hauteur et la largeur de SVG déterminent la zone bloquée.
  • Y = 36 est la profondeur de la ligne de base du texte SVG et identique à la taille de la police
  • margin-top permet un meilleur alignement du texte SVG et du texte para
  • Utilisé les deux premiers mots ici pour rappeler les soins nécessaires pour les descendeurs

Oui, c'est encombrant mais c'est aussi indépendant de la largeur du div contenant.

La réponse ci-dessus était à ma propre question pour permettre au premier mot (s) d'un para d'être plus grand et positionné sur deux lignes. Pour simplement indenter les deux premières lignes d'un para, vous pouvez remplacer toutes les balises SVG par le pixel unique img suivant:

<img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" style="float:left;width:260px;height:44px;" />
Tony
la source
1

Si vous coiffez comme liste

  • vous pouvez "text-align: initial" et les lignes suivantes seront toutes indentées. Je me rends compte que cela ne correspond peut-être pas à vos besoins, mais je vérifiais s'il y avait une autre solution avant de modifier mon balisage.

    Je suppose que mettre la deuxième ligne fonctionnerait également, mais nécessite une réflexion humaine pour que le contenu circule correctement, et, bien sûr, des sauts de ligne durs (ce qui ne me dérange pas en soi).

  • Morrie
    la source
    1
    Bienvenue dans Stackoverflow. Il semble que vous ayez une solution à ce problème d'indentation. Cependant, ce serait très utile pour tout le monde si vous fournissez des balises et expliquez la solution. Vous pouvez peut-être utiliser jsfiddle.net ou un autre service pour créer une démo fonctionnelle. Bonne chance.
    EGL 2-101