CSS: nicht (: letztes Kind): nach Selektor


369

Ich habe eine Liste von Elementen, die so gestaltet sind:

ul {
    list-style-type: none;
    text-align: center;
}

li {
    display: inline;
}

li:not(:last-child):after {
    content:' |';
}
<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
    <li>Four</li>
    <li>Five</li>
</ul>

Ausgänge One | Two | Three | Four | Five |stattOne | Two | Three | Four | Five

Weiß jemand, wie man CSS alle außer dem letzten Element auswählt?

Die Definition des :not()Selektors sehen Sie hier


1
Dieses Verhalten scheint in Chrome 10 ein Fehler zu sein. Es funktioniert für mich in Firefox 3.5.
Duri

6
Eigentlich lief gerade das Snippet im Jahr 2018 mit dem neuesten Chrome und funktionierte wie erwartet.
Uhr

Antworten:


433

Wenn es ein Problem mit dem Nicht-Selektor gibt, können Sie alle einstellen und den letzten überschreiben

li:after
{
  content: ' |';
}
li:last-child:after
{
  content: '';
}

oder wenn Sie vorher verwenden können, brauchen Sie kein letztes Kind

li+li:before
{
  content: '| ';
}

12
Dies ist eigentlich die einzige Möglichkeit, es bereits in IE8 zum Laufen zu bringen (sorry, keine Cheetos für IE7 und früher). li:not(:first-child):beforeist ein bisschen zu beängstigend für die älteren Versionen von Internet Explorer.
Sandy Gifford

240

Alles scheint richtig zu sein. Möglicherweise möchten Sie den folgenden CSS-Selektor anstelle des von Ihnen verwendeten verwenden.

ul > li:not(:last-child):after

4
@ScottBeeson Dies ist der beste Awnser für moderne Browser, aber akzeptierte Antwortarbeiten mit alten Browsern. (Ich stimme Ihnen zu, dies sollte die akzeptierte sein)
Arthur

25

Ihr Beispiel wie geschrieben funktioniert in Chrome 11 perfekt für mich. Vielleicht unterstützt Ihr Browser den :not()Selektor einfach nicht ?

Möglicherweise müssen Sie JavaScript oder ähnliches verwenden, um diesen browserübergreifenden Vorgang auszuführen. jQuery implementiert : not () in seiner Selektor-API.


8
Ich habe dies gelöst, indem ich zuvor li:not(:first-child):beforeden vertikalen Balken hinzugefügt habe. Ich habe mit der stabilen Version von Chrome gearbeitet, die das letzte Kind nicht zu unterstützen scheint. Der kanarische Bau tut es. Danke für die Antwort tho.
Matt Clarkson

Scheint, als würde Chrome es auch 2013 nicht unterstützen?
MikkoP

20

Ein Beispiel mit CSS

  ul li:not(:last-child){
        border-right: 1px solid rgba(153, 151, 151, 0.75);
    }

20

Für mich funktioniert es gut

&:not(:last-child){
            text-transform: uppercase;
        }

1
Diese Antwort bezieht sich möglicherweise eher auf SCSS als auf CSS.
Chris Walsh

10

Ihr Beispiel funktioniert in IE nicht für mich. Sie müssen in Ihrem Dokument den Doctype-Header angeben , um Ihre Seite im IE auf standardmäßige Weise zu rendern und die CSS-Eigenschaft content zu verwenden:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<head>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<html>

<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
    <li>Four</li>
    <li>Five</li>
</ul>

</html>

Der zweite Weg ist die Verwendung von CSS 3-Selektoren

li:not(:last-of-type):after
{
    content:           " |";
}

Sie müssen jedoch weiterhin Doctype angeben

Und die dritte Möglichkeit besteht darin, JQuery mit einem Skript wie dem folgenden zu verwenden:

<script type="text/javascript" src="jquery-1.4.1.js"></script>
<link href="style2.css" rel="stylesheet" type="text/css">
</head>
<html>

<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
    <li>Four</li>
    <li>Five</li>
</ul>

<script type="text/javascript">
  $(document).ready(function () {
      $("li:not(:last)").append(" | ");
    });
</script>

Der dritte Weg hat den Vorteil, dass Sie keinen Doctype angeben müssen und jQuery für die Kompatibilität sorgt.


6
<! DOCTYPE html> ist der neue HTML5-Standard.
Matt Clarkson

1
Dies ist eine großartige und moderne Art, damit umzugehen. Ich hatte Probleme mit: Letztes Kind, dann habe ich deine Antwort gefunden. Dieser ist perfekt! : nicht (: letzter Typ): nach
Firze

1

Entfernen Sie das: vor dem letzten Kind und das: nach und verwendet

 ul li:not(last-child){
 content:' |';
}

Hoffentlich sollte es funktionieren


-2

Sie können dies versuchen, ich weiß, es sind nicht die Antworten, die Sie suchen, aber das Konzept ist das gleiche.

Hier legen Sie die Stile für alle untergeordneten Elemente fest und entfernen sie dann aus dem letzten untergeordneten Element.

Code-Auszug

li
  margin-right: 10px

  &:last-child
    margin-right: 0

Bild

Geben Sie hier die Bildbeschreibung ein


2
Hallo, darf ich bitte wissen, was dieser Editor ist? Es sieht gut aus.
Zanecat

Es ist ein kleines Stück Code und jeder kann es sich leicht merken und eingeben.
Yashu Mittal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.