Правильно, решил поиграть с этим, это совсем не просто достичь.
Это, насколько я могу сказать, до сих пор довольно глючно, но это отправная точка.
Демонстрация: http://jsfiddle.net/NzcZH/
Начальная компоновка
Исчезновение
Рост
В полном размере
По сути, каждое изображение подключено к .mouseenter()
(документы) / .mouseleave()
(документы) событий, и делается попытка активировать требуемое изображение или деактивировать его при необходимости, если что-то уже происходит, создается примитивная очередь (которая требует исправления).
Активация - это то, что было у вас, с помощью нескольких модификаций она затухает, затем увеличивает активное изображение.Деактивация выполняется наоборот, сжимает активное изображение обратно к оригиналу, а затем постепенно увеличивает его (через прозрачность).
Изменения в модели в основном связаны с необходимостью HTML / CSS для анимации такого типа.
Если вы используете прямые .fadeIn()
(документы) / .fadeOut()
(документы) процедуры, эти .hide()
(документы) изображения (display: none;)
в конце, который удаляет их со сцены и в итоге перемещает неисчезшее активное изображение в верхний угол, что нарушает анимацию,Вместо этого лучше использовать непрозрачность и абсолютное расположение изображений, чтобы удерживать их на месте.Вы можете позволить им исчезать и прятаться, а вместо этого сбрасывать координаты перед анимацией, но это бесполезно, если вы хотите перекрытия.
В идеале, z-index
следует изменить на изображениях, чтобы сохранить активный элемент.сверху, это позволило бы параллельное затухание и рост, в настоящее время это происходит поэтапно.
[Я использую подпрограмму .data()
(docs) для хранениятекущее состояние, а не загрузка переменных, бит точнее.]
Структура HTML
<div class="work">
<img id="tl" width="150" height="120" src="http://i.stack.imgur.com/JQFbb.jpg" border="0" />
<img id="tr" width="150" height="120" src="http://i.stack.imgur.com/l5OPs.jpg" border="0" />
<img id="bl" width="150" height="120" src="http://i.stack.imgur.com/okxQz.jpg" border="0" />
<img id="br" width="150" height="120" src="http://i.stack.imgur.com/4uPHw.jpg" border="0" />
</div>
CSS
.work {
padding: 5px 5px;
border: 1px solid black;
width: 309px;
height: 249px;
}
.active { border: 1px solid red; }
img { position: absolute; border: 1px dashed #aaa; }
#tl { top: 16; left: 16; }
#tr { top: 16; left: 171px; }
#bl { top: 141px; left: 16; }
#br { top: 141px; left: 171px; }
JQuery код
var work = $('.work');
var workImages = work.find('img');
var growSpeed = 1500;
var fadeSpeed = 500;
work.data('changing', false).data('queue', false);
workImages.mouseenter(function() {
var activeImg = workImages.filter('.active');
if (activeImg.length == 0) {
activate(this);
}
}).mouseleave(function() {
var activeImg = workImages.filter('.active');
if (activeImg.length > 0) {
deactivate();
}
});
function activate(cImg) {
if (work.data('changing') !== false) {
work.data('queue', cImg);
return;
}
var activeImg = workImages.filter('.active');
if (activeImg.length != 0) {
return;
}
work.data('changing', cImg);
activeImg = $(cImg);
activeImg.addClass('active');
if (!activeImg.data('origPos')) {
activeImg.data('origPos', { left: parseInt(activeImg.css('left')), top: parseInt(activeImg.css('top')) } );
}
workImages.stop();
workImages.not(activeImg).animate({ opacity: 0 }, fadeSpeed, 'linear', function() {
activeImg.animate({
left: 16,
top: 16,
width: 307,
height: 247
}, growSpeed, 'linear', function() {
work.data('changing', false);
if (work.data('queue') !== false) {
var queued = work.data('queue');
work.data('queue', false);
if (queued == 'deactivate') {
deactivate();
} else if (queued != cImg) {
deactivate(queued);
}
}
});
});
}
function deactivate(cImg) {
if (work.data('changing') !== false && work.data('changing') !== 'deactivate') {
work.data('queue', 'deactivate');
return;
}
if (cImg) {
work.data('queue', cImg);
}
var activeImg = workImages.filter('.active');
if (activeImg.length == 0) {
return;
}
work.data('changing', 'deactivate');
var origPos = activeImg.data('origPos');
workImages.stop();
activeImg.animate({
left: origPos.left,
top: origPos.top,
width: 150,
height: 120
}, growSpeed, 'linear', function() {
workImages.not(activeImg).animate({ opacity: 100 }, fadeSpeed, 'linear', function() {
activeImg.removeClass('active');
work.data('changing', false);
if (work.data('queue') !== false) {
var queued = work.data('queue');
work.data('queue', false);
activate(queued);
}
});
});
}