Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   offset - установка местоположения для невидимых элементов. (https://javascript.ru/forum/library-toolkit-framework/66893-offset-ustanovka-mestopolozheniya-dlya-nevidimykh-ehlementov.html)

winch 16.01.2017 17:03

offset - установка местоположения для невидимых элементов.
 
Объясните пожалуйста, почему jquery функция offset некорректно устанавливает местоположение невидимым элементам?

я заметил, что при таком вызове:
$("#id").show().offset({left: 100, top: 100 });
всё хорошо.
а если сделать так:
$("#id").offset({left: 100, top: 100 }).show();

то при каждом новом выполнении этого кода, элемент смещается чуть ниже и правее, хотя координаты в обеих случаях задаются абсолютные.

TestUser013 17.01.2017 00:45

http://api.jquery.com/offset/
Цитата:

Note: jQuery does not support getting the offset coordinates of hidden elements or accounting for borders, margins, or padding set on the body element.
While it is possible to get the coordinates of elements with visibility:hidden set, display:none is excluded from the rendering tree and thus has a position that is undefined.
Странно что второй вариант вообще работает :)

winch 17.01.2017 08:21

Немного не то.
Там написано, что не поддерживается получение координат для скрытых элементов, а я пытаюсь установить координаты скрытому, а потом показать его.

http://rem-mastera.ru/media/imgs/tmp/jquery_offset.html здесь демо пример сделал, для наглядности.

ksa 17.01.2017 09:27

Цитата:

Сообщение от winch
хотя координаты в обеих случаях задаются абсолютные

У тебя не совсем верное представление об абсолютных координатах... :)

Ты пытаешься использовать координаты относительно документа. ;)

ksa 17.01.2017 09:43

Цитата:

Сообщение от winch
я пытаюсь установить координаты скрытому, а потом показать его.

И ты решил, что это будет работать... Но оно не работает.

Rise 17.01.2017 09:52

winch, там плагин сам позиционирует и ты еще из вне пытаешься - вот такой эффект и получается в результате.

рони 17.01.2017 09:53

Цитата:

Сообщение от winch
offset

$("#FloatForm").css({ left:100, top:100}).show();

winch 17.01.2017 10:02

Цитата:

Сообщение от Rise (Сообщение 441051)
winch, там плагин сам позиционирует и ты еще из вне пытаешься - вот такой эффект и получается в результате.

ну я же делаю offset({ left:100, top:100}), по логике координаты должны записаться поверх и затереть, то что позиционирует плагин. а получается, что они как бы добавляются к предыдущей позиции.

winch 17.01.2017 10:08

Цитата:

Сообщение от ksa (Сообщение 441047)
У тебя не совсем верное представление об абсолютных координатах... :)

Ты пытаешься использовать координаты относительно документа. ;)

а координаты относительно документа и абсолютные - это не одно и тоже?
ну хотя это не важно. вопрос был почему метод offset для видимых и невидимых элементов устанавливает позицию по разному.

winch 17.01.2017 10:15

Цитата:

Сообщение от рони (Сообщение 441052)
$("#FloatForm").css({ left:100, top:100}).show();

добавил к своему примеру вариант через css. да, в этом случае работает корректно. но мне просто интересно почему offset с невидимыми элементами работает так странно.

ksa 17.01.2017 10:18

Цитата:

Сообщение от winch
мне просто интересно почему offset с невидимыми элементами работает так странно

Запиши это как особенность. :D

Rise 17.01.2017 10:31

winch, по какой логике) click в плагине весит делегированно на документе, твой же click весит непосредственно на элементе, поэтому в процессе всплытия события сперва сработает твой клик, а уже затем клик плагина.

winch 17.01.2017 10:44

Цитата:

Сообщение от Rise (Сообщение 441060)
winch, по какой логике) click в плагине весит делегированно на документе, твой же click весит непосредственно на элементе, поэтому в процессе всплытия события сперва сработает твой клик, а уже затем клик плагина.

клик плагина должен делегировано срабатывать на элементах с классом .FloatFormAnchor
в данном случае он не работает.

Rise 17.01.2017 12:38

winch, тогда TestUser013 отчасти был прав) если заглянуть в исходники jquery, то метод .offset() для установки значения внутри своей реализации в формуле расчета координат использует себя же для получения текущего значения, но для невидимых элементов такое значение, как указано в цитате TestUser013, будет не определено, в связи с чем всегда равно { top: 0, left: 0 }, отчего конечный результат такой формулы с участием такого псевдозначения дает такой эффект.

winch 17.01.2017 14:25

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

ну да ладно, как посоветовал ksa, запишем это как особенность :)

Rise 17.01.2017 15:05

winch, текущее значение нужно, чтобы учитывать border, margin, padding элементов, за исключением body, из той же цитаты:
Цитата:

Note: jQuery does not support getting the offset coordinates of hidden elements or accounting for borders, margins, or padding set on the body element.

winch 17.01.2017 16:52

ясно. спасибо за разъяснение.


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