CSS: not (: last-child): setelah pemilih


370

Saya memiliki daftar elemen, yang ditata seperti ini:

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>

Output One | Two | Three | Four | Five |bukanOne | Two | Three | Four | Five

Adakah yang tahu cara memilih semua CSS kecuali elemen terakhir?

Anda dapat melihat definisi :not()pemilih di sini


1
Perilaku ini tampaknya menjadi bug di Chrome 10. Ini berfungsi untuk saya di Firefox 3.5.
duri

6
Sebenarnya hanya menjalankan cuplikan di 2018 dengan Chrome terbaru dan bekerja seperti yang diharapkan.
atoth

Jawaban:


433

Jika ada masalah dengan pemilih yang tidak, Anda dapat mengatur semuanya dan menimpa yang terakhir

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

atau jika Anda dapat menggunakannya sebelumnya, tidak perlu untuk anak terakhir

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

12
Ini sebenarnya satu-satunya cara untuk membuatnya bekerja sejauh IE8 (maaf, tidak ada cheetos untuk IE7 dan sebelumnya). li:not(:first-child):beforeagak terlalu menakutkan untuk ditangani oleh versi Internet Explorer yang lebih lama.
Sandy Gifford

240

Setiap hal tampaknya benar. Anda mungkin ingin menggunakan pemilih css berikut alih-alih apa yang Anda gunakan.

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

4
@ScottBeeson Ini adalah awnser terbaik untuk peramban modern, tetapi pekerjaan jawaban yang diterima dengan peramban lama. (Saya setuju dengan Anda, ini harus diterima)
Arthur

25

Contoh Anda sebagai tulisan berfungsi dengan baik di Chrome 11 untuk saya. Mungkin browser Anda tidak mendukung :not()pemilih?

Anda mungkin perlu menggunakan JavaScript atau yang serupa untuk menyelesaikan cross-browser ini. jQuery mengimplementasikan : not () di API pemilihnya.


8
Saya memecahkan ini dengan melakukan li:not(:first-child):beforedan menambahkan bilah vertikal sebelumnya. Saya sedang bekerja dengan versi stabil Chrome yang tampaknya tidak mendukung anak terakhir. Membangun Canary tidak. Terima kasih atas jawabannya.
Matt Clarkson

Sepertinya Chrome tidak mendukungnya bahkan di tahun 2013?
MikkoP

20

Contoh menggunakan CSS

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

20

Bagi saya itu berfungsi dengan baik

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

1
Jawaban ini mungkin lebih terkait dengan SCSS daripada CSS.
Chris Walsh

10

Sampel Anda tidak berfungsi di IE untuk saya, Anda harus menentukan header Doctype dalam dokumen Anda untuk membuat halaman Anda dengan cara standar di IE untuk menggunakan properti CSS konten:

<!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>

Cara kedua adalah menggunakan penyeleksi CSS 3

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

Tetapi Anda masih perlu menentukan DOCTYPE

Dan cara ketiga adalah menggunakan JQuery dengan beberapa skrip seperti berikut:

<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>

Keuntungan dari cara ketiga adalah Anda tidak perlu menentukan doctype dan jQuery akan menjaga kompatibilitas.


6
<! DOCTYPE html> adalah standar HTML5 baru.
Matt Clarkson

1
Ini adalah cara yang luar biasa dan modern untuk menangani ini. Saya sedang bergumul dengan: anak terakhir, kemudian saya menemukan jawaban Anda. Yang ini sempurna! : not (: jenis terakhir): setelah
Firze

1

Hapus: sebelum anak terakhir dan: setelah dan digunakan

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

Semoga itu berhasil


-2

Anda dapat mencoba ini, saya tahu bukan jawaban yang Anda cari tetapi konsepnya sama.

Di mana Anda mengatur gaya untuk semua anak dan kemudian menghapusnya dari anak terakhir.

Cuplikan Kode

li
  margin-right: 10px

  &:last-child
    margin-right: 0

Gambar

masukkan deskripsi gambar di sini


2
Hai, bolehkah saya tahu editor apa ini? Itu terlihat bagus.
Zanecat

Ini adalah sepotong kecil kode dan siapa pun dapat dengan mudah mengingat dan mengetiknya.
Yashu Mittal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.