Как применить эффект наведения мыши к двум наложенным изображениям?

У меня есть два изображения в одном div, одно над другим. Я хочу, чтобы эффект наведения мыши применялся к обоим изображениям, когда я навожу указатель мыши на изображение, а фоновое изображение будет отображаться с эффектом масштабирования. Но я обнаружил, что на наведение реагирует только тот, что сверху. Можно ли как-нибудь позволить обоим изображениям меняться одновременно?

<div class = "overlay transparent" onmousemove = "zoom(event)"
  style = "background-image: url(https://i.pinimg.com/originals/2b/de/de/2bdede0647e3cdf75b44ea33723201d9.jpg)">
  <img src = "https://i.pinimg.com/originals/2b/de/de/2bdede0647e3cdf75b44ea33723201d9.jpg" />
  <img src = "https://media.nomadicmatt.com/2023/tropicalislandsfeature.jpg" />
</div>

<style>
  div.transparent {
    height: 150px;
    width: 250px;
    overflow: hidden;
    cursor: zoom-in;
  }

  div.transparent img:hover {
    opacity: 0;
  }

  div.transparent img {
    transition: opacity 0.5s;
    display: block;
    width: 100%;
  }

  div.overlay {
    position: relative;
    display: inline-block;
  }

  div.overlay img:nth-child(1) {
    position: relative;
    object-fit: contain;
    z-index: 1;
  }

  div.overlay img:nth-child(2) {
    position: absolute;
    object-fit: contain;
    top: 0;
    left: 0;
    z-index: 2;
  }
</style>

<script>
 function zoom(e) {
            var zoomer = e.currentTarget;
            e.offsetX ? offsetX = e.offsetX : offsetX = e.touches[0].pageX
            e.offsetY ? offsetY = e.offsetY : offsetX = e.touches[0].pageX
            x = offsetX / zoomer.offsetWidth * 100
            y = offsetY / zoomer.offsetHeight * 100
            zoomer.style.backgroundPosition = x + '% ' + y + '%';
        }
</script>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать псевдокласс :has.

Обновлено: в этом случае вы можете использовать только псевдокласс :hover.

<div class = "overlay transparent" style = "background-image: url(https://i.pinimg.com/originals/2b/de/de/2bdede0647e3cdf75b44ea33723201d9.jpg)">
  <img src = "https://i.pinimg.com/originals/2b/de/de/2bdede0647e3cdf75b44ea33723201d9.jpg" />
  <img src = "https://media.nomadicmatt.com/2023/tropicalislandsfeature.jpg" />
</div>

<style>
  div.transparent {
    height: 150px;
    width: 250px;
    overflow: hidden;
  }
  
  /*  div.transparent:has(img:hover) img{*/
  div.transparent:hover img{
    opacity: 0;
  }
  
  div.transparent img {
    display: block;
    width: 100%;
    transition: opacity 0.5s;
  }
  
  div.overlay {
    position: relative;
    display: inline-block;
  }
  
  div.overlay img:nth-child(1) {
    position: relative;
    object-fit: contain;
    z-index: 1;
  }
  
  div.overlay img:nth-child(2) {
    position: absolute;
    object-fit: contain;
    top: 0;
    left: 0;
    z-index: 2;
  }
</style>

Привет, спасибо за ваш ответ! Я должен был опубликовать свою полную функцию. На самом деле я хочу скрыть два изображения, а затем отобразить фоновое изображение, используя :has, чтобы фоновое изображение тоже исчезло. Я обновил свой код, чтобы показать, чего именно я хочу достичь.

SamTest 06.04.2024 02:58

@SamTest нет проблем, код обновлен

SioGabx 06.04.2024 03:03

Эффекты при наведении возникают, когда вы наводите курсор на элемент, и я вижу, что вы поместили псевдокласс :hover в элемент <img />. Поскольку вы наложили один элемент img на другой, ваша мышь распознает элемент сверху (с большим z-индексом), как только вы наводите на него курсор, оставляя элемент позади нетронутым. Если вы хотите добиться результата, при котором в этом случае на оба изображения будет воздействовать эффект наведения, рассмотрите возможность добавления псевдо- :hover к родительскому элементу div, а затем внесите изменения при наведении на изображения.

 

 <div class = "overlay transparent">
   <img src = "https://i.pinimg.com/originals/2b/de/de/2bdede0647e3cdf75b44ea33723201d9.jpg" />
          <img src = "https://media.nomadicmatt.com/2023/tropicalislandsfeature.jpg" />
 </div>
    
        <style>
          div.transparent {
            height: 150px;
            width: 250px;
            overflow: hidden;
            background-color:red;
          }
    
          div.transparent:hover{
    img {
            opacity: 0;
          }
    } 
    
          div.transparent img {
            transition: opacity 0.5s;
            display: block;
            width: 100%;
          }
    
          div.overlay {
            position: relative;
            display: inline-block;
          }
    
          div.overlay img:nth-child(1) {
            position: relative;
            object-fit: contain;
            z-index: 1;
          }
    
          div.overlay img:nth-child(2) {
            position: absolute;
            object-fit: contain;
            top: 0;
            left: 0;
            z-index: 2;
          }
        </style>
    
    

Привет, спасибо за ваш ответ! Я должен был опубликовать свою полную функцию. На самом деле я хочу скрыть два изображения, а затем отобразить фоновое изображение, установка прозрачности div приведет к исчезновению фонового изображения. Я обновил свой код.

SamTest 06.04.2024 02:58

ну да, вам не нужно делать div прозрачным, если вы хотите, чтобы фоновое изображение отображалось, поскольку оно все еще является частью div. но вы можете добавить в div псевдокласс :hover и указать элементы внутри него, для которых вы хотите изменить стиль.

Biggkodes 06.04.2024 03:06

Спасибо! Я думаю, что @SioGabx - более элегантный подход :)

SamTest 06.04.2024 03:08

Другие вопросы по теме