#javascript #jquery #html #hover
#javascript #jquery #HTML #наведите курсор
Вопрос:
Я очень новичок в jQuery с небольшим опытом программирования, поэтому, пожалуйста, примите это во внимание.
Я создал сценарий экономии времени, который будет принимать следующие две переменные:
1) Элемент (который содержит одно изображение) — imgelement
2) URL-адрес изображения для наведенного изображения — hoverimageurl
Код:
/* Image Hover Script (Start) */
var imgelement = "#element"; /* Element containing the original image */
var hoverimageurl = "http://www.domain.com/image.png2"; /* Image URL of the hover image */
jQuery(document).ready(function() {
/* Add CSS and a class to the original image to fix positioning and give it an identification */
jQuery(imgelement " img").addClass("originalimage");
/* Prepend hover image to the element. Set the SRC to the hover image URL */
jQuery(imgelement).prepend('<img class="hoverimage" src="' hoverimageurl '">');
/* Fade out original image and fade in hover image on hover */
jQuery(imgelement).hover(function() {
jQuery(imgelement " .originalimage").stop(true).fadeTo(1000, 0);
jQuery(imgelement " .hoverimage").stop(true).fadeTo(1000, 1);
}, function() {
jQuery(imgelement " .hoverimage").stop(true).fadeTo(1000, 0);
jQuery(imgelement " .originalimage").stop(true).fadeTo(1000, 1);
});
});
/* Image Hover Script (End) */
/* Image Hover CSS (Start) */
#pix-fe .originalimage {
position: relative;
}
#pix-fe .hoverimage {
position: absolute;
width: 100%;
height: 100%;
}
/* Image Hover CSS (End) */
<div class="element">
<a href="http://www.domain.com"><img src="http://www.domain.com/image1.png"></a>
</div>
То, что делает скрипт, исчезает до изображения наведения, заданного из hoverimageurl
переменной, когда элемент наведен. Это работает отлично, но я захочу использовать несколько экземпляров этого скрипта, и для этого мне нужно будет добавить имена переменных с увеличивающимся числом для каждого экземпляра, который мне требуется. Это неэффективно, потому что основную часть скрипта нужно будет повторять для каждого экземпляра, когда в идеале мне просто нужен список переменных и один экземпляр основного скрипта.
Есть ли вообще какой-либо способ добиться обобщения этого кода? Я знаю this
, но imgelement
всегда буду ссылаться на значение в отношении imgelement
переменной, поэтому, насколько мне известно, я не вижу, как это можно сделать.
Большое вам спасибо за ваше время.
Комментарии:
1. Я уверен, что вы можете РАЗОБРАТЬСЯ с этим, но нам также нужно будет просмотреть ваш HTML-код. Не могли бы вы отредактировать свой вопрос, чтобы включить его.
2. Что произойдет, если вы попытаетесь сделать селектор более плотным? Например, я нацеливаю его на
#element :hover
?this
В этом случае не следует ссылаться на один экземпляр?3. @seth Селектор уже неверен; идентификатор должен быть уникальным. Класс был бы лучше, и я предполагаю
$('.example').each(function(){console.log(this)})
, что у него были бы наилучшие результаты.4. Спасибо, что указали на это, моя ошибка. Тем не менее, для вашего решения потребуется расширение,
$('.example :hover') ...
если я не ошибаюсь, поскольку сценарий должен запускаться только для элемента, который находится в состоянии наведения.
Ответ №1:
Ничего такого, с чем не справился бы маленький css 🙂
.image-switch {
position: relative;
}
.image-switch img {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
opacity: 1;
transition: opacity 1s
}
.image-switch:hover img:last-child{
opacity: 0
}
<span class="image-switch">
<img src="http://placehold.it/200x200/FF0000">
<img src="http://placehold.it/200x200">
</span>
Комментарии:
1. Спасибо бесконечно.
Ответ №2:
Вы действительно должны сделать что-то подобное, используя css, поскольку это будет более надежным, чем js, и более понятным. Тем не менее, это хорошая возможность узнать о плагинах jQuery и о том, как вы можете использовать его, чтобы сделать ваш код более СУХИМ и многоразовым.
Чтобы добавить новый метод к объекту jQuery, вы можете объявить функцию, для jQuery.fn
которой это prototype
.
ваша функция this
будет привязана к выбранной вами коллекции элементов, поэтому вам нужно вызывать каждый из них, если вы планируете заставить api работать с коллекциями.
Оттуда вам просто нужно добавить свою функциональность в функцию. Любые аргументы будут переданы в вашу функцию, чтобы вы могли передавать настройки во время выполнения. здесь он используется для передачи URL-адреса img.
Другая базовая функция, которую я использовал, заключалась jQuery.fn.find
в том, что у нас есть ссылочный элемент, из которого мы можем просматривать dom, вместо того, чтобы использовать строки, которые на мой взгляд более запутанны.
Чтобы запустить плагин, вам просто нужно создать селектор jQuery и вызвать ваш новый метод. $('#selector').hoverImage('url')
Теперь, когда вы знаете основы создания плагина jQuery, вам действительно следует выяснить, как добиться того же результата с помощью чистого css.
/*
* jQuery hoverImage plugin
*
* @param {string} url url of the hover image
*/
(function() {
jQuery.fn.hoverImage = function(url) {
// loop over the element collection
this.each(function() {
// bind your functionality
var $this = $(this)
var $img = $this.find('img')
var $hover = $('<img class="hoverimage" src="' url '">')
$this.prepend($hover)
$this.hover(function() {
$img.stop().fadeTo(1000,0)
$hover.stop().fadeTo(1000,1)
}, function() {
$img.stop().fadeTo(1000,1)
$hover.stop().fadeTo(1000,0)
})
})
}
})()
// run your plugin
$('#element').hoverImage('http://lorempixel.com/400/200/')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="element"></div>
Комментарии:
1. Большое вам спасибо за этот ответ.