Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
outside.allowMixedStates будет возвращаться exceeds-vertically exceeds-horizontally если блок во все стороны выходит за пределы области видимостиone( event, fn )scrollspy много меньше расчетов по отслеживанию расчетов позиции элементаscrollspy троттлинга.right-of-viewport, partly-above-the-viewport. Самая общая категория здесь это viewport, соответственно, имя должно начинаться с него. Т.е, если переделать, то это будет viewport-right, viewport-above-partly, или что-то в таком роде (с артиклями или без, по вкусу). При этом все имена заключены в «пространство имён» viewport и далее в субпространства, относящиеся к более мелким категориям (субкатегориям). Такое имя проще генерить, проще получить список всех имён, проще запомнить.Следующий этап — определение местоположения интересующего нас блока относительно области видимости.
Решением будет свой метод, который будет обходить всех родителей вверх по дереву DOM, вплоть до области видимости данного контекста.
element:top = element.getBoundingClientRect().top;
bottom = element.getBoundingClientRect().bottom;
left = element.getBoundingClientRect().left;
right = element.getBoundingClientRect().right;
getFromTop: function() {
var fromTop = 0;
for( var obj = $( this ).get( 0 ); obj && !$( obj ).is( ':have-scroll' ); obj = obj.offsetParent ) {
fromTop += obj.offsetTop;
}
return Math.round( fromTop );
}
который написан на чистом javascript, и использует приведенный Вами .offsetParentНачнем, пожалуй, с определения того, что же для данного контекста является областью видимости.
Для моей задачи, а писал я плагин, в первую очередь, для удовлетворения своих нужд, областью видимости является ближайший родитель, имеющий прокрутку.
.getBoundingClientRect() получает позицию элемента относительно окна браузера пользователя, что уже не подходит в случае если если область видимости у нас — не окно, а какой-либо другой блок ниже по дереву DOM..getBoundingClientRect(), последний возвращает левак какой-то, и я не горю желанием выяснять почему, ибо есть уже работающий вариант функции.scrollgetFromTop и getFromLeft в один метод, сократив кол-во обходов DOM в два раза, странно что я сразу до этого не допер, а только в момент написания статьи=)onScroll, не?onScroll не вызывался этими кнопками.уведомление считается прочитанным если если оно попало в область видимости, за пределами области видимости может быть до 100 элементов
arr = [
{
x: {
left: int, // левая граница
right: int // правая граница
},
y: {
top: int, // верхняя граница
bottom: int // нижняя граница
},
ev: event // событие, когда на экране
},
...
]
getRelativePosition: function( forceViewport ) {
var fromTop = 0;
var fromLeft = 0;
var $obj = null;
for( var obj = $( this ).get( 0 ); obj && !$( obj ).is( forceViewport ? forceViewport : ':have-scroll' ); obj = $( obj ).parent().get(0) ) {
$obj = $( obj );
if( typeof $obj.data( 'pos' ) == 'undefined' || new Date().getTime() - $obj.data( 'pos' )[1] > 1000 ){
/*
* Making some kind of a cache system, it takes a bit of memory but helps us veeery much, reducing calculation
* */
fromTop += obj.offsetTop;
fromLeft += obj.offsetLeft;
$obj.data( 'pos', [ [ obj.offsetTop, obj.offsetLeft ], new Date().getTime() ] );
} else{
fromTop += $obj.data( 'pos' )[0][0];
fromLeft += $obj.data( 'pos' )[0][1];
}
}
return { "top": Math.round( fromTop ), "left": Math.round( fromLeft ) };
}
var MO = require('mutation-observer');
var evt = require('emmy');
var matches = require('matches-selector');
var getElements = require('tiny-element');
var intersects = require('intersects');
jQuery.viewport или как я искал элементы на экране