Скрипт-игра. не скажу где используется и на что похоже;) Но это чудо эффективно может определить виден ли элемент клиенту (в текущем viewport'е) и как-то его отметить.
Собственно, листинг тестовой версии:
Собственно, листинг тестовой версии:
<html> <head> <title>TEST :: is element visible in viewport</title> <script language="javascript" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script> /* * Получение текущего вьюпорта: координаты верхнего левого угла и ширина с высотой */ function current_viewport() { var w = $(window); return { "left": w.scrollLeft(), "top": w.scrollTop(), "width": w.width(), "height": w.height() }; } /* * Проверка находится ли объект во вьюпорте * * paddings = { * "left": ..., * "top": ..., * "right": ..., * "bottom": ... * } * эффективно увеличивают размеры объекта. по умолчанию 0 */ function in_viewport(selector, paddings) { var el = $(selector); var off = el.offset(); var dim = { "width": el.width(), "height": el.height() }; if(!paddings) { paddings = { "left": 0, "top": 0, "right": 0, "bottom": 0 }; } var viewport = current_viewport(); return ( (off.top - paddings.top) >= viewport.top && (off.left - paddings.left) >= viewport.left && (off.top + dim.height + paddings.bottom) <= (viewport.top + viewport.height) && (off.left + dim.width + paddings.right) <= (viewport.left + viewport.width) ); } /* * Помечает объект-ответ, как прочтенный */ function mark_as_read(obj) { $(obj).css({ "border": "1px solid #eeeeee" }); $(obj).data('is_read', true); } $(document).ready(function() { // паддинги для проверки попадает ли объект во вьюпорт var paddings = { "left": 0, "top": 0, "right": 0, "bottom": 0 }; for(var i = 0; i < 40; i++) { $('<div class="ticket_reply"></div>').css({ "height": "100px", "margin-bottom": "20px", "border": "1px solid blue" }).appendTo('body'); } var replies = $('.ticket_reply'); replies.each(function(i) { // отметим видимые при загрузке if( in_viewport(this, paddings) ) mark_as_read(this); }); // зарегистрируем проверку прочтения сообщений по скроллингу $(window).scroll(function() { replies.each(function(i) { if( !$(this).data('is_read') && in_viewport(this, paddings) ) mark_as_read(this); }); }); }); </script> </head> <body> </body> </html>
За основу взят вот этот пост на stackoverflow: http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport