CSS zum Auswählen / Stylen des ersten Wortes

76

Dieser hat mich irgendwie verblüfft. Ich möchte das erste Wort aller Absätze in meinem #content div bei 14pt anstelle des Standardwerts für die Absätze (12pt) setzen. Gibt es eine Möglichkeit, dies in direktem CSS zu tun, oder muss ich das erste Wort in einer Zeitspanne umbrechen, um dies zu erreichen?

Drachenmantel
quelle

Antworten:

83

Was Sie suchen, ist ein Pseudoelement, das es nicht gibt. Es gibt: ersten Buchstaben und: erste Zeile, aber nein: erstes Wort.

Sie können dies natürlich mit JavaScript tun. Hier ist ein Code, den ich gefunden habe: http://www.dynamicsitesolutions.com/javascript/first-word-selector/

Robby Slaughter
quelle
72
Wahrscheinlich, weil ein "Wort" in einer Layoutsprache kein genau definiertes Konzept ist. Ist "halbgebacken" ein oder zwei Wörter? Was ist mit "McDonald" und "O'Shea"? Was ist das erste Wort in "5 + 3 = 8" oder "5 + 3 = 8"?
Robby Slaughter
52
Für Layoutzwecke ist die Definition eines Wortes als "eine Gruppe von Nicht-Leerzeichen nach und vor Leerzeichen" gut und sehr nützlich. Für die Verarbeitung müssen Sie möglicherweise "nachdenklich" sein, aber für das Layout ist es eine perfekte Lösung.
Henrik Erlandsson
13
Es gibt keine Leerzeichen zwischen Wörtern chinesischer Schriftzeichen. 實際上, 漢字 沒有 單詞 和 字母 字母 的.
Deerchao
56
@RobbySlaughter CSS definiert das Konzept eines "Wortes" (zumindest für lateinische Alpha-Zeichen) bereits text-transform: capitalizeseit langem: jsfiddle.net/mlms13/DRJ76
Michael Martin-Smucker
16
Ein "Wort" ist in Browsern sehr gut definiert. Eine Implementierung von: first-word würde einfach dieselbe Logik verwenden, die in Zeilenumbrüchen verwendet wird.
Lachlan Arthur
33

Ich muss Dale nicht zustimmen ... Das starke Element ist eigentlich das falsche Element, was etwas über die Bedeutung, Verwendung oder Betonung des Inhalts impliziert, während Sie einfach beabsichtigen, dem Element Stil zu verleihen.

Idealerweise können Sie dies mit einer Pseudoklasse und Ihrem Stylesheet erreichen. Da dies jedoch nicht möglich ist, sollten Sie Ihr Markup semantisch korrekt machen und verwenden <span class="first-word">.

Prestaul
quelle
4
Die als richtig akzeptierte Javascript-Antwort ist möglicherweise nützlicher, aber ich glaube, dass diese die semantisch korrekteste ist.
Reynolds
12
FWIW kann das <b>Element geeignet sein. In der HTML5-Spezifikation heißt es: Das b-Element stellt eine Textspanne dar, auf die zu nützlichen Zwecken hingewiesen wird, ohne dass eine zusätzliche Bedeutung vermittelt wird und ohne dass eine alternative Stimme oder Stimmung impliziert wird, z. B. Schlüsselwörter in einer Dokumentzusammenfassung, Produktnamen in eine Überprüfung, umsetzbare Wörter in interaktiver textgesteuerter Software oder ein Artikel lede . (Hervorhebung von mir) Das erste Wort ist nicht ganz ein Artikel, aber seine Funktion ist dieselbe.
Mattsoave
Sehr schön, @mattsoave. Ich hatte die Neudefinition von <b>in HTML5 noch nicht gesehen , das ist also sehr interessant. Ich werde das in meiner Trickkiste behalten, wenn ich das nächste Mal ein gestyltes Element ohne wirkliche semantische Bedeutung brauche.
Prestaul
1
@mattsoave - Ich weiß, es ist mehr als 5 Jahre später, aber ich habe bemerkt, wie Stackoverflow ab Element für Ihre Betonung verwendet :-)
Herbert Van-Vliet
23

Gleiches gilt für jQuery:

$('#links a').each(function(){
    var me = $(this);
    me.html( me.text().replace(/(^\w+)/,'<strong>$1</strong>') );
  });

oder

$('#links a').each(function(){
    var me = $(this)
       , t = me.text().split(' ');
    me.html( '<strong>'+t.shift()+'</strong> '+t.join(' ') );
  });

(Über 'Wizzud' auf der jQuery Mailing List )

Jon Hadley
quelle
1
Scheint die beste Lösung für mich zu sein. Übrigens: Dies wird nicht funktionieren, dh. slowakische Charaktere wie "Zimná záhrada". Also habe ich stattdessen diesen
regulären Ausdruck
9

Leider haben wir selbst mit CSS 3 noch keine ähnlichen Funktionen wie :first-word :last-wordreines CSS. Zum Glück gibt es heutzutage fast ein JavaScript für alles, was mich zu meiner Empfehlung bringt. Mit nthEverything und jQuery können Sie die traditionellen Pseudo-Elemente erweitern.

Derzeit sind die gültigen Pseudos:

  • :first-child
  • :first-of-type
  • :only-child
  • :last-child
  • :last-of-type
  • :only-of-type
  • :nth-child
  • :nth-of-type
  • :nth-last-child
  • :nth-last-of-type

Und mit nth Everything können wir dies erweitern auf:

  • ::first-letter
  • ::first-line
  • ::first-word
  • ::last-letter
  • ::last-line
  • ::last-word
  • ::nth-letter
  • ::nth-line
  • ::nth-word
  • ::nth-last-letter
  • ::nth-last-line
  • ::nth-last-word
Simon Hayter
quelle
8

Reine CSS-Lösung:

Verwenden Sie die: First-Line-Pseudoklasse.

display:block;
Width:40-100px; /* just enough for one word, depends on font size */
Overflow:visible; /* so longer words don't get clipped.*/
float:left; /* so it will flow with the paragraph. */
position:relative; /* for typeset adjustments. */

Hab das nicht getestet. Ich bin mir ziemlich sicher, dass es für dich gut funktionieren wird. Ich habe zuvor Blockregeln auf Pseudoklassen angewendet. Möglicherweise haben Sie für jedes erste Wort eine feste Breite, also richten Sie den Text aus: Mitte; und gib ihm einen schönen Hintergrund oder etwas, um mit dem negativen Raum umzugehen.

Hoffe das funktioniert bei dir. :) :)

-Motekye

Motekye Guakein
quelle
1
1) Das ist ein Pseudoelement 2) Das ist für die erste Zeile .
BoltClock
14
Die Idee ist, die erste Zeile breit genug für nur ein Wort zu machen, sie so zu schweben, dass sie mit dem Rest des Textes ausgeführt wird, und dann Stile anzuwenden. Herrgott.
Motekye Guakein
2
Eine sehr kreative Idee, die Sie jedoch vor dem Posten testen sollten. Es funktioniert nicht - und es kann nicht funktionieren, weil displayes in ::first-line( developer.mozilla.org/de/docs/Web/CSS/::first-line ) ignoriert wird .
Wortwart
4
Weit genug "nur für ein Wort"? Das ist lächerlich, da ein Wort aus 1 Buchstaben oder 15 Buchstaben bestehen kann.
23.
6

Sie müssen das Wort in eine Spanne einschließen, um dies zu erreichen.

Hazzen
quelle
2

Verwenden Sie das starke Element, das ist sein Zweck:

<div id="content">
    <p><strong>First Word</strong> rest of paragraph.</p>
</div>

Erstellen Sie dann einen Stil dafür in Ihrem Stylesheet.

#content p strong
{
    font-size: 14pt;
}
Dale Ragan
quelle
26
Es ist ironisch, dass Ihr "erstes Wort" tatsächlich 2 Wörter ist! ;)
Bobby Jack
2
Ja, ich dachte das Gleiche, als ich die Antwort schrieb.
Dale Ragan
19
Außer stark ist in diesem Fall semantisch falsch. Es scheint, dass die Größe nur ein Styling-Problem ist, und stark zeigt an, dass der betroffene Abschnitt betont werden muss.
Akoi Meexx
4
Pluz, wenn Sie irgendwo anders im Inhalt stark verwenden möchten, wird es größer. Am besten klassifiziere ich diesen bösen Jungen und ziele direkter.
Adrian Lynch
4
Aufgrund der Spezifikation halte ich <b>es für angemessener.
Mattsoave
2

Hier ist ein bisschen JavaScript und jQuery, die ich zusammengeschmissen habe, um das erste Wort jedes Absatzes mit einem <span>Tag zu versehen.

$(function() {
    $('#content p').each(function() {
        var text = this.innerHTML;
        var firstSpaceIndex = text.indexOf(" ");
        if (firstSpaceIndex > 0) {
            var substrBefore = text.substring(0,firstSpaceIndex);
            var substrAfter = text.substring(firstSpaceIndex, text.length)
            var newText = '<span class="firstWord">' + substrBefore + '</span>' + substrAfter;
            this.innerHTML = newText;
        } else {
            this.innerHTML = '<span class="firstWord">' + text + '</span>';
        }
    });
});

Sie können dann CSS verwenden, um einen Stil für zu erstellen .firstWord.

Es ist nicht perfekt, da es nicht jede Art von Leerzeichen berücksichtigt. Ich bin mir jedoch sicher, dass es mit ein paar Änderungen das erreichen kann, wonach Sie suchen.

Beachten Sie, dass dieser Code erst nach dem Laden der Seite ausgeführt wird. Daher kann es einen Sekundenbruchteil dauern, bis der Effekt sichtbar wird.

user1171848
quelle
1

Hierfür gibt es keine einfache CSS-Methode. Möglicherweise müssen Sie JavaScript + Regex verwenden, um eine Zeitspanne zu erreichen.

Idealerweise gibt es ein Pseudoelement für das erste Wort, aber Sie haben kein Glück, da dies nicht zu funktionieren scheint. Wir haben: erster Buchstabe und: erste Zeile.

Möglicherweise können Sie eine Kombination aus: nach oder: vor verwenden, um ohne Verwendung einer Spanne darauf zuzugreifen.

Rob Allen
quelle
0

Fügen Sie das Span-Tag in Ihren Absatztext ein. Zum Beispiel - <p><span>Hello</span>My Name Is Dot</p und dann den ersten Buchstaben stylen .

Ashique
quelle
OP fragt nach einem Selektor. Seine Frage lautete: "Gibt es eine Möglichkeit, dies in direktem CSS zu tun
?
0

Eine einfache Möglichkeit, mit HTML + CSS umzugehen:

TEXT A <b>text b</b>

<h1>text b</h1>

<style>
    h1 { /* the css style */}
    h1:before {content:"text A (p.e.first word) with different style";    
    display:"inline";/* the different css style */}
</style>
Noelia García
quelle