Bir alt öğeyi gezdirirken üst öğeye nasıl stil uygulanır?


160

Bir CSS üst seçici bulunmadığını biliyorum , ancak böyle bir seçici olmadan bir alt öğeyi gezdirirken bir ebeveynlik öğesinin stilini ayarlamak mümkün mü?

Örnek vermek için: üzerine geldiğinde silinmek üzere olan öğeyi vurgulayacak bir silme düğmesini düşünün :

<div>
    <p>Lorem ipsum ...</p>
    <button>Delete</button>
</div>

Saf CSS ile, fare düğmenin üzerindeyken bu bölümün arka plan rengini nasıl değiştirebilirim?



Yanıtlar:


134

Bu soru daha önce birçok kez sorulur ve kısa tipik cevap şudur: Saf CSS ile yapılamaz. Adında : Basamaklı Stil Sayfaları , yukarı değil, yalnızca basamaklı yönde stili destekler.

Ancak bu etkinin istendiği çoğu durumda, verilen örnekte olduğu gibi, istenen etkiye ulaşmak için bu basamaklı özellikleri kullanma olasılığı hala vardır. Şu sözde işaretlemeyi düşünün:

<parent>
    <sibling></sibling>
    <child></child>
</parent>

Hile, kardeşe ebeveynle aynı boyutta ve pozisyon vermek ve ebeveyn yerine kardeşe stil vermektir. Bu ebeveynin tarzı gibi görünecek!

Şimdi, kardeşi nasıl şekillendirirsiniz?

Çocuk üzerine geldiğinde, ebeveyn de öyle, ama kardeş değil. Aynı şey kardeş için de geçerli. Bu, kardeşi şekillendirmek için üç olası CSS seçici yolunda sona erer:

parent sibling { }
parent sibling:hover { }
parent:hover sibling { }

Bu farklı yollar bazı güzel olasılıklara izin verir. Örneğin, sorudaki örnek üzerinde bu hileyi açığa çıkarmak, bu kemanla sonuçlanır :

div {position: relative}
div:hover {background: salmon}
div p:hover {background: white}
div p {padding-bottom: 26px}
div button {position: absolute; bottom: 0}

Stil üst resmi örneği

Açıkçası, çoğu durumda bu hile, kardeşe ebeveynle aynı boyutta vermek için mutlak konumlandırma kullanımına bağlıdır ve yine de çocuğun ebeveyn içinde görünmesine izin verir.

Bazen , bir ağaç menüsünde hile defalarca uygulayan bu kemanda gösterildiği gibi, belirli bir elemanı seçmek için daha nitelikli bir seçici yol kullanmak gerekir . Gerçekten çok güzel.


1
Bu, vurgulamak için iyidir, ancak yazı tipi rengini değiştirmeyi denerseniz işe yaramaz, doğru mu?
Jahanzeb Khan

1
@JahanzebKhan Yazı tipi rengini değiştirmek sorun değil .
NGLN

117

Ben eski bir soru olduğunu biliyorum, ama ben sadece sahte bir çocuk (ama bir yalancı sarıcı) olmadan bunu başardı.

Hiçbir birlikte olmak ebeveyn ayarlarsanız pointer-eventsve sonra bir çocuk divile pointer-eventssetine auto, çalışıyor :)
o Not <img>(örneğin) etiket hile yapmaz.
Ayrıca ayarlamayı unutmayın pointer-eventsiçin autokendi olay dinleyicisi var veya başka bir şekilde onların tıklama işlevselliğini kaybeder diğer çocuklar için.

div.parent {  
    pointer-events: none;
}

div.child {
    pointer-events: auto;
}

div.parent:hover {
    background: yellow;
}    
<div class="parent">
  parent - you can hover over here and it won't trigger
  <div class="child">hover over the child instead!</div>
</div>

Düzenleme:
As Gölge Sihirbazı lütfen dikkat çekti: Aşağıda IE10 ve bu olmaz işi söz değer. (Eski FF ve Chrome sürümleri de buraya bakın )


3
Bu söz IE10 ve altı için işe yaramaz. (FF ve Chrome'un eski sürümleri de buraya bakın )
Gölge Sihirbazı Sizin İçin

2
İşaretçi olaylarını yok olarak ayarlamak, o öğedeki olay dinleyicilerinin çalışmadığı anlamına gelir ..!
rhazen

1
@rhazen kesinlikle haklısın. Deneyimlerime göre bu kullanım genellikle tek bir tıklama alanına / öğesine bağlıdır, bu nedenle ana
öğeye

İki seviyeli ebeveynim, çocuğum1 ve çocuğumun1 çocuğum varsa. Ebeveyne pointer olayları ve çocuğa otomatik pointer olayları ekledim. 1. çocuğun çocuğu dışında 1. çocuğa gitmek istiyorum. Burada demo: codepen.io/lion5893/pen/WNQgyVx
Nam Lê Quý

13

Başka bir, daha basit bir yaklaşım (eski bir soruya) ..
öğeleri kardeş olarak yerleştirmek ve kullanmak olacaktır:

Bitişik Kardeş Seçici ( +) veya Genel Kardeş Seçici ( ~)

<div id="parent">
  <!-- control should come before the target... think "cascading" ! -->
  <button id="control">Hover Me!</button>
  <div id="target">I'm hovered too!</div>
</div>
#parent {
  position: relative;
  height: 100px;
}

/* Move button control to bottom. */
#control {
  position: absolute;
  bottom: 0;
}

#control:hover ~ #target {
  background: red;
}

resim açıklamasını buraya girin

Demo Keman burada .


1
Bu sadece işe yaradığını kaydetmeye değer #targets DOM #control sonra gelir (yani önceki kardeşleri etkileyemez, sadece kardeşleri takip edemez)
Gio

10

seçilen bir alt öğenin üst öğesini seçmek için hiçbir CSS seçici yoktur.

JavaScript ile yapabilirsin


3
doğru. $ (child) .hover (function () {$ (this) .closest (parentSelector) .addClass ('hoverClass')}, function () {$ (this) .closest (parentSelector) .removeClass ('hoverClass' )});
Aamir Afridi

8
@AamirAfridi Bu saf JS değil, bununla jQuery kullanmak zorunda.
Ivotje50

6

Daha önce de belirtildiği gibi "seçilen bir çocuğun üst öğesini seçmek için CSS seçici yok".

Yani siz de:


Javascript / jQuery çözümü için örnek

Javascript tarafında:

$('#my-id-selector-00').on('mouseover', function(){
  $(this).parent().addClass('is-hover');
}).on('mouseout', function(){
  $(this).parent().removeClass('is-hover');
})

Ve CSS tarafında, şöyle bir şey olurdu:

.is-hover {
  background-color: red;
}

3

Bu çözüm tamamen tasarıma bağlıdır, ancak bir çocuğu tutarken arka planını değiştirmek istediğiniz bir üst div öğeniz varsa, üst öğeyi ::after/ ile taklit etmeye çalışabilirsiniz ::before.

<div class="item">
    design <span class="icon-cross">x</span>
</div>

CSS:

.item {
    background: blue;
    border-radius: 10px;
    position: relative;
    z-index: 1;
}
.item span.icon-cross:hover::after {
    background: DodgerBlue;
    border-radius: 10px;
    display: block;
    position: absolute;
    z-index: -1;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    content: "";
}

Burada tam bir keman örneğine bakın


-1

Saf bir css çözümüne ihtiyaç duymayanlar için basit bir jquery çözümü:

    $(".letter").hover(function() {
      $(this).closest("#word").toggleClass("hovered")
    });
.hovered {
  background-color: lightblue;
}

.letter {
  margin: 20px;
  background: lightgray;
}

.letter:hover {
  background: grey;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="word">
  <div class="letter">T</div>
  <div class="letter">E</div>
  <div class="letter">S</div>
  <div class="letter">T</div>
</div>


-8

Sass'ta bunu yapmak son derece kolaydır! Bunun için JavaScript'i araştırmayın. Sass'taki & seçici tam olarak bunu yapar.

http://thesassway.com/intermediate/referencing-parent-selectors-using-ampersand


6
-1 Sass css'e daha fazla işlevsellik eklemez, sadece yazmayı kolaylaştırır. Sass'ta yapabileceğiniz her şey css ve tersi olarak yapılabilir.
Dastur

3
@Dastur Değişkenler ve mixinler göz önüne alındığında, Sass'ın CSS'ye çok şey kattığını söyleyebilirim. Her şeyi CSS'de yapabilirsiniz, aynı şekilde eski C'yi kullanarak gelişmiş yazılımlar yazabilirsiniz. Modern diller, daha önce yapılamayan bir şeyi etkinleştirmeden çok şey ekler. Sass ve CSS ile aynı.
Cobus Kruger

6
@Cobus Kruger Kısmen haklısınız, ancak bu karşılaştırmayı yapamazsınız. C ++ c # ve javascript gibi diller C tabanlı olsa da, çalışma zamanından önce C'ye dönüşmezler. Sass, çalışma zamanından önce css'e dönüştürülür, bu yüzden asla bir cass stil sayfasını yüklemezsiniz, sadece bir css.
Dastur
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.