Bir CSS üst seçici var mı?


3175

Bağlantı <li>elemanının doğrudan üst öğesi olan öğeyi nasıl seçerim?

Örnek olarak, CSS'm şöyle bir şey olurdu:

li < a.active {
    property: value;
}

Açıkçası bunu JavaScript ile yapmanın yolları var, ancak CSS Seviye 2'ye özgü bir çeşit geçici çözüm olduğunu umuyorum.

Stil vermeye çalıştığım menü bir CMS tarafından dışarı atılıyor, bu yüzden aktif öğeyi öğeye taşıyamam <li>...

Herhangi bir fikir?

Yanıtlar:


2532

Şu anda CSS'de bir öğenin üst öğesini seçmenin bir yolu yoktur.

Bunu yapmanın bir yolu olsaydı, mevcut CSS seçici özelliklerinden herhangi birinde olurdu:

Bununla birlikte, Seçiciler Seviye 4 Çalışma Taslağı , :has()bu yeteneği sağlayacak bir sahte sınıf içerir . JQuery uygulamasına benzer olacaktır .

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

Ancak, Mayıs 2020 itibariyle, bu hala herhangi bir tarayıcı tarafından desteklenmemektedir .

Bu arada, bir üst öğe seçmeniz gerekiyorsa JavaScript'e başvurmanız gerekir.


68
Zaten önerilmiş ve reddedilmiş gibi görünüyor: stackoverflow.com/questions/45004/…
RobM

14
Görünüşe göre, konu seçicinin şu !an kullanılması dışında yeniden ziyaret edildiği The subject of the selector can be explicitly identified by appending an exclamation mark (!) to one of the compound selectors in a selector.
görülüyor

13
Başa $eklenen benim için daha iyi görünüyordu ... ekli !daha kolay göz ardı edilebilir.
Christoph

51
Büyük arsa bükümü! Selectors 4 WD, konu göstergesini CSS uygulamaları tarafından kullanılacak hızlı profilden hariç tutmak için bugün güncellendi . Bu değişiklik devam ederse, artık konu göstergesini stil sayfalarında kullanamayacağınız anlamına gelir ( başka bir cevapta açıklanan gibi bir çeşit poli dolgu eklemezseniz ) - bunu yalnızca Seçiciler API'sinde ve her yerde kullanabilirsiniz aksi takdirde profilin tamamı uygulanabilir.
BoltClock

55
Başka bir büyük güncelleme: Görünüşe göre konu seçici sözdizimini tamamen ortadan :has()kaldırmayı ve herkesin jQuery'den tanıdığı ve sevdiği yalancı ile değiştirmeyi düşünüyorlar . En son ED, konu göstergesine yapılan tüm referansları kaldırdı ve yerine :has()sözde değiştirdi . Kesin nedenleri bilmiyorum, ancak CSSWG bir süre önce bir anket düzenledi ve sonuçlar bu kararı etkilemiş olmalı. Büyük olasılıkla jQuery ile uyumluluk içindir (böylece modifikasyon olmadan qSA'dan yararlanabilir) ve konu göstergesi sözdiziminin çok kafa karıştırıcı olduğu kanıtlanmıştır.
BoltClock

152

Ebeveynleri yalnızca CSS'de seçebileceğinizi sanmıyorum.

Ancak zaten bir .activesınıfa sahip olduğunuz gibi , o sınıfı li(yerine a) taşımak daha kolay olacaktır . Her iki erişebilir Bu şekilde live asadece CSS ile.


4
Odaklanabilen bir öğe olmadığı için sözde seçiciyi liste öğesine taşıyamazsınız. : Aktif seçiciyi kullanıyor, bu yüzden çapa aktif olduğunda liste öğesinin etkilenmesini istiyor. Liste öğeleri hiçbir zaman etkin durumda olmaz. Bir yana, böyle bir seçicinin olmaması talihsiz bir durum. Tamamen klavyeye erişilebilmesi için saf bir CSS menüsüne sahip olmak imkansız gibi görünüyor (kardeş seçicileri kullanarak iç içe listeler kullanılarak oluşturulan alt menüleri görünmesini sağlayabilirsiniz, ancak liste odaklandıktan sonra tekrar gizlenir). Bu özel içerik için yalnızca CSS çözümleri varsa

12
@Dominic Aquilina Soruya bir göz atın, OP sahte bir seçici değil, bir sınıf kullanıyor.
jeroen

125

Bu komut dosyasını kullanabilirsiniz :

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

Bu, metin girişinin herhangi bir üst öğesini seçecektir. Ama bekleyin, daha fazlası var. İsterseniz, belirtilen bir üst öğe seçebilirsiniz:

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

Veya etkin olduğunda seçin:

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

Bu HTML'ye göz atın:

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

Bunu seçebilirsiniz span.helpzaman inputetkindir ve bunu göstermek:

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

Daha birçok özellik var; sadece eklentinin belgelerine bakın.

BTW, Internet Explorer'da çalışır.


5
jquery kullanmanın patent()daha hızlı olacağını varsayalım . Ancak bu ihtiyaç testi
Dan

2
@Idered Hiçbir çocuk seçiciye sahip olmayan bir Seçici Konu CSS bildiriminiz olduğunda başarısız olur ( #a!tek başına bir hata atar, #a! pçalışır) ve böylece diğerleri de çalışmaz Uncaught TypeError: Cannot call method 'split' of undefined: jsfiddle.net/HerrSerker/VkVPs
yunzen

3
@HerrSerker Sanırım #a! geçersiz bir seçici, ne seçmeli?
Idered

2
@Idered bilmiyorum. Teknik özellik yasa dışı olduğunu söylemiyor. #a! kendini seçmelidir. En azından JavaScript'te hata olmamalıdır
yunzen

5
Kabul edilen cevap hakkındaki yorumuma göre, çok geçmeden sonra bile çoklu dolgu gerekli olabilir, çünkü konu göstergesi CSS'deki tarayıcılar tarafından asla uygulanamayabilir.
BoltClock

108

Birkaç başka kişinin belirttiği gibi, bir öğenin üst öğelerini yalnızca CSS kullanarak stilize etmenin bir yolu yoktur, ancak aşağıdakiler jQuery ile çalışır :

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

21
<Seçici (jQuery 1.7.1 kullanılarak doğrulandı) yok.
Rob W

6
Belki de <-syntax 2009'da çalıştı ama güncelledim (2013 için).
Alastair

5
Daha da iyisi, jQuery'nin yerleşik kullanmak :has()seçici : $("li:has(a.active)").css("property", "value");. CSS 4'ün önerilen !seçicisine benzer şekilde okur . Ayrıca bakınız: :parentseçici , .parents()yöntem , .parent()yöntem .
Rory O'Kane

7
.css("property", "value")Seçili öğeleri biçimlendirmek için kullanmak yerine , genellikle .addClass("someClass")CSS'nizde .someClass { property: value }( aracılığıyla ) olmanız gerekir . Bu şekilde, stili CSS ve kullandığınız ön işlemcilerin tüm gücüyle not edebilirsiniz.
Rory O'Kane


69

Üst seçici yok; daha önceki kardeş seçici olmadığı gibi. Bu seçicilere sahip olmamanın iyi bir nedeni, tarayıcının bir sınıfın uygulanıp uygulanmayacağını belirlemek için bir öğenin tüm alt öğelerinden geçmesi gerektiğidir. Örneğin, şunu yazdıysanız:

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

Daha sonra tarayıcının </body>, sayfanın kırmızı olup olmayacağını belirlemek için her şeyi yükleyene ve ayrışana kadar beklemesi gerekir.

Neden bir ana seçicimiz yok makalesi ayrıntılı olarak açıklıyor.


11
bu yüzden tarayıcıyı daha hızlı hale getirin. daha hızlı. bu seçiciye kesinlikle ihtiyaç duyulmaktadır ve ne yazık ki uygulamanın nedeni ne yazık ki yavaş, ilkel bir dünyada yaşıyoruz.
vsync

11
aslında, seçici çok hızlı bir tarayıcıyı yavaş gösterecektir.
Salman A

5
Tarayıcı geliştiricilerinin (en azından) javascript sürümü kadar hızlı olan bir uygulama geliştireceğine inanıyorum.
Marc.2377

"Yavaş, ilkel bir dünyada yaşıyoruz" öksürük öksürük yeni elma izle öksürük öksürük
Marvin

@ Marc.2377 Yukarıdaki örneği web sitenizde JS'de denerseniz, asla ziyaret etmeyeceğim. Öte yandan, çoğu zaman sadece yakın çocukları önemsediğinizi söyleyebilirim, bu yüzden sadece yakın çocuklarla sınırlı olsaydı, çok fazla etkisi olmayan iyi bir ek olurdu.
xryl669

54

CSS 2'de bunu yapmanın bir yolu yoktur. Sınıfı ekleyebilir live aşağıdakilere başvurabilirsiniz a:

li.active > a {
    property: value;
}

3
a element display: block yaparak li alanının tamamına uyacak şekilde biçimlendirebilirsiniz. Eğer hangi stili aradığınızı açıklayabilirseniz, belki de bir çözüme yardımcı olabilirim.
Josh

bu aslında basit ve zarif bir çözümdür ve çoğu durumda sınıfı ebeveynin üzerine yerleştirmek mantıklıdır.
Ricardo

35

Geçmek için deneyin aiçin blockekrana ve ardından istediğiniz herhangi bir stil kullanın. aEleman dolduracak lieleman ve istediğiniz gibi kendi görünüşünü değiştirmek mümkün olacak. liDolguyu 0 olarak ayarlamayı unutmayın .

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

31

CSS seçici “ Genel Kardeş Birleştirici ” belki istediğiniz gibi kullanılabilir:

E ~ F {
    property: value;
}

Bu F, öğeden önce gelen herhangi bir öğeyle eşleşir E.


24
Bu sadece kardeş seçici, çocuk değil, ebeveyn ... gerçekten soruya cevap vermiyor dostum
Alireza

26

Bildiğim kadarıyla CSS 2'de değil. CSS 3 daha sağlam seçicilere sahiptir, ancak tüm tarayıcılarda tutarlı bir şekilde uygulanmaz. Geliştirilmiş seçicilerle bile, örnekte belirttiğinizi tam olarak başaracağına inanmıyorum.


24

OP'nin bir CSS çözümü aradığını biliyorum ama jQuery kullanarak başarmak basit. Benim durumumda <ul>alt <span>etikette yer alan bir etiket için üst etiketi bulmam gerekiyordu <li>. jQuery :hasseçiciye sahiptir, bu nedenle içerdiği çocuklar tarafından bir ebeveyni tanımlamak mümkündür:

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

seçecektir ulid ile bir alt öğe içeren öğeyi SomeID . Veya orijinal soruyu cevaplamak için, aşağıdakine benzer bir şey hile yapmalıdır (denenmemiş):

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

3
Veya kullanın $yourSpan.closest("ul")ve span öğenizin üst UL'sini elde edersiniz. Yine de cevabınız tamamen oftopik imho. Tüm CSS etiketli soruları bir jQuery çözümü ile cevaplayabiliriz.
Robin van Baalen

1
Diğer cevaplarda belirtildiği gibi, CSS 2'yi kullanarak bunu yapmanın bir yolu yoktur. Kısıtlama göz önüne alındığında, sağladığım yanıtın etkili olduğunu ve soruyu javascript imho kullanarak cevaplamanın en basit yoludur.
David Clarke

Senin oyların göz önüne alındığında, bazı insanlar seninle aynı fikirde. Ancak tek cevap kabul edilen cevaptır; sade ve basit "istediğiniz şekilde yapılamaz". Eğer soru bir bisiklette 60 km / s hıza nasıl ulaşılacağı ve "basit; arabaya bin ve gaza çarp." Bu yüzden benim yorumum.
Robin van Baalen

1
Bu yaklaşım SO'yu neredeyse tamamen işe yaramaz hale getirecektir. Ben SO sorunları aramak için nasıl "tek cevap" bulmak değil sorunu çözmek için. Bu yüzden SO çok harika, çünkü her zaman bir kediyi ciltlemek için birden fazla yol var.
David Clarke

23

Yalancı öğe :focus-within, bir alçağın odağı varsa bir üst öğenin seçilmesini sağlar.

Bir öğe, tabindexözniteliği varsa odaklanabilir .

Odaklanma için tarayıcı desteği

tabindex

Misal

.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
Benim durumumda bu iyi çalışıyor, teşekkürler! Sadece bir değil, örnek, kardeşi değil, ebeveyne değiştirirseniz, bunun daha basit .color:focus-within .changeolması gerekir .color:focus-within. Benim durumumda aktif olduğunda çocuklara sınıf eklemek bootstrap nav-bar kullanıyorum ve üst .nav-bar için bir sınıf eklemek istiyorum. Ben bu biçimlendirme kendi oldukça ortak bir senaryo olduğunu düşünüyorum ama bileşen css + js bootstrap (veya diğer) bu yüzden davranış değiştiremezsiniz. Tabindex ekleyebilir ve bu css kullanabilirsiniz rağmen. Teşekkürler!
cancerbero

22

Bu, Seçiciler 4. Düzey spesifikasyonunun en çok tartışılan yönüdür . Bununla, bir seçici verilen seçiciden (!) Sonra bir ünlem işareti kullanarak bir öğeyi çocuğuna göre şekillendirebilecektir.

Örneğin:

body! a:hover{
   background: red;
}

kullanıcı herhangi bir tutturucunun üzerine gelirse kırmızı bir arka plan rengi ayarlar.

Ancak tarayıcıların uygulanmasını beklemek zorundayız :(


21

Üst öğe olarak köprü kullanmayı ve ardından fareyle üzerine gelindiğinde iç öğeleri değiştirmeyi deneyebilirsiniz. Bunun gibi:

a.active h1 {color:red;}

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

a.active h2 {color:blue;}

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

Bu şekilde, üst öğenin üzerine gelmeye bağlı olarak stili birden çok iç etikette değiştirebilirsiniz.


1
Bu doğrudur, ancak aXHTML standartlarına uymak istiyorsanız etiket içindeki biçimlendirme kodunu yalnızca belirli öğelerle sınırlar . Örneğin , şemayı ihlal ettiğine dair bir uyarı almadan diviçeride kullanamazsınız a.
Ivaylo Slavov

2
Tamamen doğru Ivaylo! "a", blok olmayan bir öğedir, bu nedenle içinde blok öğeleri kullanamazsınız.
riverstorm

1
HTML5'te blok öğelerini bağlantıların içine koymak son derece iyidir.
Matthew James Taylor

2
... anlamsal olarak yanlış olsaydı, HTML5'te daha önce olmadığı yere izin vermezlerdi.
BoltClock

14

Şu anda ebeveyn seçici yoktur ve W3C'nin görüşmelerinde tartışılmamaktadır. İhtiyacımız olup olmadığını anlamak için CSS'nin tarayıcı tarafından nasıl değerlendirildiğini anlamanız gerekir.

Burada çok fazla teknik açıklama var.

Jonathan Snook, CSS'nin nasıl değerlendirildiğini açıklıyor .

Chris Coyier, Veli seçici görüşmeleri hakkında .

Harry Roberts yine verimli CSS seçicileri yazma konusunda .

Ancak Nicole Sullivan'ın olumlu eğilimler hakkında bazı ilginç gerçekleri var .

Bu insanların hepsi ön uç geliştirme alanında birinci sınıftır.


12
needSpec diğer faktörler tarafından karar verilir içinde olmasını ister, web geliştiricilerin gereksinimleri tarafından tanımlanır.
nicodemus13

14

Yatay menü için sadece bir fikir ...

HTML'nin bir parçası

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

CSS'nin bir parçası

/* 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%; }

Güncellenmiş demo ve kodun geri kalanı

Metin girişleriyle nasıl kullanılacağıyla ilgili başka bir örnek - üst alan kümesini seçin


3
Bunu ana seçici kullanım durumlarının bazılarına / çoğuna / çoğuna nasıl genelleştirmeyi kastettiğiniz, hatta bu CSS'nin hangi bölümlerinin ne yaptığını tam olarak açıklamam. Ayrıntılı bir açıklama ekleyebilir misiniz?
Nathan Tuggy

2
Bunu gerçek dünya senaryolarına uygulamaya çalışmadım, bu yüzden "Üretim için değil" diyorum. Ama bence sadece sabit genişlikli 2 seviyeli menüye uygulanabilir. "bu CSS'nin hangi bölümlerinin ne yaptığını" - .test-kardeş burada aslında ana öğenin (CSS'nin son satırı) arka planıdır.
Ilya B.

2
Açıklama eklendi ("ANA BÖLÜM" den başlayarak jsfiddle'ın css bölümü) ... Ve yanılmışım - herhangi bir sayıda alt seviye olabilir.
Ilya B.

13

İşte kullanarak kesmek pointer-eventsile 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

CSS'yi, web siteleri tasarlarken gerçekten yardımcı olabilecek bazı standart olmayan özellikleri içerecek şekilde genişleten bir eklenti var. Buna EQCSS deniyor .

EQCSS'nin eklediği şeylerden biri bir üst seçici. Internet Explorer 8 ve sonraki tüm tarayıcılarda çalışır. İşte format:

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

Burada her öğede bir öğe sorgusu açtık a.activeve bu sorgunun içindeki stiller $parentiçin mantıklı gibi şeyler var, çünkü bir referans noktası var. Tarayıcı üst öğeyi bulabilir, çünkü parentNodeJavaScript'te çok benzer .

İşte bir demo$parent ve başka $parentInternet Explorer 8'de eserler olduğunu demo yanı sıra durumda bir ekran görüntüsü sizinle teste etrafında Internet Explorer 8'i yok .

EQCSS ayrıca meta seçiciler içerir : $prevseçili öğeden önceki öğe için ve $thisyalnızca öğe sorgusuyla eşleşen öğeler ve daha fazlası.


11

Şimdi 2019 ve CSS Yerleştirme Modülünün son taslağında aslında böyle bir şey var. Tanıtımı @nestat-kurallar.

3.2. Yuva Atma Kuralı: @nest

Doğrudan yuvalama güzel görünse de, biraz kırılgan. .Foo & gibi bazı geçerli iç içe yerleştirme seçicilerine izin verilmez ve seçiciyi belirli şekillerde düzenlemek kuralı beklenmedik şekilde geçersiz kılabilir. Ayrıca, bazı insanlar yuvalamayı görsel olarak çevredeki beyanlardan ayırt etmekte zorlanıyor.

Tüm bu sorunlara yardımcı olmak için, bu belirtim, stil kurallarını geçerli şekilde yerleştirme konusunda daha az kısıtlama getiren @nest kuralını tanımlar. Sözdizimi:

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

@Nest kuralı bir stil kuralıyla aynı şekilde çalışır: bir seçiciyle başlar ve seçicinin eşleştiği öğelere uygulanan bildirimler içerir. Tek fark, @nest kuralında kullanılan seçicinin yuva içermesi gerektiğidir, bu da bir yerde iç içe yerleştirme seçici içerdiği anlamına gelir. Bireysel karmaşık seçicilerin tümü yuva içeriyorsa, bir seçici listesi yuva içerir.

(Yukarıdaki URL'den kopyalayıp yapıştırın).

Bu şartname kapsamındaki geçerli seçicilere örnek:

.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

Teknik olarak bunu yapmanın doğrudan bir yolu yoktur. Ancak, bunu jQuery veya JavaScript ile çözebilirsiniz.

Ancak, bunun gibi bir şey de yapabilirsiniz.

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

jQuery

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

Bunu jQuery kullanarak başarmak istiyorsanız, burada jQuery üst seçici için referans verilmiştir .


9

W3C, tarayıcı üzerindeki büyük performans etkisi nedeniyle böyle bir seçiciyi hariç tuttu.


27
yanlış. çünkü DOM bir ağaçtır, çocuğa gelmeden önce ebeveynlere gitmeleri gerekir, bu yüzden sadece bir düğüme geri dönün. oo
NullVoxPopuli

9
CSS seçicileri bir kuyruktur, bu nedenle belge sırası XPath veya DOM hiyerarşisi yerine değerlendirme sırası değerlendirilir.
Paul Sweatte

3
@rgb En azından bize söyledikleri buydu.
yunzen

9

Kısa cevap HAYIR ; parent selectorCSS'de bu aşamada a yok , ancak yine de öğeleri veya sınıfları değiştirmek zorunda kalmazsanız, ikinci seçenek JavaScript kullanıyor. Bunun gibi bir şey:

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;
  }
});

Veya uygulamanızda jQuery kullanıyorsanız daha kısa bir yol :

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

5

Şu anda standart CSS'de ebeveyn seçici olmamasına rağmen , 7 yeni seçiciden her ikisini de içeren ax (yani Artırılmış CSS Seçici Sözdizimi / ACSSSS ) adlı (kişisel) bir proje üzerinde çalışıyorum :

  1. Bir hemen üst seçici <(ters seçim sağlar >)
  2. Bir herhangi bir soy seçme ^ (ters seçim sağlar [SPACE])

balta şu anda nispeten erken bir BETA gelişme aşamasındadır.

Burada bir demo izleyin:

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

(soldaki iki listeyi standart seçicilerle ve sağdaki iki listeyi balta seçicilerle karşılaştırın)


3
Proje şu anda erken bir Beta aşamasındadır. Daha <script src="https://rouninmedia.github.io/axe/axe.js"></script>önce html belgenizin sonuna ekleyerek (en azından şu anda) CSS stillerinizdeki balta seçicileri etkinleştirebilirsiniz </body>.
Rounin

4

En azından CSS 3 dahil ve bu şekilde seçemezsiniz. Ancak günümüzde JavaScript'te oldukça kolay bir şekilde yapılabilir, sadece biraz vanilya JavaScript eklemeniz gerekir, kodun oldukça kısa olduğuna dikkat edin.

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

Herhangi bir fikir?

CSS 4, geriye doğru yürümeye bazı kancalar eklerse fantezi olur . O zamana kadar (gerçi mümkündür değil tavsiye) kullanmak için ve / veya s için kırmak da CSS normal kapsamı dışında çalışmasına izin şeyler bağlandığından emin zamanki şekilde ve bu yoluyla ...checkboxradio input

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

... oldukça Brüt , ama dokunma ve yeniden dokunmatik şey mümkündür ama sadece CSS ile ve HTML bodyve :roothemen her yerden bağlayarak idve forözelliklerini radio/ checkbox inputs ve label tetikleyiciler ; muhtemelen birisi bir noktada bunlara nasıl dokunacağınızı gösterecektir.

Ek bir uyarı, sadece belirli bir kullanımdan sadece birinin kullanılması, ilk olarak / başka bir deyişle geçişli bir durum kazanmasıdır ... Ancak, birden çok etiketin hepsi aynı işaret edebilir , ancak bu hem HTML hem de CSS'nin daha kaba görünmesini sağlar.inputidcheckboxradio input


... CSS Seviye 2'ye özgü bir çeşit geçici çözüm olduğunu umuyorum ...

Diğer :seçicilerden emin değilim , ancak :checkedCSS öncesi 3 için. Doğru hatırlıyorsam [checked], yukarıdaki kodda bulabileceğiniz gibi bir şeydi , örneğin,

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

... ama ::afterve bunun gibi şeyler için :hover, ilk olarak hangi CSS sürümünün göründüğünden emin değilim.

Tüm bunlar, lütfen bunu asla üretimde kullanmayın, öfkeyle bile değil. Şaka olarak emin olun veya başka bir deyişle bir şey sırf edebilirsiniz yapılması her zaman anlamına gelmez gerekir .


3

Hayır, yalnızca CSS'de üst öğeyi seçemezsiniz.

Ancak zaten bir .activesınıfa sahip olduğunuz gibi , o sınıfı li(yerine a) taşımak daha kolay olacaktır . Her iki erişebilir Bu şekilde live asadece CSS ile.


1

Üst öğeyi temel alan üst öğeyi değiştirmek şu anda yalnızca <input>üst öğenin içinde bir öğemiz olduğunda gerçekleşebilir . Bir giriş odaklandığında, karşılık gelen üst öğe CSS kullanılarak etkilenebilir.

Aşağıdaki örnek :focus-withinCSS'de kullanımınızı anlamanıza yardımcı olacaktır .

.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

Sass'daki ve işareti ile mümkündür :

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

CSS çıkışı:

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

2
bu doğrudur, ancak seçiciyi önceden biliyorsanız.
Shahar

11
Bu mu değil seçmek h3gol oldu 'ın ebeveyni. Bu h3soyundan gelenleri seçer .some-parent-selector.
Jacob Ford

1

Bunu yapmak için bir JavaScript kodu tutardım. Örneğin, bir dizi üzerinden yinelediğinizde React'a, üst bileşene alt öğelerinizi içerdiğini belirten başka bir sınıf ekleyin:

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

Ve sonra basitçe:

.parent {
    color: #000;
}

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

0

"CSS Çalışma Grubu'nun daha önce üst seçiciler için önerileri reddetmesinin başlıca nedenleri, tarayıcı performansı ve artımlı oluşturma sorunlarıyla ilgilidir."

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.