Прокрутка всплывающего окна
Пытаюсь разобраться как вконтакте устроена прокрутка всплывающего окна. Заинтересовало то, что контент страницы на заднем фоне не прокручивается, а прокручивается только всплывшее окно.
Вот пример: http://vkontakte.ru/yeremyan?z=video13555100_130393462%2Fvideos1355510 0 Пытался самостоятельно понять, понял что там хитрость, чтобы контент страницы повешать на position: absolute; и z-index:x; Но до конца так и не разобрался, очень много там кода ... Если можно, подскажите как подобное сделать в более простом варианте, или может расскажите принцип работы этого окна. Спасибо. |
я тоже не решился по коду разбираться. Идея в том, чтобы убрать прокрутку документа и разместить поверх div, растянув его на все окно. Когда содержимого будем много у этого div'а будет появляться прокрутка. Как убрать прокрутку у документа:
1. overflow: hidden. Но изменение overflow перезапускает флешки, которые находятся внутри, в ff. 2. сделать, чтобы документ поместился в окне полностью, т.е. подогнать его ширину и высоту. А чтобы позиция содержимого не изменилась, задать ее с помощью отрицательных margin-left/margin-top а вот как они прокрутку в диалогах сделали, это мне самому интересно... |
я еще попробую минимизировать их код, вырезать всё ненужное, чтобы добраться до истины :)
|
прокрутка в диалогах(возможно подобная, не такая как у них)-два контейнера. родительский с overflow: hidden . отлавливает движение колеса-вложенный позиционируется исходя из этого относительно внешнего. при этом во вложенном контейнеры сообщений вложенные с сообщениями.Итого при событии движение колеса-позиционируется внутренний,но при этом позиционируется так ,чтоб вложенные в него открывались полностью-то есть ориентация но топ и и ботом вложенных-вместить те что влазят между началом и концом области,соответственно если топ и ботом не вмещаются то растяжка род контейнера.
|
greatilya,
подобное решение сойдёт? http://avto.pro/catalog/honda/accord...7-11/#40811586 Правда там мою вёрстку засрали конечно.... но вобщем смысл ясен... |
dmitriymar,
Как я понял вы предлагаете много JS кодинга. Сегодня вечером всё же расковыряю контакт и доберусь до истины. Цитата:
|
Цитата:
что не то? прокрутку в нутри блока можно не делать, а самому блоку position:absolute вместо position:fixed.. |
Цитата:
dmitriymar, не до конца понял, что ты написал. Но у тебя не хватает как минимум полосы прокрутки. Т.е. по идее еще надо создать блок с нулевой шириной, высотой равной высоте внешнего контейнера и высотой содержимого равной высоте содержимого внутреннего блока. И разместить этот блок справа, это будет полоса прокрутки, которую надо со всем остальным синхронизировать. Ну и еще клавиши вверх/вниз (пробел?) обрабатывать. |
Цитата:
Отлавливается событие колеса когда курсор находится над блоком сообщений,если над ним-запретить ст. действие браузера скрол и перепозиционировать вложенный контейнер относительно родительского с атрибутом overflow: hidden. Клавиши отлавливать-ну а что мешает их отлавливать и отрабатывать по тому же алгоритму? А вообще если нужен видимый скрол,то его не сложно добавить. Писал подобный верт скролинг со скролбаром заказчика графическим. Единственное, что текст на блоки не бился-весь код занял около 50-70 строк |
Долго сидел ковырялся в коде контакта. Там конечно замучено всё очень и очень детально + поддержка различных устройств. Примерно их идею понял, и вот что у меня получилось:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.4.min.js"></script> <script type="text/javascript"> var iScrolled = 0; function window_show() { iScrolled = $(window).scrollTop(); $(window).scrollTop(0); $('#container_all').css('position', 'fixed'); $('#container_all').css('margin-top', '-'+iScrolled+'px'); $('#layer_bg').css('display', 'block'); $('#layer').css('display', 'block'); } function window_hide() { $('#container_all').css('margin-top', '0px'); $('#container_all').css('position', 'absolute'); $(window).scrollTop(iScrolled); $('#layer_bg').css('display', 'none'); $('#layer').css('display', 'none'); } </script> <style media="all" type="text/css"> /* reset css */ body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td {padding:0;margin:0;} table {border-collapse:collapse;border-spacing:0;} fieldset,img,abbr,acronym {border:0;} address,caption,cite,code,dfn,em,strong,th,var {font-weight:normal;font-style:normal;} ol,ul {list-style:none;} caption,th {text-align:left;} h1,h2,h3,h4,h5,h6 {font-weight:normal;font-size:100%;} q:before,q:after {content:'';} #container_all { position:absolute; top: 0; left: 0; width: 100%; z-index: 1; } #container_content { width:960px; margin:0 auto; border-left:#ccc 1px solid; border-right:#ccc 1px solid; } #layer_bg { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 500; overflow: hidden; background: #000; opacity: 0.2; filter: alpha(opacity=20); display: none; } #layer { position:absolute; top: 0; left: 0; width: 100%; z-index: 600; padding:25px 0; display: none; } #layer_box { width:600px; margin:0 auto; background:#fff; } </style> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>test</title> </head> <body> <div id="container_all"> <div id="container_content" onclick="window_show()"> м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />ам<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />ам<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а </div> </div> <div id="layer_bg"></div> <div id="layer" onclick="window_hide()"> <div id="layer_box"> м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а<br />м<br />н<br />о<br />г<br />о<br />т<br />е<br />к<br />с<br />т<br />а </div> </div> </body> </html> Сразу упомяну: никаких визуальных эффектов не делал. Прошу, бросайте камни. |
Часовой пояс GMT +3, время: 01:13. |