Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   google chrome ajax и модальное окно facebox (https://javascript.ru/forum/jquery/31033-google-chrome-ajax-i-modalnoe-okno-facebox.html)

foreach 24.08.2012 00:48

google chrome ajax и модальное окно facebox
 
Уважаемые форумчане, помогите решить проблему. Использую плагин facebox для показа картинок. Во всех браузерах все хорошо. Только Хром портит кровь. Смещает фейсбокс в право.
Причину я уже нашел, но как ее победить не могу понять.
Блоку #facebox задается абсолютное позиционирование. top вычисляется от высоты окна, это я понял
$('#facebox').show().css({
        top:	getPageScroll()[1] + (getPageHeight() / 10),
        left:	$(window).width() / 2 - ($('#facebox .popup').outerWidth() / 2)
      })

А вот с left проблема. Вторая часть выражения
($('#facebox .popup').outerWidth() / 2)

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

LittlePony 24.08.2012 01:09

до загрузки получить ширину изображения можно только из атрибута width тэга img или из css.

Valdemor 24.08.2012 01:53

Попробуйте алертнуть outerWidth. Если нормального значения в alert'е не будет, значит добавляйте к картинке некий тег width. Либо .css("width") получать. Если же будет, то проблема в скрипте. Напишите, был алерт или нет (вернее, значение в нем).

Aetae 24.08.2012 03:37

Есть оченно большое подозрение что facebox умеет центрироваться самостоятельно. Почитайте доки.

foreach 27.08.2012 23:21

Цитата:

Сообщение от Valdemor (Сообщение 200163)
Попробуйте алертнуть outerWidth. Если нормального значения в alert'е не будет, значит добавляйте к картинке некий тег width. Либо .css("width") получать. Если же будет, то проблема в скрипте. Напишите, был алерт или нет (вернее, значение в нем).

Алерт выводит 0. А передать width нет возможности. У меня в базе записаны названия изображений, а php скрипт формирует разметку, задает путь к файлу и истинного размера изображения не знает.
Можно конечно приделать костыли и на сервер каким то образом узнавать размер изображения. Но это уже будут костыли

foreach 27.08.2012 23:24

Цитата:

Сообщение от Aetae (Сообщение 200167)
Есть оченно большое подозрение что facebox умеет центрироваться самостоятельно. Почитайте доки.

Доки изучил. И не только по фейсбоксу. Почти во всех *боксах такая хрень и только в хроме.
Да фейсбокс центует сам. Выше я приводил кусок кода. Но проблема не в нем а в хроме, который выполняет джаваскрипт до загрузки изображения.
Почему то.

Deff 27.08.2012 23:30

Цитата:

Сообщение от foreach
Подскажите как можно побороть это? Как просчитать ширину загружаемого изображения?

Поставьте атрибут onload последней подгружаемой картинке и по этому событию запускайте функцию ?

LittlePony 28.08.2012 09:48

Цитата:

Сообщение от Deff (Сообщение 200993)
Поставьте атрибут onload последней подгружаемой картинке и по этому событию запускайте функцию ?

кстати, а разве можно управлять порядком загрузки картинок?
ведь даже если она идёт последней в коде, это ещё не значит, что она последней загрузится.

А если так, то уж $(window).load()

yura_remnev 28.08.2012 10:57

Вызывайте процесс позиционирования ПОСЛЕ загрузки картинок, например так:
$("img").one('load', function() {
  // ваш код
  $('#facebox').show().css({
        top:    getPageScroll()[1] + (getPageHeight() / 10),
        left:   $(window).width() / 2 - ($('#facebox .popup').outerWidth() / 2)
      })
  // конец вашего кода
}).each(function() {
  if(this.complete) $(this).load();
});


Ссылки по теме: 1, 2. Задача, если хотите по-настоящему вникнуть в суть вопроса и есть свободное время.

Цитата:

Сообщение от LittlePony (Сообщение 201069)
кстати, а разве можно управлять порядком загрузки картинок?

Конечно же нет. Странная мысль по поводу установки обработчика на последнюю картинку.
Цитата:

Сообщение от LittlePony (Сообщение 201069)
А если так, то уж $(window).load()

$(window).load() не поможет, если картинки загружаются аяксом. В данном случае, как мне кажется, они загружаются аяксом.

LittlePony 28.08.2012 12:30

глупость конечно, но можно ещё использовать сложную конструкцию с проверкой .prop("complete") у всех картинок


Часовой пояс GMT +3, время: 08:20.