Наведите указатель мыши на элемент анимации следующего элемента - Как удалить встроенный JS
Я относительно новичок в JavaScript, но я пытаюсь найти более эффективный метод для вызова функции опрокидывания без использования встроенных событий в HTML. Ниже приведен метод, который я сейчас использую:
HTML
<div id="work_square">
<img onmouseover="rolloverIn('rollover_1');" onmouseout="rolloverOut('rollover_1');" src="images/frugal_image.png" width="100%"/>
<div onmouseover="rolloverIn('rollover_1');" onmouseout="rolloverOut('rollover_1');" id="rollover_1" class="rollovers">
<div id="rollover_text">
<h2>ROLLOVER 1 TITLE</h2>
<p>This is rollover 1.</p>
</div>
</div>
</div>
<div id="work_square">
<img onmouseover="rolloverIn('rollover_2');" onmouseout="rolloverOut('rollover_2');" src="images/exhibiton_image.jpg" width="100%"/>
<div onmouseover="rolloverIn('rollover_2');" onmouseout="rolloverOut('rollover_2');" id="rollover_2" class="rollovers">
<div id="rollover_text">
<h2>ROLLOVER 2 TITLE</h2>
<p>This is rollover 2.</p>
</div>
</div>
</div>
JS
<script>
function rolloverIn(el){
var elem = document.getElementById(el);
elem.style.opacity = 1;
elem.style.transform = "scale(1)";
}
function rolloverOut(el){
var elem = document.getElementById(el);
elem.style.opacity = 0;
elem.style.transform = "scale(0)";
}
По сути, я вызываю функцию, чтобы применить CSS-преобразование и изменение непрозрачности для ролловера, размещенного над каждым квадратом work_square при наведении мыши на изображение или ролловер, а затем удалить изменения при наведении курсора мыши.
Этот метод работает, но я понимаю, что встроенное кодирование - плохая практика. Может ли кто-нибудь указать мне правильное направление на более эффективный метод?
Благодарю.
2 ответа
Извините, что разрушил вашу мечту об использовании JS, но
это все выполнимо в чистом CSS:
.work_square{ position:relative; }
.work_square > img{ width:100%; }
.work_square .rollovers{
position:absolute;
top:0;
opacity:0;
transform: scale(0);
transition: 0.6s;
}
.work_square:hover .rollovers{
transform: scale(1);
opacity:1;
}
<div class="work_square">
<img src="//placehold.it/800x300/cf5" />
<div class="rollovers">
<div class="rollover_text">
<h2>ROLLOVER 1 TITLE</h2>
<p>This is rollover 1.</p>
</div>
</div>
</div>
<div class="work_square">
<img src="//placehold.it/800x300/f5f" />
<div class="rollovers">
<div class="rollover_text">
<h2>ROLLOVER 2 TITLE</h2>
<p>This is rollover 2.</p>
</div>
</div>
</div>
Обратите внимание, что я удалил все ненужные идентификаторы (эй, вы не можете использовать повторяющиеся идентификаторы в действительном HTML-документе).
Используйте свой контейнерный класс .work_square
и использовать CSS :hover
добавьте этот слушатель, а не просто добавьте желаемый класс дочернего элемента к цели:
.work_square:hover .rollovers{
Прежде всего, никогда не используйте один и тот же идентификатор для нескольких элементов, идентификаторы являются уникальными. Здесь вам нужны классы, поэтому ваш HTML-код должен быть изменен на что-то вроде этого:
<div class="work_square">
<img class="rollover" src="images/frugal_image.png" width="100%"/>
<div class="rollover">
<div class="rollover_text">
<h2>ROLLOVER 1 TITLE</h2>
<p>This is rollover 1.</p>
</div>
</div>
</div>
<div class="work_square">
<img class="rollover" src="images/exhibiton_image.jpg" width="100%"/>
<div class="rollover">
<div class="rollover_text">
<h2>ROLLOVER 2 TITLE</h2>
<p>This is rollover 2.</p>
</div>
</div>
</div>
Теперь, если вы хотите использовать чистый JavaScript, без встроенного кода, вы можете легко использовать rollover
класс, чтобы выбрать все элементы и связать mouseover
а также mouseout
события к вашим функциям. Вот правильный код:
function rolloverIn(e){
this.style.opacity = 1;
this.style.transform = "scale(1)";
}
function rolloverOut(e){
this.style.opacity = 0;
this.style.transform = "scale(0)";
}
var elements = document.getElementsByClassName('rollover');
for (var i=0; i < elements.length; i++) {
elements[i].addEventListener('mouseover', rolloverIn);
elements[i].addEventListener('mouseout', rolloverOut);
}