JQuery addClass только для следующего определенного элемента - не все на странице

Я использую jQuery для анимации скрытого элемента (описания изображения), чтобы он отображался при наведении курсора на изображение.

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

Я пытался заставить $(this) и next() работать, не полностью понимая, как это работает.

var item = $('p.image-description');

$('.popup-image').hover(
    function () {
        item.addClass('is-visible');

        setTimeout(function () {
            item.addClass('is-open');
        }, 20);
    },
    function () {
        item.removeClass('is-open');

        item.one('transitionend', function (e) {
            item.removeClass('is-visible');
        });
    }
);
.masonry-entry .popup-image p.image-description {
  display: none;
  opacity: 0;
  transition: all 0.3s linear;
}

.masonry-entry .popup-image p.image-description.is-visible {
  display: block;
}

.masonry-entry .popup-image p.image-description.is-open {
  margin-left: 0px;
  opacity: 1;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "masonry-entry">
  <a class = "popup-image" href = "http://lorempixel.com/400/200/">
    <img src = "http://lorempixel.com/400/200/" />
    <p class = "image-description">Text here</p>
  </a>
</div>
<div class = "masonry-entry">
  <a class = "popup-image" href = "http://lorempixel.com/400/200/">
    <img src = "http://lorempixel.com/400/200/" />
    <p class = "image-description">Text here</p>
  </a>
</div>
<div class = "masonry-entry">
  <a class = "popup-image" href = "http://lorempixel.com/400/200/">
    <img src = "http://lorempixel.com/400/200/" />
    <p class = "image-description">Text here</p>
  </a>
</div>

Я хотел бы навести курсор на «.popup-image» и увидеть только соответствующее «p.image-description». Не все "p.image-description" есть на странице.

Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
1
0
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вы получаете коллекцию .image-description со строкой:

var item = $('p.image-description');

Всякий раз, когда вы работаете с «элементом», например, добавляя класс «является видимым», вы применяете его ко всем элементам в коллекции. Было бы лучше думать о том, что у вас есть сейчас, как о предметах, а не о предметах.

Вам нужно использовать $(this) для работы с наведенным элементом и найти «описание изображения», из которого вы хотите добавить/удалить классы.

Пример:

$('.popup-image').hover(function () {
    var imageBeingHovered = $(this); // verbosity purely for explanatory purposes
    var imageBeingHoveredDescription = imageBeingHovered.find('.image-description'); // see above - you don't need this many variables, they're solely for clarity.
    imageBeingHoveredDescription.addClass('is-visible');

    setTimeout(function () {
        imageBeingHoveredDescription.addClass('is-open');
    }, 20);
}, function () {
    var description = $(this).find('.image-description'); // shortening for simplicity at this point.
    description.removeClass('is-open');

    description.one('transitionend', function () {
        description.removeClass('is-visible');
    });
});

Спасибо, Натан, ваш код помогает, однако у меня проблема с поведением при наведении. когда страница загружается впервые и вы наводите курсор на изображение, все работает отлично. При втором наведении курсора на изображение текст остается на короткое время, а затем исчезает. Вы знаете, что может быть причиной этого? Я немного застрял. У меня есть это на кодовой ручке здесь: Пример кода

Steviehype 21.07.2019 09:54

Я обновил свой ответ. Событие transitionend продолжало срабатывать, потому что я использовал on вместо one.

Nathan Dawson 21.07.2019 20:10

Я, наверное, должен был начать с вопроса: вы уверены, что вам вообще нужен JS для этого? Рассматривали ли вы использование видимости + непрозрачности для достижения того же эффекта без какого-либо JS. Вот очень быстрый и грубый пример, который я собрал на основе вашего кода: codepen.io/anon/pen/voOPwp

Nathan Dawson 21.07.2019 20:19

ДА! Это намного лучше! Спасибо за помощь. Я пошел по маршруту JS только потому, что не мог анимировать от display:none; до display:block;. Спасибо еще раз.

Steviehype 21.07.2019 23:06

можно попробовать $('#my-element').next().first().addClass('my-class');.

Он добавил var item = $('p.image-description'); в качестве первой строки JS. Было бы неплохо объяснить, почему ваш код работает и как он/она может использовать его, чтобы заставить его работать.

Syfer 21.07.2019 06:22

используйте this для отображения конкретного элемента и find для поиска image-description

var item = '';
var timeOut = 0;
$('.popup-image').hover( 
        function (e){
       
        item =  $(this).find(' p.image-description');    
       
            item.addClass('is-visible');

             timeOut = setTimeout(function () {
		    item.addClass('is-open');
		}, 20);

		},
        function() {
        item =  $(this).find(' p.image-description');    
            item.removeClass('is-open');

            item.one('transitionend', function(e) {
                item.removeClass('is-visible');
        });
        clearTimeout(timeOut);
		}
    );
.masonry-entry .popup-image p.image-description{
    display: none;
    opacity: 0;
    transition: all .3s linear;
}
.masonry-entry .popup-image p.image-description.is-visible {
    display: block;
}
.masonry-entry .popup-image p.image-description.is-open {
    margin-left: 0px;
    opacity: 1;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "masonry-entry">
    <a class = "popup-image" href = "http://lorempixel.com/400/200/">
        <img src = "http://lorempixel.com/400/200/" />
        <p class = "image-description">Text here</p>
   </a>
</div>
<div class = "masonry-entry">
    <a class = "popup-image" href = "http://lorempixel.com/400/200/">
        <img src = "http://lorempixel.com/400/200/" />
        <p class = "image-description">Text here</p>
   </a>
</div>
<div class = "masonry-entry">
    <a class = "popup-image" href = "http://lorempixel.com/400/200/">
        <img src = "http://lorempixel.com/400/200/">
        <p class = "image-description">Text here</p>
   </a>
</div>

Спасибо за это, это именно то, что я пытался решить. Я не мог понять правильное использование &(this) с переменной. Спасибо за ваше время.

Steviehype 21.07.2019 17:02

Я только что нашел проблему, и я не могу понять, что это может быть. Если вы наведете курсор на изображение, а затем наведете курсор на другие изображения, это приведет к эффекту, при котором текст остается видимым только в течение короткого периода времени. Вы знаете, почему это может быть? это как-то связано с таймингами? спасибо за любые мысли.

Steviehype 21.07.2019 17:34

Я обновил свой ответ, добавил clearTimeout, похоже, он решает проблему

Ram Segev 21.07.2019 17:39

Рам, спасибо за помощь. В итоге я использовал чистое CSS-решение Натана. Я только что загнал себя в угол. Спасибо еще раз.

Steviehype 21.07.2019 23:08

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