Изменить цвет элементов родственного элемента при наведении курсора, используя CSS

Ниже мой HTML

<h1>Heading</h1>
<a class="button" href="#"></a>

Что я хочу сделать, это когда я парю <a> тег, я хочу изменить цвет <h1> помечать чисто с помощью CSS. Как мне этого добиться?

PS ----- * Отредактировано * ----------

Что если я оберну вокруг него div с идентификатором?

<div id="banner">
    <h1>Heading</h1>
    <a class="button" href="#"></a>
</div>

Это поможет?

11 ответов

Решение

Не существует селектора CSS, который может это сделать (даже в CSS3). Элементы в CSS никогда не знают своего родителя, поэтому вы не можете a:parent h1 (например). Они также не знают своих братьев и сестер (в большинстве случаев), поэтому вы не можете сделать #container a:hover { /* do something with sibling h1 */ }, По сути, свойства CSS не могут изменять ничего, кроме элементов и их дочерних элементов (они не могут получить доступ к родителям или братьям и сестрам).

Вы могли бы содержать h1 в пределах a, но это сделало бы ваш h1 также

Вы сможете достичь этого только с помощью JavaScript ( подтверждение концепции jsFiddle). Это будет выглядеть примерно так:

$("a.button").hover(function() {
    $(this).siblings("h1").addClass("your_color_class");
}, function() {
    $(this).siblings("h1").removeClass("your_color_class");
});

Вы можете сделать брата, который следует за изменением элемента, когда этот элемент наведен, например, вы можете изменить цвет вашего a ссылка, когда h1 завис, но вы не можете повлиять на предыдущего брата таким же образом.

h1 {
    color: #4fa04f;
}
h1 + a {
    color: #a04f4f;
}
h1:hover + a {
    color: #4f4fd0;
}
a:hover + h1 {
    background-color: #444;
}
<h1>Heading</h1>
<a class="button" href="#">The &quot;Button&quot;</a>
<h1>Another Heading</h1>

Мы устанавливаем цвет H1 на зеленоватый оттенок, а цвет A, который является родным H! красноватый (первые 2 правила). Третье правило делает то, что я описываю - изменяет цвет A, когда H1 зависает.

Но обратите внимание на четвертое правило a:hover h1 изменяет только цвет фона H1, который следует за якорем, но не тот, который предшествует ему.

HTML:

<div id="banner">
    <h1>Heading</h1>
    <a class="button" href="#">link</a>
</div>​

CSS:

​#banner:hover h1 {
    color: red;
}

#banner h1:hover {
    color: black;
}

a {
    position: absolute;
}

Скрипка: http://jsfiddle.net/joplomacedo/77mqZ/

a элемент абсолютно позиционирован. Может не быть идеальным для вашей существующей структуры. Дайте мне знать, я могу найти обходной путь.

Прежде всего, я использую stackru много лет и хочу поблагодарить вас всех за прекрасные ответы и помощь. Однако пришло время зарегистрироваться и предложить свою помощь кому-то, кто борется с этим, даже если этот вопрос довольно старый:

Это действительно возможно с помощью всего лишь нескольких строк CSS и некоторого базового понимания Flexbox. Как сказал Стивен П. в своем ответе, комбинатор соседних братьев и сестер выбирает сразу следующих братьев и сестер. Чтобы добиться того, о чем просил OP, вы можете использовать два гибких подхода:

Подход 1 ( с использованием сокращенного свойства "flex-flow")

         .flex-parent {
  display: flex;
  flex-flow: column-reverse wrap
}

.flex-child-1:hover + .flex-child-2 {
  color: #FF3333;
}
         <div class="flex-parent">
    <a class="flex-child-1">Hover me</a>  
    <h1 class="flex-child-2">I am changing color</h1>
</div>

Подход 2 ( с использованием свойства "порядок" и нескольких дочерних элементов)

         .flex-parent {
  display: flex;
  flex-direction: column;
}

.flex-child-1 {
  order: 2;
}

.flex-child-2 {
  order: 1;
}

.flex-child-3 {
  order: 3;
}

.flex-child-1:hover+.flex-child-2 {
  color: #FF3333;
}
         <div class="flex-parent">
  <h1 class="flex-child-3">I am not changing color</h1>
  <a class="flex-child-1">Hover me</a>
  <h1 class="flex-child-2">I am changing color</h1>
</div>

Бонус:

Бонус CodePen

Попробуйте это однострочное решение на чистом CSS:

      .parent:hover .child:not(:hover) {
  /* this style affects all the children *except* the one you're hovering over */
  color: red;
}

Подробнее здесь: https://codyhouse.co/nuggets/styling-siblings-on-hover

http://plnkr.co/edit/j5kGIav1E1VMf87t9zjK?p=preview

<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
    <script src="script.js"></script>
    <style>
      ul:hover > li
      {
        opacity: 0.5;
      }
      ul:hover li:hover 
      {
        opacity: 1;
      }
    </style>
  </head>

  <body>
    <h1>Hello Plunker!</h1>
    <ul>
      <li>Hello</li>
      <li>Hello</li>
      <li>Hello</li>
      <li>Hello</li>
      <li>Hello</li>
    </ul>
  </body>

</html>

Вот пример, как это можно сделать в чистом CSS, надеюсь, это кому-нибудь поможет

Кто-то помог мне с этим, поэтому я подумал, что тоже поделюсь здесь.

В вашем первом примере это действительно невозможно с чистым CSS. Однако, когда вы оборачиваете его родительским контейнером, у вас появляется возможность делать кучу вещей с зависающими дочерними элементами.

         #banner:hover>h1{
  color:red;
}
h1:hover{
  color:black !important;
}
#banner{
  display:inline-block;
}
.button{
  display:inline-block;
  font-size:24px;
  width:100%;
  border:1px solid black;
  text-align:center;
}
h1{
  padding:0;
  margin:0;
}
         <div id="banner">
    <h1>Heading</h1>
    <a class="button" href="#">Button!</a>
</div>

Родитель просто контролирует детей, которые в данный момент не зависают. Затем вы можете установить состояния при наведении курсора для отдельных элементов и классов, чтобы сделать выбор родственных объектов возможным без JS.

Вот более сложный пример этого в действии

https://codepen.io/levyA/pen/gOrdaLJ

Вот решение, которое я реализовал, чтобы получить поведение, показанное в прикрепленном .gif.

CSS:

      .features-container:has(.feature-card:hover) .feature-card {
    opacity: 0.25;
}

.feature-card:hover {
    opacity: 1 !important;
    transform: scale(105%);
    filter: drop-shadow(1px 1px 10px rgba(255, 255, 255, 0.25));
}

HTML:

      <div class="features-container">
      <div
        onclick="window.location.href='/branding.html'"
        class="feature-card"
      >
        <img src="/assets/home-page/1_Tyson.jpg" alt="Mike Tyson Flexing" />
        <h2>Branding</h2>
      </div>

      <div
        onclick="window.location.href='/design.html'"
        class="feature-card"
      >
        <img
          src="/assets/home-page/2_Design.jpg"
          alt="Mike Tyson Flexing"
        />
        <h2>Design</h2>
      </div>
      <div
        onclick="window.location.href='/automotive.html'"
        class="feature-card"
      >
        <img
          src="/assets/home-page/3_Automotive.jpg"
          alt="Mike Tyson Flexing"
        />
        <h2>Automotive</h2>
      </div>
      <div onclick="window.location.href='/art.html'" class="feature-card">
        <img src="/assets/home-page/4_Art.jpg" alt="Mike Tyson Flexing" />
        <h2>Art</h2>
      </div>
      <div onclick="window.location.href='/more.html'" class="feature-card">
        <img
          src="/assets/home-page/5_Special_Services.jpg"
          alt="Mike Tyson Flexing"
        />
        <h2>More</h2>
      </div>
    </div>

Короче говоря, мы хотим сначала подтвердить, что наш контейнер ( в данном случае .features-container ) ИМЕЕТ наведенный элемент. Если да, уменьшите непрозрачность класса .feature-card .

Однако, поскольку CSS применяет наши правила по порядку, наше следующее правило переопределит непрозрачность 0,25 для конкретного элемента, над которым мы наводим курсор. Примечание. В данном конкретном случае мы должны использовать !important, чтобы переопределить ранее установленное правило непрозрачности.

Опять же, взгляните на прикрепленный GIF-файл, чтобы увидеть хороший пример того, что здесь происходит. Этого, конечно, можно добиться с помощью JS, но зачем это делать, если CSS предоставляет гораздо более простое решение?

Пример выделения при наведении

Измените тег H1 на ссылку, возможно, стилизуйте его так же, как обычный текст? И затем используйте это,

a:link {color:#FF0000;}      
a:hover {color:#FF00FF;}

И это должно работать, когда вы наводите курсор:), вы также можете сделать его конкретным, поместив его в элемент div, а затем нацелив его так:

.exampledivname a:link {color:#FF0000;}      
.exampledivname a:hover {color:#FF00FF;}

Это должно помочь.

Это может сработать, недавно я использовал эту идею, чтобы остановить элементы-братья в анимации.

h1 { color: inherit; }

#banner:hover { color: your choice; }
   

Для заданных стилей в родственных элементах вы можете использовать символ ~ в первом случае, когда h1 зависает, установить цвет для тега, а во втором случае, когда наведен курсор, изменить цвет фона раздела h1

h1:hover ~ a {
    color: #e34423;
}
a:hover ~ h1 {
    background-color: #eee;
}
Другие вопросы по тегам