#jquery #jquery-cycle
#jquery #jquery-цикл
Вопрос:
Я пытаюсь создать слайд-шоу цикла jQuery, в котором изображения разных размеров центрируются по вертикали и горизонтали, а также изменяют размер до любого размера окна. Часть этого является прямым css, но мне нужно динамически настраивать ‘top’, ‘left’, ‘margin-top’ и ‘margin-left’ на каждом изображении, прежде чем исчезать на первом изображении слайд-шоу.
Таким образом, я считаю, что необходимо создать обратный вызов, в котором размеры и поля устанавливаются до появления изображений. Не могу найти лучший способ сделать это.
CSS прост. По сути:
#gallery img {
max-height: 100%;
position:absolute;
display:none;
}
И грубый вариант .js был бы:
$(window).bind("load resize", function() {
$('#gallery img').each(function(i) {
var ih = $(this).height();
var iw = $(this).width();
var fh = Math.ceil(ih / 2);
var fw = Math.ceil(iw / 2);
$(this).css({
'top' : '50%',
'left' : '50%',
'margin-top' : '-' fh 'px',
'margin-left' : '-' fw 'px'
});
},function() {
$('#gallery img:first').fadeIn(3000, function() {
$('#gallery').cycle();
});
Однако я не вижу ожидаемого результата. Затухание первого изображения срабатывает до того, как выполняются вычисления и позиционирование.
Думая, что ‘display: none’ может запутать ситуацию (возможно, ничего не вычисляется, пока не будет ‘display: block’, я попытался использовать:
#gallery img:first-child {
display:block;
opacity:0;
}
.. И затем анимация до полной непрозрачности вместо fadeIn — но результат тот же.
Что я делаю не так??
Комментарии:
1. Каждый используемый вами метод не имеет функции обратного вызова. Смотрите api.jquery.com/each Тот, который делает это api.jquery.com/jQuery . каждое это может помочь.
2. чем «margin: auto;» отличается от того, что вы пытаетесь выполнить?
3. Спасибо за информацию. У меня все еще возникают проблемы с синтаксисом, так как я также пытаюсь привязать загрузку окна и изменить его размер.. но предположим, что я в конце концов наткнусь на это. (Документация для jQuery. каждый из них выглядит тонким ..) (‘margin: auto’ не работает с абсолютно расположенными элементами)
4. можете ли вы создать пример на jsbin я делал это много и много раньше, но было бы неплохо поработать с реальным примером
5. У меня есть реальный пример на dev.schippertmartin.com — похоже, работает, хотя, вероятно, не так элегантно, как могло бы быть..
Ответ №1:
Я не совсем уверен, что пытается сделать ваш код, но держу пари, проблема может заключаться скорее в событии и логике цикла. Ваш код читается так, как если бы вы пытались повторно инициировать показ первого изображения после изменения размера, не уверен, что я неправильно понял ваше намерение здесь.
Возможно, разделение логики изменения размера и цикла галереи, подобное этому, могло бы помочь и сделать код более понятным; это изменило бы размер изображений при изменении размера и запустило галерею при загрузке:
$(document).ready( function() {
function resizeThem() {
$('#gallery img').each(function(i) {
var ih = $(this).height();
var iw = $(this).width();
var fh = Math.ceil(ih / 2);
var fw = Math.ceil(iw / 2);
$(this).css({
'top' : '50%',
'left' : '50%',
'margin-top' : '-' fh 'px',
'margin-left' : '-' fw 'px'
});
});
}
$(window).bind("resize", resizeThem);
$(document).bind("load", function () {
resizeThem();
$('#gallery img:first').fadeIn(3000, function() {
$('#gallery').cycle();
});
});
});
Обратите внимание, как событие изменения размера по-разному ведет себя в разных браузерах. Кроме того, кажется чрезмерным изменять размер всех изображений. Как насчет изменения размера отображаемого изображения, а затем, в свою очередь, всегда изменять размер изображений, когда они отображаются, в соответствии с размером браузера.
Комментарии:
1. Спасибо контур — То, что я пытаюсь сделать, это: загрузить изображения и расположить их по горизонтали и вертикали в центре перед началом цикла слайд-шоу. Это учитывало бы различные размеры изображений. Само изменение размера выполняется только с помощью CSS, хотя я бы хотел, чтобы центрирование выполнялось динамически.