Có bộ chọn cha mẹ CSS không?


3176

Làm cách nào để chọn <li>phần tử là cha mẹ trực tiếp của phần tử neo?

Ví dụ, CSS của tôi sẽ giống như thế này:

li < a.active {
    property: value;
}

Rõ ràng có nhiều cách để làm điều này với JavaScript, nhưng tôi hy vọng rằng có một cách giải quyết khác tồn tại tự nhiên đối với CSS Cấp 2.

Menu mà tôi đang cố gắng tạo kiểu đang được tạo ra bởi một CMS, vì vậy tôi không thể di chuyển phần tử đang hoạt động sang <li>phần tử ... (trừ khi tôi chủ đề mô-đun tạo menu mà tôi không muốn làm).

Có ý kiến ​​gì không?

Câu trả lời:


2535

Hiện tại không có cách nào để chọn cha mẹ của một phần tử trong CSS.

Nếu có một cách để làm điều đó, thì đó sẽ là một trong các thông số kỹ thuật của bộ chọn CSS hiện tại:

Điều đó nói rằng, Dự thảo làm việc cấp 4 của Selector bao gồm một :has()lớp giả sẽ cung cấp khả năng này. Nó sẽ tương tự như việc triển khai jQuery .

li:has(> a.active) { /* styles to apply to the li tag */ }

Tuy nhiên, kể từ tháng 5 năm 2020, điều này vẫn chưa được bất kỳ trình duyệt nào hỗ trợ .

Trong khi đó, bạn sẽ phải dùng đến JavaScript nếu bạn cần chọn một phần tử cha.


68
Có vẻ như nó đã được đề xuất và từ chối: stackoverflow.com/questions/45004/
Khăn

14
Có vẻ như bộ chọn chủ đề đã được xem xét lại, ngoại trừ bằng cách sử dụng !ngay bây giờ:The subject of the selector can be explicitly identified by appending an exclamation mark (!) to one of the compound selectors in a selector.
animuson

13
Việc chuẩn bị có $vẻ tốt hơn đối với tôi ... phần bổ sung !có thể được bỏ qua dễ dàng hơn.
Christoph

51
Cốt truyện chính xoắn! Bộ chọn 4 WD vừa được cập nhật hôm nay để loại trừ chỉ báo chủ đề khỏi cấu hình nhanh, được sử dụng bởi các triển khai CSS. Nếu thay đổi này vẫn còn, điều đó có nghĩa là bạn sẽ không thể sử dụng chỉ báo chủ đề trong biểu định kiểu nữa (trừ khi bạn sử dụng thêm một số loại polyfill như mô tả trong câu trả lời khác ) - bạn chỉ có thể sử dụng nó với API Selector và bất cứ nơi nào khác mà hồ sơ đầy đủ có thể được thực hiện.
BoltClock

55
Một cập nhật lớn khác: có vẻ như họ đang cân nhắc loại bỏ hoàn toàn cú pháp của bộ chọn chủ đề và thay thế nó bằng :has()giả mà mọi người đã biết và yêu thích từ jQuery. ED mới nhất đã loại bỏ tất cả các tham chiếu đến chỉ báo chủ đề và thay thế nó bằng :has()giả. Tôi không biết lý do chính xác, nhưng CSSWG đã tổ chức một cuộc thăm dò trước đây và kết quả phải có ảnh hưởng đến quyết định này. Rất có khả năng tương thích với jQuery (vì vậy nó có thể tận dụng qSA mà không cần sửa đổi) và vì cú pháp chỉ báo chủ đề tỏ ra quá khó hiểu.
BoltClock

152

Tôi không nghĩ bạn chỉ có thể chọn cha mẹ trong CSS.

Nhưng vì bạn dường như đã có một .activelớp, việc chuyển lớp đó sang li(thay vì a) sẽ dễ dàng hơn . Bằng cách đó bạn chỉ có thể truy cập cả liathông qua CSS.


4
Bạn không thể chuyển bộ chọn giả sang mục danh sách, vì nó không phải là phần tử có thể tập trung. Anh ta đang sử dụng: bộ chọn hoạt động, vì vậy khi neo hoạt động, anh ta muốn mục danh sách bị ảnh hưởng. Danh sách các mục sẽ không bao giờ ở trạng thái hoạt động. Bên cạnh đó, thật đáng tiếc rằng một bộ chọn như vậy không tồn tại. Có được một menu CSS thuần để có thể truy cập bàn phím đầy đủ dường như là không thể (nếu sử dụng các bộ chọn anh chị em, bạn có thể tạo các menu con được tạo bằng cách sử dụng danh sách lồng nhau để xuất hiện, nhưng một khi danh sách đạt được tiêu điểm, nó sẽ bị ẩn lại). Nếu có bất kỳ giải pháp nào chỉ dành cho CSS cho conun cụ thể này

12
@Dominic Aquilina Hãy xem câu hỏi, OP đang sử dụng một lớp, không phải là bộ chọn giả.
jeroen

125

Bạn có thể sử dụng tập lệnh này :

*! > input[type=text] { background: #000; }

Điều này sẽ chọn bất kỳ cha mẹ của một văn bản đầu vào. Nhưng chờ đã, vẫn còn nhiều nữa. Nếu bạn muốn, bạn có thể chọn một phụ huynh được chỉ định:

.input-wrap! > input[type=text] { background: #000; }

Hoặc chọn nó khi nó hoạt động:

.input-wrap! > input[type=text]:focus { background: #000; }

Kiểm tra HTML này:

<div class="input-wrap">
    <input type="text" class="Name"/>
    <span class="help hide">Your name sir</span>
</div>

Bạn có thể chọn span.helpkhi inputhoạt động và hiển thị nó:

.input-wrap! .help > input[type=text]:focus { display: block; }

Có nhiều khả năng hơn; chỉ cần kiểm tra các tài liệu của plugin.

BTW, nó hoạt động trong Internet Explorer.


5
giả sử sử dụng jquery patent()sẽ nhanh hơn Điều này cần thử nghiệm, tuy nhiên
Dan

2
@Idered Không thành công khi bạn khai báo CSS của Chủ đề chọn mà không có bộ chọn con ( #a!một mình ném lỗi, #a! phoạt động) và do đó, những cái khác sẽ không hoạt động vì Uncaught TypeError: Cannot call method 'split' of undefined: xem jsfiddle.net/HerrSerker/VkVPs
yunzen

3
@HerrSerker Tôi nghĩ #a! là một bộ chọn không hợp lệ, nó nên chọn cái gì?
Đã diễn ra vào

2
@ Tôi không biết. Thông số kỹ thuật không nói nó là bất hợp pháp. #a! nên chọn chính nó. Ít nhất là chúng không có lỗi trong JavaScript
yunzen

5
Theo nhận xét của tôi về câu trả lời được chấp nhận, có vẻ như polyfill có thể được yêu cầu ngay cả trong tương lai gần, bởi vì chỉ báo chủ đề có thể không bao giờ được thực hiện bởi các trình duyệt trong CSS.
BoltClock

108

Như một số người khác đã đề cập, không có cách nào định kiểu cha mẹ của một phần tử chỉ bằng CSS nhưng các cách sau hoạt động với jQuery :

$("a.active").parents('li').css("property", "value");

21
Bộ <chọn không tồn tại (được xác minh bằng jQuery 1.7.1).
Rob W

6
Có lẽ <-syntax đã hoạt động vào năm 2009 nhưng tôi đã cập nhật nó (cho năm 2013).
Alastair

5
Thậm chí tốt hơn, sử dụng :has()bộ chọn tích hợp của jQuery : $("li:has(a.active)").css("property", "value");. Nó đọc tương tự như !bộ chọn đề xuất của CSS 4 . Xem thêm: :parentbộ chọn , .parents()phương pháp , .parent()phương pháp .
Rory O'Kane

7
Và thay vì sử dụng .css("property", "value")để tạo kiểu cho các thành phần đã chọn, bạn nên thường xuyên .addClass("someClass")và có trong CSS .someClass { property: value }( thông qua ). Bằng cách đó, bạn có thể ghi chú kiểu với toàn bộ sức mạnh của CSS và bất kỳ bộ tiền xử lý nào bạn đang sử dụng.
Rory O'Kane


69

Không có bộ chọn cha mẹ; chỉ là cách không có bộ chọn anh chị em trước đó. Một lý do chính đáng cho việc không có các bộ chọn này là do trình duyệt phải duyệt qua tất cả các phần tử con của một phần tử để xác định xem có nên áp dụng một lớp hay không. Ví dụ: nếu bạn đã viết:

body:contains-selector(a.active) { background: red; }

Sau đó, trình duyệt sẽ phải đợi cho đến khi nó được tải và phân tích mọi thứ cho đến khi </body>xác định xem trang có nên có màu đỏ hay không.

Bài viết Tại sao chúng ta không có bộ chọn cha mẹ giải thích chi tiết.


11
để làm cho trình duyệt nhanh hơn Internet nhanh hơn. Bộ chọn này chắc chắn là cần thiết, và lý do cho việc không thực hiện nó, thật đáng buồn, bởi vì chúng ta sống trong một thế giới nguyên thủy, chậm chạp.
vsync

11
thực tế, bộ chọn sẽ làm cho trình duyệt rất nhanh trông chậm.
Salman A

5
Tôi tin tưởng rằng các nhà phát triển trình duyệt sẽ đưa ra một triển khai (ít nhất) nhanh như phiên bản javascript, đây là phiên bản mà mọi người cuối cùng sẽ sử dụng.
Marc.2377

"chúng ta sống trong một thế giới nguyên thủy, chậm chạp" ho ho đồng hồ táo mới ho ho
Marvin

@ Marc.2377 Nếu bạn thử ví dụ trên trong JS trên trang web của mình, tôi sẽ không bao giờ truy cập nó. Mặt khác, tôi nói rằng hầu hết thời gian, bạn chỉ quan tâm đến những đứa trẻ ngay lập tức, vì vậy nếu nó chỉ giới hạn ở những đứa trẻ ngay lập tức, thì đó sẽ là một sự bổ sung tốt mà không có quá nhiều tác động.
xryl669

54

Không có cách nào để làm điều này trong CSS 2. Bạn có thể thêm lớp vào livà tham chiếu a:

li.active > a {
    property: value;
}

3
bằng cách hiển thị phần tử: chặn, bạn có thể tạo kiểu cho phù hợp với toàn bộ khu vực li. nếu bạn có thể giải thích phong cách mà bạn đang tìm kiếm có lẽ tôi có thể giúp với một giải pháp.
Josh

đây thực sự là một giải pháp đơn giản và thanh lịch và, trong nhiều trường hợp, việc đặt lớp trên cha mẹ là điều hợp lý.
Ricardo

35

Cố gắng chuyển asang blockhiển thị, và sau đó sử dụng bất kỳ phong cách nào bạn muốn. Phần atử sẽ điền vào liphần tử và bạn sẽ có thể sửa đổi giao diện của nó theo ý muốn. Đừng quên đặt liđệm thành 0.

li {
  padding: 0;
  overflow: hidden;
}
a {
  display: block;
  width: 100%;
  color: ..., background: ..., border-radius: ..., etc...
}
a.active {
  color: ..., background: ...
}

31

Bộ chọn CSS Bộ tổng hợp Anh chị em ruột có thể được sử dụng cho những gì bạn muốn:

E ~ F {
    property: value;
}

Điều này phù hợp với bất kỳ Fyếu tố nào đi trước một Eyếu tố.


24
Đây chỉ là người anh em chọn, nó không phải là con, cha mẹ ... không thực sự trả lời người bạn đời câu hỏi
Alireza

26

Không phải trong CSS 2 như tôi biết. CSS 3 có các bộ chọn mạnh hơn nhưng không được triển khai nhất quán trên tất cả các trình duyệt. Ngay cả với các công cụ chọn được cải tiến, tôi không tin rằng nó sẽ hoàn thành chính xác những gì bạn đã chỉ định trong ví dụ của mình.


24

Tôi biết OP đang tìm kiếm một giải pháp CSS nhưng thật đơn giản để đạt được bằng cách sử dụng jQuery. Trong trường hợp của tôi, tôi cần tìm <ul>thẻ cha cho một <span>thẻ chứa trong con <li>. jQuery có :hasbộ chọn để có thể xác định cha mẹ bởi những đứa trẻ mà nó chứa:

$("ul:has(#someId)")

sẽ chọn ul phần tử có phần tử con có id someId . Hoặc để trả lời câu hỏi ban đầu, một số thứ như sau nên thực hiện thủ thuật (chưa được kiểm tra):

$("li:has(.active)")

3
Hoặc sử dụng $yourSpan.closest("ul")và bạn sẽ nhận được UL cha của phần tử span của mình. Tuy nhiên, câu trả lời của bạn là hoàn toàn imho. Chúng tôi có thể trả lời tất cả các câu hỏi được xử lý bằng CSS bằng một giải pháp jQuery.
Robin van Baalen

1
Như đã xác định trong các câu trả lời khác, không có cách nào để thực hiện điều này bằng CSS 2. Với ràng buộc đó, câu trả lời tôi cung cấp là một câu tôi biết là hiệu quả và là cách đơn giản nhất để trả lời câu hỏi bằng cách sử dụng javascript imho.
David Clarke

Đưa ra ý kiến ​​của bạn, một số người đồng ý với bạn. Nhưng câu trả lời duy nhất vẫn là câu trả lời được chấp nhận; đơn giản và đơn giản "không thể thực hiện theo cách bạn muốn". Nếu câu hỏi là làm thế nào để lưu trữ 60mph trên một chiếc xe đạp và bạn trả lời nó với "đơn giản, lên xe và nhấn ga.", Thì đó vẫn chưa phải là một câu trả lời. Do đó nhận xét của tôi.
Robin van Baalen

1
Cách tiếp cận đó sẽ làm cho SO gần như hoàn toàn vô dụng. Tôi tìm kiếm SO để tìm cách giải quyết vấn đề, không tìm thấy "câu trả lời duy nhất" không giải quyết được vấn đề. Đó là lý do tại sao SO rất tuyệt vời, bởi vì luôn có nhiều hơn một cách để lột da một con mèo.
David Clarke

23

Phần tử giả :focus-withincho phép cha mẹ được chọn nếu một hậu duệ có tiêu điểm.

Một yếu tố có thể được tập trung nếu nó có một tabindexthuộc tính.

Hỗ trợ trình duyệt để lấy nét

Tabindex

Thí dụ

.click {
  cursor: pointer;
}

.color:focus-within .change {
  color: red;
}

.color:focus-within p {
  outline: 0;
}
<div class="color">
  <p class="change" tabindex="0">
    I will change color
  </p>
  <p class="click" tabindex="1">
    Click me
  </p>
</div>


2
Điều này hoạt động tốt trong trường hợp của tôi, cảm ơn! Chỉ cần không, ví dụ sẽ trở nên phi lý hơn nếu bạn thay đổi màu sắc cho cha mẹ, không phải cho anh chị em, điều này được thay thế .color:focus-within .changebằng .color:focus-within. Trong trường hợp của tôi, tôi đang sử dụng thanh điều hướng bootstrap để thêm lớp cho trẻ em khi hoạt động và tôi muốn thêm một lớp vào cha .nav-bar. Tôi nghĩ rằng đây là một tình huống khá phổ biến khi tôi sở hữu đánh dấu nhưng thành phần css + js là bootstrap (hoặc khác) vì vậy tôi không thể thay đổi hành vi. Mặc dù tôi có thể thêm tabindex và sử dụng css này. Cảm ơn!
Cancerbero

22

Đây là khía cạnh được thảo luận nhiều nhất của đặc tả Bộ chọn cấp 4 . Với điều này, một bộ chọn sẽ có thể định kiểu một phần tử theo con của nó bằng cách sử dụng dấu chấm than sau bộ chọn đã cho (!).

Ví dụ:

body! a:hover{
   background: red;
}

sẽ đặt màu nền đỏ nếu người dùng di chuyển qua bất kỳ neo nào.

Nhưng chúng ta phải chờ triển khai của trình duyệt :(


21

Bạn có thể thử sử dụng siêu liên kết làm cha mẹ, sau đó thay đổi các thành phần bên trong khi di chuột. Như thế này:

a.active h1 {color:red;}

a.active:hover h1 {color:green;}

a.active h2 {color:blue;}

a.active:hover h1 {color:yellow;}

Bằng cách này, bạn có thể thay đổi kiểu trong nhiều thẻ bên trong, dựa trên cuộn qua của phần tử cha.


1
Điều đó là chính xác, nhưng chỉ giới hạn mã đánh dấu trong athẻ ở một số thành phần nhất định, nếu bạn muốn tuân thủ các tiêu chuẩn XHTML. Chẳng hạn, bạn không thể sử dụng divbên trong amà không nhận được cảnh báo vi phạm lược đồ.
Ivaylo Slavov

2
Tổng cộng đúng Ivaylo! "a" là một phần tử không phải khối, vì vậy không thể sử dụng các phần tử khối bên trong nó.
bão sông

1
Trong HTML5, việc đặt các phần tử khối bên trong các liên kết là hoàn toàn tốt.
Matthew James Taylor

2
... nếu nó sai về mặt ngữ nghĩa, họ sẽ không cho phép nó trong HTML5, nơi nó không có trước đây.
BoltClock

14

Hiện tại không có bộ chọn phụ huynh và nó thậm chí không được thảo luận trong bất kỳ cuộc đàm phán nào của W3C. Bạn cần hiểu cách CSS được trình duyệt đánh giá để thực sự hiểu nếu chúng ta cần nó hay không.

Có rất nhiều lời giải thích kỹ thuật ở đây.

Jonathan Snook giải thích cách đánh giá CSS .

Chris Coyier về các cuộc nói chuyện của người chọn Phụ huynh .

Harry Roberts một lần nữa về việc viết các bộ chọn CSS hiệu quả .

Nhưng Nicole Sullivan có một số sự thật thú vị về xu hướng tích cực .

Những người này đều thuộc đẳng cấp hàng đầu trong lĩnh vực phát triển front end.


12
Điều neednày được xác định bởi các yêu cầu của nhà phát triển web, việc có nó trong thông số kỹ thuật hay không được quyết định bởi các yếu tố khác.
nicodemus13

14

Chỉ là một ý tưởng cho menu ngang ...

Một phần của HTML

<div class='list'>
  <div class='item'>
    <a>Link</a>
  </div>
  <div class='parent-background'></div>
  <!-- submenu takes this place -->
</div>

Một phần của CSS

/* Hide parent backgrounds... */
.parent-background {
  display: none; }

/* ... and show it when hover on children */
.item:hover + .parent-background {
  display: block;
  position: absolute;
  z-index: 10;
  top: 0;
  width: 100%; }

Bản cập nhật và phần còn lại của mã

Một ví dụ khác về cách sử dụng nó với kiểu nhập văn bản - chọn trường cha


3
Tôi không rõ ràng về ý nghĩa của bạn khi khái quát hóa điều này với một số / nhiều / hầu hết các trường hợp sử dụng bộ chọn cha mẹ, hoặc thậm chí chính xác những phần nào của CSS này đang làm gì. Bạn có thể thêm một lời giải thích kỹ lưỡng?
Nathan Tuggy

2
Tôi đã không cố gắng áp dụng điều này vào các kịch bản trong thế giới thực, đó là lý do tại sao tôi nói "Không dành cho sản xuất". Nhưng tôi nghĩ nó chỉ có thể được áp dụng cho menu 2 cấp với chiều rộng mục cố định. "Phần nào của CSS này đang làm gì" - .test-anh chị em ở đây thực sự là nền tảng của mục cha mẹ (dòng cuối cùng của CSS).
Ilya B.

2
Đã thêm lời giải thích (phần css của jsfiddle, bắt đầu từ "PHẦN CHÍNH") ... Và tôi đã nhầm - có thể có bất kỳ số lượng phụ.
Ilya B.

13

Đây là một hack sử dụng pointer-eventsvới hover:

<!doctype html>
<html>
	<head>
		<title></title>
		<style>
/* accessory */
.parent {
	width: 200px;
	height: 200px;
	background: gray;
}
.parent, 
.selector {
	display: flex;
	justify-content: center;
	align-items: center;
}
.selector {
	cursor: pointer;
	background: silver;
	width: 50%;
	height: 50%;
}
		</style>
		<style>
/* pertinent */
.parent {
	background: gray;
	pointer-events: none;
}
.parent:hover {
	background: fuchsia;
}
.parent 
.selector {
	pointer-events: auto;
}
		</style>
	</head>
	<body>
		<div class="parent">
			<div class="selector"></div>
		</div>
	</body>
</html>


12

Có một plugin mở rộng CSS để bao gồm một số tính năng không chuẩn có thể thực sự hữu ích khi thiết kế trang web. Nó được gọi là EQCSS .

Một trong những điều EQCSS thêm vào là bộ chọn cha. Nó hoạt động trong tất cả các trình duyệt, Internet Explorer 8 trở lên. Đây là định dạng:

@element 'a.active' {
  $parent {
    background: red;
  }
}

Vì vậy, ở đây chúng tôi đã mở một truy vấn phần tử trên mọi phần tử a.activevà đối với các kiểu bên trong truy vấn đó, những thứ như $parentcó ý nghĩa, bởi vì có một điểm tham chiếu. Trình duyệt có thể tìm thấy cha mẹ, vì nó rất giống với parentNodeJavaScript.

Đây là bản demo$parentmột $parentbản demo khác hoạt động trong Internet Explorer 8 , cũng như ảnh chụp màn hình trong trường hợp bạn không có Internet Explorer 8 để thử nghiệm .

EQCSS cũng bao gồm các bộ chọn meta : $prevcho phần tử trước một phần tử được chọn và $thischỉ cho các phần tử phù hợp với truy vấn phần tử và hơn thế nữa.


11

Bây giờ là năm 2019 và bản nháp mới nhất của CSS Nesting Module thực sự có cái gì đó như thế này. Giới thiệu @nesttheo quy tắc.

3.2. Quy tắc làm tổ: @nest

Trong khi làm tổ trực tiếp trông đẹp, nó có phần mong manh. Một số bộ chọn lồng hợp lệ, như .foo &, không được phép và chỉnh sửa bộ chọn theo một số cách nhất định có thể làm cho quy tắc không hợp lệ bất ngờ. Đồng thời, một số người tìm thấy thách thức lồng nhau để phân biệt trực quan với các tuyên bố xung quanh.

Để hỗ trợ tất cả các vấn đề này, đặc điểm kỹ thuật này xác định quy tắc @nest, trong đó áp đặt ít hạn chế hơn về cách quy tắc hợp lệ kiểu lồng nhau. Cú pháp của nó là:

@nest = @nest <selector> { <declaration-list> }

Các quy tắc @nest hoạt động giống hệt với quy tắc kiểu: nó bắt đầu bằng một bộ chọn và chứa các khai báo áp dụng cho các phần tử mà bộ chọn khớp. Sự khác biệt duy nhất là bộ chọn được sử dụng trong quy tắc @nest phải chứa tổ, có nghĩa là nó có chứa bộ chọn lồng trong nó ở đâu đó. Một danh sách các bộ chọn có chứa tổ nếu tất cả các bộ chọn phức tạp riêng lẻ của nó đều chứa tổ.

(Sao chép và dán từ URL ở trên).

Ví dụ về bộ chọn hợp lệ theo thông số kỹ thuật này:

.foo {
  color: red;
  @nest & > .bar {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   .foo > .bar { color: blue; }
 */

.foo {
  color: red;
  @nest .parent & {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   .parent .foo { color: blue; }
 */

.foo {
  color: red;
  @nest :not(&) {
    color: blue;
  }
}
/* Equivalent to:
   .foo { color: red; }
   :not(.foo) { color: blue; }
 */

10

Về mặt kỹ thuật không có cách trực tiếp để làm điều này. Tuy nhiên, bạn có thể sắp xếp nó với jQuery hoặc JavaScript.

Tuy nhiên, bạn có thể làm một cái gì đó như thế này là tốt.

a.active h1 {color: blue;}
a.active p {color: green;}

jQuery

$("a.active").parents('li').css("property", "value");

Nếu bạn muốn đạt được điều này bằng cách sử dụng jQuery thì đây là tài liệu tham khảo cho bộ chọn cha của jQuery .


9

W3C đã loại trừ bộ chọn như vậy vì ảnh hưởng hiệu năng rất lớn mà nó sẽ có trên trình duyệt.


27
sai. bởi vì DOM là một cái cây, chúng phải đến cha mẹ trước khi đến với đứa trẻ, vì vậy chỉ cần quay lại một nút. oo
NullVoxPopuli

9
Các bộ chọn CSS là một hàng đợi để thứ tự bộ chọn được đánh giá thay vì phân cấp XPath hoặc DOM tài liệu.
Paul Sweatte

3
@rgb Ít nhất đó là những gì họ nói với chúng tôi.
yunzen

9

Câu trả lời ngắn gọn là KHÔNG ; Chúng tôi không có parent selectorgiai đoạn này trong CSS, nhưng nếu bạn không phải trao đổi các phần tử hoặc lớp, thì tùy chọn thứ hai là sử dụng JavaScript. Một cái gì đó như thế này:

var activeATag = Array.prototype.slice.call(document.querySelectorAll('a.active'));

activeATag.map(function(x) {
  if(x.parentNode.tagName === 'LI') {
    x.parentNode.style.color = 'red'; // Your property: value;
  }
});

Hoặc một cách ngắn hơn nếu bạn sử dụng jQuery trong ứng dụng của mình:

$('a.active').parents('li').css('color', 'red'); // Your property: value;

5

Mặc dù hiện tại không có bộ chọn cha mẹ trong CSS tiêu chuẩn, tôi đang làm việc với một dự án (cá nhân) có tên là ax (tức là Bộ chọn CSS Augmented Syntax / ACSSSS ), trong số 7 bộ chọn mới của nó, bao gồm cả hai:

  1. một bộ chọn cha ngay lập tức< (cho phép lựa chọn ngược lại> )
  2. một bộ chọn tổ tiên ^ (cho phép lựa chọn ngược lại [SPACE])

cây rìu hiện đang trong giai đoạn phát triển BETA tương đối sớm.

Xem bản demo tại đây:

http://rounin.co.uk/projects/axe/axe2.html

(so sánh hai danh sách bên trái được tạo kiểu với bộ chọn tiêu chuẩn và hai danh sách bên phải được tạo kiểu với bộ chọn rìu)


3
Dự án đang trong giai đoạn Beta sớm. Bạn có thể (ít nhất là hiện tại) kích hoạt các bộ chọn rìu theo kiểu CSS của mình bằng cách đưa <script src="https://rouninmedia.github.io/axe/axe.js"></script>vào cuối tài liệu html của bạn, ngay trước đó </body>.
Rounin

4

Ít nhất lên đến và bao gồm CSS 3, bạn không thể chọn như thế. Nhưng ngày nay nó có thể được thực hiện khá dễ dàng trong JavaScript, bạn chỉ cần thêm một chút JavaScript vanilla, lưu ý rằng mã này khá ngắn.

cells = document.querySelectorAll('div');
[].forEach.call(cells, function (el) {
    //console.log(el.nodeName)
    if (el.hasChildNodes() && el.firstChild.nodeName=="A") {
        console.log(el)
    };
});
<div>Peter</div>
<div><a href="#">Jackson link</a></div>
<div>Philip</div>
<div><a href="#">Pullman link</a></div>


4

Có ý kiến ​​gì không?

CSS 4 sẽ được ưa thích nếu nó thêm một số móc vào việc đi lùi . Cho đến khi có thể (mặc dù không nên) sử dụng checkboxvà / hoặc radio inputs để phá vỡ cách thức thông thường mà mọi thứ được kết nối, và thông qua đó cũng cho phép CSS hoạt động bên ngoài phạm vi bình thường của nó ...

/* Hide things that may be latter shown */
.menu__checkbox__selection,
.menu__checkbox__style,
.menu__hidden {
  display: none;
  visibility: hidden;
  opacity: 0;
  filter: alpha(opacity=0); /* Old Microsoft opacity */
}


/* Base style for content and style menu */
.main__content {
  background-color: lightgray;
  color: black;
}

.menu__hidden {
  background-color: black;
  color: lightgray;
  /* Make list look not so _listy_ */
  list-style: none;
  padding-left: 5px;
}

.menu__option {
  box-sizing: content-box;
  display: block;
  position: static;
  z-index: auto;
}

/* &#9660; - \u2630 - Three Bars */
/*
.menu__trigger__selection::before {
  content: '\2630';
  display: inline-block;
}
*/

/* &#9660; - Down Arrow */
.menu__trigger__selection::after {
  content: "\25BC";
  display: inline-block;
  transform: rotate(90deg);
}


/* Customize to look more `select` like if you like */
.menu__trigger__style:hover,
.menu__trigger__style:active {
  cursor: pointer;
  background-color: darkgray;
  color: white;
}


/**
 * Things to do when checkboxes/radios are checked
 */

.menu__checkbox__selection:checked + .menu__trigger__selection::after,
.menu__checkbox__selection[checked] + .menu__trigger__selection::after {
  transform: rotate(0deg);
}

/* This bit is something that you may see elsewhere */
.menu__checkbox__selection:checked ~ .menu__hidden,
.menu__checkbox__selection[checked] ~ .menu__hidden {
  display: block;
  visibility: visible;
  opacity: 1;
  filter: alpha(opacity=100); /* Microsoft!? */
}


/**
 * Hacky CSS only changes based off non-inline checkboxes
 * ... AKA the stuff you cannot unsee after this...
 */
.menu__checkbox__style[id="style-default"]:checked ~ .main__content {
  background-color: lightgray;
  color: black;
}

.menu__checkbox__style[id="style-default"]:checked ~ .main__content .menu__trigger__style[for="style-default"] {
  color: darkorange;
}

.menu__checkbox__style[id="style-one"]:checked ~ .main__content {
  background-color: black;
  color: lightgray;
}

.menu__checkbox__style[id="style-one"]:checked ~ .main__content .menu__trigger__style[for="style-one"] {
  color: darkorange;
}

.menu__checkbox__style[id="style-two"]:checked ~ .main__content {
  background-color: darkgreen;
  color: red;
}

.menu__checkbox__style[id="style-two"]:checked ~ .main__content .menu__trigger__style[for="style-two"] {
  color: darkorange;
}
<!--
  This bit works, but will one day cause troubles,
  but truth is you can stick checkbox/radio inputs
  just about anywhere and then call them by id with
  a `for` label. Keep scrolling to see what I mean
-->
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-default">
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-one">
<input type="radio"
       name="colorize"
       class="menu__checkbox__style"
       id="style-two">


<div class="main__content">

  <p class="paragraph__split">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
  </p>

  <input type="checkbox"
         class="menu__checkbox__selection"
         id="trigger-style-menu">
  <label for="trigger-style-menu"
         class="menu__trigger__selection"> Theme</label>

  <ul class="menu__hidden">
    <li class="menu__option">
      <label for="style-default"
             class="menu__trigger__style">Default Style</label>
    </li>

    <li class="menu__option">
      <label for="style-one"
             class="menu__trigger__style">First Alternative Style</label>
    </li>

    <li class="menu__option">
      <label for="style-two"
             class="menu__trigger__style">Second Alternative Style</label>
    </li>
  </ul>

  <p class="paragraph__split">
    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
    cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
    proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </p>

</div>

... khá thô , nhưng chỉ với CSS và HTML, có thể chạm và chạm lại bất cứ thứ gì ngoại trừ body:roottừ mọi nơi bằng cách liên kết idforcác thuộc tính của radio/ checkbox inputslabel trình kích hoạt ; có khả năng ai đó sẽ chỉ cho bạn cách chạm vào những người đó vào một lúc nào đó.

Một cảnh báo bổ sung là chỉ một trong những input trạng thái cụ idthể có thể được sử dụng, trước tiên checkbox/ radio thắng một trạng thái được bật trong các từ khác ... Nhưng nhiều nhãn có thể chỉ đến cùng input, mặc dù điều đó sẽ làm cho cả HTML và CSS trông thậm chí còn cao hơn.


... Tôi hy vọng rằng có một số cách giải quyết tồn tại riêng với CSS Cấp 2 ...

Tôi không chắc chắn về các :bộ chọn khác , nhưng tôi :checkedcho CSS trước 3. Nếu tôi nhớ chính xác, đó là một cái gì đó giống như [checked]đó là lý do tại sao bạn có thể tìm thấy nó trong đoạn mã trên, ví dụ,

.menu__checkbox__selection:checked ~ .menu__hidden,
.menu__checkbox__selection[checked] ~ .menu__hidden {
 /* rules: and-stuff; */
}

... nhưng đối với những thứ như ::after:hover, tôi hoàn toàn không chắc chắn phiên bản CSS nào xuất hiện lần đầu tiên.

Đó là tất cả đã nêu, xin đừng bao giờ sử dụng điều này trong sản xuất, thậm chí không tức giận. Như một trò đùa chắc chắn, hay nói cách khác chỉ vì một cái gì đó có thể được thực hiện không phải lúc nào có nghĩa là nó nên .


3

Không, bạn không thể chỉ chọn cha mẹ trong CSS.

Nhưng vì bạn dường như đã có một .activelớp, việc chuyển lớp đó sang li(thay vì a) sẽ dễ dàng hơn . Bằng cách đó bạn chỉ có thể truy cập cả liathông qua CSS.


1

Thay đổi phần tử cha dựa trên phần tử con hiện chỉ có thể xảy ra khi chúng ta có <input> phần tử bên trong phần tử cha. Khi một đầu vào được lấy nét, phần tử cha tương ứng của nó có thể bị ảnh hưởng khi sử dụng CSS.

Ví dụ sau đây sẽ giúp bạn hiểu bằng cách sử dụng :focus-withinCSS.

.outer-div {
  width: 400px;
  height: 400px;
  padding: 50px;
  float: left
}

.outer-div:focus-within {
  background: red;
}

.inner-div {
  width: 200px;
  height: 200px;
  float: left;
  background: yellow;
  padding: 50px;
}
<div class="outer-div">
  <div class="inner-div">
    I want to change outer-div(Background color) class based on inner-div. Is it possible?
    <input type="text" placeholder="Name" />
  </div>
</div>


1

Điều đó là có thể với ký hiệu và trong Sass :

h3
  font-size: 20px
  margin-bottom: 10px
  .some-parent-selector &
    font-size: 24px
    margin-bottom: 20px

Đầu ra CSS:

h3 {
  font-size: 20px;
  margin-bottom: 10px;
}
.some-parent-selector h3 {
  font-size: 24px;
  margin-bottom: 20px;
}

2
đó là sự thật, nhưng chỉ khi bạn biết trước bộ chọn.
Shahar

11
Điều này không chọn h3cha mẹ, đó là mục tiêu. Điều này sẽ chọn h3s là hậu duệ của .some-parent-selector.
Jacob Ford

1

Tôi sẽ thuê một số mã JavaScript để làm điều đó. Ví dụ, trong React khi bạn lặp qua một mảng, hãy thêm một lớp khác vào thành phần cha mẹ, điều này cho biết nó có chứa các con của bạn:

<div className={`parent ${hasKiddos ? 'has-kiddos' : ''}`}>
    {kiddos.map(kid => <div key={kid.id} />)}
</div>

Và sau đó đơn giản là:

.parent {
    color: #000;
}

.parent.has-kiddos {
    color: red;
}

0

Không có bộ chọn cha mẹ css (và do đó trong bộ tiền xử lý css) do "Các lý do chính khiến Nhóm làm việc CSS trước đây từ chối đề xuất cho bộ chọn cha mẹ có liên quan đến hiệu suất trình duyệt và các vấn đề hiển thị gia tăng."

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.