Bộ chọn cho một thẻ theo sau trực tiếp bởi một thẻ khác


88

Đây sẽ chọn tất cả <B>các thẻ trực tiếp trước bởi <A>thẻ:

A+B {
    /* styling */
}

Bộ chọn cho tất cả <A>các thẻ theo sau trực tiếp bởi <B>các thẻ là gì?

Đây là HTML mẫu phù hợp với câu hỏi của tôi:

<a>some text</a>
<b>some text</b>

3
Pease cung cấp cho chúng tôi một ví dụ DOM như thế nào ABcó liên quan như thế nào .
Gumbo

2
Chúng có quan hệ họ hàng với nhau ở chỗ chúng là anh em ruột và B đứng sau A. OP muốn chọn tất cả các bs được theo sau bởi as, tương tự như a+bnơi bạn có thể chọn tất cả các bs đứng trước trực tiếp a.
Anthony

2,5 năm sau, có cập nhật nào cho câu trả lời này không? Tôi cũng đang muốn nhắm mục tiêu a theo sau là b.
chovy

Câu trả lời:


29

Bạn không thể trong css.

Chỉnh sửa: Để hữu ích hơn một chút, nếu bạn sử dụng ví dụ: jQuery (một thư viện JavaScript), bạn có thể sử dụng .prev().


nó seams giải pháp duy nhất bằng cách sử dụng JavaScript
Mostafa Farghaly

2
Cảm ơn jeroen! Điều đó đã khắc phục sự cố của tôi. Kể từ khi tôi "A" nổi trái và "B" nổi đúng, nó không có vấn đề gì đặt hàng tôi đặt đánh dấu.
BobRodes

53

Ý của bạn là định kiểu A cho rằng nó có phần tử B trực tiếp bên trong hoặc theo sau? Như thế này:

<A>
    <B>
    </B>
</A>

// OR

<A>
</A>
<B>
</B>

Bạn không thể làm điều đó trong CSS (chưa). Eric Meyer nói rằng loại bộ chọn này đã được thảo luận khá nhiều lần trong danh sách gửi thư CSS và không thể thực hiện được. Dave Hyatt, một trong những nhà phát triển WebKit cốt lõi, nhận xét với lời giải thích tốt về lý do tại sao nó không thể được thực hiện.

Kiểm tra: Bài đăng trên blog của Shaun Inmanbình luận của Eric Meyer .
David Hyatt cũng cân nhắc .


i có nghĩa là một thứ hai, tôi hiểu vấn đề này cảm ơn bạn nick :)
Mostafa Farghaly

17

Bạn CHỈ có thể làm ngược lại: Điều này chọn tất cả các thẻ đứng trước các thẻ.

Điều này về mặt logic tương đương với yêu cầu của bạn.

Tôi thường sử dụng điều này để tạo kiểu cho một hàng nhiều hộp kiểm có nhãn

CSS:

label+input {
    margin-left: 4px;
}

DOM:

<input id="a" name="a" type="checkbox"/><label for="a">...</label>
<input id="b" name="b" type="checkbox"/><label for="b">...</label>
<input id="c" name="c" type="checkbox"/><label for="c">...</label>

3
Tôi nghĩ rằng bạn muốn nhập "input + label" trong CSS để phần lề bên trái được áp dụng cho nhãn.
CAK2

1
@ CAK2 - Tôi nghĩ anh ấy có ý đúng. Bằng cách thực hiện label+inputký quỹ được áp dụng cho tất cả các inputphần tử bắt đầu từ phần tử thứ hai . Đó là một cách sáng tạo để tạo khoảng trống giữa chúng nhưng không phải ở đầu hoặc cuối hàng. Trong trường hợp này, nó tương đương với input:not(:first-child).
David

1

Mặc dù nó không tiện dụng lắm, nhưng ngày nay bạn có thể đạt được hành vi này bằng cách đảo ngược thứ tự của các phần tử của bạn cả khi bạn tạo HTML và bằng cách áp dụng các quy tắc CSS: display: flexflex-direction: column-reverse

ul {
  display: flex;
  flex-direction: column-reverse;
}

.b ~ .a {
  color: red;
}
<ul>
    <li class="a">A 3</li>
    <li class="c">C 2</li>
    <li class="c">C 1</li>
    <li class="b">B 1</li>
    <li class="a">A 2</li>
    <li class="a">A 1</li>
</ul>

Ngoài ra, nếu bạn có 2 hoặc nhiều phần tử nội tuyến, bạn có thể đạt được điều đó bằng cách áp dụng float: right, vì chúng sẽ được hiển thị theo thứ tự ngược lại:

ul {
  float: left;
  list-style-type: none;
}

li {
  float: right;
}

li:not(:first-child) {
  margin-right: 20px;
}

.b ~ .a {
  color: red;
}
<ul>
    <li class="a">A 3</li>
    <li class="c">C 2</li>
    <li class="c">C 1</li>
    <li class="b">B 1</li>
    <li class="a">A 2</li>
    <li class="a">A 1</li>
</ul>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.