jQuery scroll plugin

3 Июль 2009

Нашел в понедельник плагин для mootools который заменяет обычную полосу прокрутки. Очень понравилась идея, и очень не понравилась реализация, ОЧЕНЬ много кода у чувака вышло на какой-то скроллинг. У меня был махонький опыт работы со скроллингом в плагине автокомплит и я решил переписать все с нуля на jQuery.

Идея была хорошая, реализация - гавно. Сидел писал... Разруливал грабли.

Началось все с чертовой верстки, ее как обычно не понял IE, но там особых проблем не возникло, кое-что через скрипт поправил.

Первой неприятной граблей было отсутствие в jQuery поддержки колесика мишки, но плагин на этот случай нашелся очень быстро. Обожаю jQuery за огромное количество плагинов! И не смотря на то что плагин небольшой это уже давало лишний код и лишнюю зависимость для моего плагина. Не айс :(

Второй граблей стал ползунок, на него надо было натянуть drag. Тоесть перетаскивание, писать самому этот гемор я не решился, мне не настолько не хуй делать. Откуда взять драг? Правильно из jQuery UI. Примастырил я его довольно легко, благо там все просто. Оказалось еще два дополнительных файла (core и draggable) и килобайты лишнего кода. Мне это очень не понравилось, но ничего поделать я не мог.

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

Ок, ползунок стал куда ему требовалось теперь надо было из скрипта активировать событие drag. Поначалу даже не знал с чего начать, пробовал вызывать события mousedown и mousemove по очереди, потом вызвать их оба сразу, никаких результатов. Полез в код UI разбираться. От туда как-то вытащил событие "mousedown.draggable", попытался его вызвать через trigger, получил ошибку о зациклившейся рекурсии. Долго ругался. Гуглил. Узнал что так можно было делать еще в версии 1.5.3, а теперь это перекрыли. Авторы советуют использовать плагин симуляции пользователя. Долго ругался на дополнительный код, хотел из него что-то удалить, плюнул, поставил. Ура! Заработало. Потом уже во время написания статьи и проверки в IE и других браузерах оказалось что работает этот чудо-плагин тока в FireFox'e. Н у и хуй с ним, всеравно в оригинальном плагине так не работало.

Пока гуглил решение проблемы с drag'ом нашел плагин который реализовывает этот же функционал и вроде как гибче в настройках. Поставил, легче не стало, зато кода вроде уменьшилось и не надо использовать весь UI. В общем оставил в коде закомментированным кусок для подключения плагина. кто хочет может ебаться.

Так я похоже уже всех замариновал пиздежом не по теме. Выкладываю рабочий пример. Цацкайтесь.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut id eros eget dui tincidunt aliquam. Nulla mollis, erat suscipit pellentesque bibendum, nulla risus ultrices tellus, laoreet lobortis libero urna sit amet sem. Nunc placerat augue in felis condimentum fringilla. Mauris in sapien quis dolor sagittis pretium sit amet quis ante. Suspendisse elit arcu, pellentesque eget suscipit et, pharetra sit amet massa. Integer ut tortor sed tortor accumsan venenatis quis a ipsum. Aliquam erat volutpat. Mauris varius tincidunt tortor, sed feugiat enim lobortis eu. Aenean vitae metus augue, vel auctor mi. Cras sapien augue, interdum dignissim eleifend vel, porttitor eget ante. Cras feugiat varius ante, vel tincidunt quam congue ac. Aenean id purus nec diam sodales dignissim sit amet id turpis. Curabitur dignissim tincidunt euismod. Fusce euismod iaculis placerat. Donec consectetur ultrices semper. Pellentesque tellus ipsum, ultricies at fermentum sit amet, volutpat sit amet libero. Curabitur id lacus ipsum. Aliquam vulputate, est in mattis porttitor, lectus ante blandit turpis, vitae luctus felis purus vel libero.

Nulla velit augue, rutrum eu egestas rhoncus, aliquam at ante. Ut in dolor non orci malesuada commodo vitae non sem. Vestibulum quis neque ut massa tempus aliquet. Sed congue est sed arcu molestie consequat. Aenean eget dapibus lorem. Suspendisse tempor sem sit amet urna fermentum nec aliquam massa aliquet. Curabitur quis risus non est tincidunt congue id in neque. Nulla vel lorem ipsum. Nullam laoreet odio id nibh molestie sagittis eu ut ipsum. Donec ut risus vitae ante gravida lacinia. Integer quis enim massa. Donec ligula arcu, facilisis eget scelerisque et, dapibus non turpis. Maecenas quis orci tortor, sit amet porttitor leo.

Donec ullamcorper nisl dapibus mi semper non congue nunc luctus. Curabitur vitae erat neque, sed tincidunt arcu. Donec sodales rhoncus lectus et condimentum. Etiam dignissim odio a diam luctus congue. Nam vel tortor odio. Ut eu rutrum nibh. Pellentesque urna velit, laoreet quis semper eget, tempus non urna. Nam commodo turpis eget diam suscipit eget pulvinar diam auctor. Maecenas eu velit facilisis velit convallis vehicula vel sed nibh. Vivamus at ultricies justo. Ut eleifend libero eget leo varius sed aliquam turpis semper. Praesent dui sem, suscipit vel convallis et, pretium at dolor. Maecenas mollis pharetra metus, tempus luctus lacus tristique sit amet. Donec scelerisque ultrices varius.

Будет настроение буду доделывать... Уберу чертов плагин симуляции, всеравно не пашет... Потом там есть бага, когда сначала кликнул на полосу прокрутки, а потом на стрелку вверх, ползунок чуть вниз зъезжает. Посмотрим может не лень будет.

Добавлено 04.06.09 в 2 ночи. После 2 часов дебага обнаружил что плагин симуляции пользователя корректно работает только если виджет расположен на первом экране, то есть сама страницы с виждетом не проскроллена. После чего все воспоминания про плагин были выкинуты из кода. Застрелите меня.

Добавлено 05.06.09 в 12 ночи. Наконец-то доделал. Теперь скроллинг полностью имитирует поведение виндового скроллинга. И его можно применять не только к отдельному элементу но и ко всей странице.


    jQuery().ready(function($) {
      $().jscroll(); // document
    });

Размер моего плагина (не сжатым) 6 424 байт, а размер оригинального 23 076. При этом размер всех подключаемых js файлов (сжатых) у jquery 91 725, а у mootools 96 157 байт.

Добавлено 06.06.09 в 20:00. Добавлена поддержка IE 7 & 8. В IE 6 неправильно возвращается свойство scrollHeight, поэтому скроллинг глючит.

Скачать сие чудо с примерами работы можно отсюда DOWNLOAD LINK

  1. 3 Июль 2009 в 19:01 | #1
    Симпатичный скролл!
  2. 3 Июль 2009 в 19:22 | #2
    ага еще б довести его до ума
  3. 4 Июль 2009 в 09:54 | #3
    скрол нра!
  4. 4 Июль 2009 в 10:33 | #4
    Ок, если народу нравится то будет вторая версия, уже есть идеи по поводу использования Slider'a
  5. 12 Июль 2009 в 19:33 | #5
    а горизонтальный скролл?
  6. 12 Июль 2009 в 21:45 | #6
    я как-то об этом не думал даже, а что нужен?
  7. Rider-Sx
    14 Июль 2009 в 20:14 | #7
    Офигенно получилось =) Буду юзать
  8. 14 Июль 2009 в 20:15 | #8
    спасибо
  9. yurik417
    13 Август 2009 в 16:02 | #9
    В IE Плагин тормозит
  10. 13 Август 2009 в 16:04 | #10
    Однако в ИЕ вообще все тормозит, особенно в 6ом ;)
  11. B.I.S.
    14 Август 2009 в 13:49 | #11
    А чем косячный вариант jScrollPane (http://www.kelvinluck.com/assets/jquery/jScrollPane/jScrollPane.html)? Пока бегло пробигаюсь по вариантам, присматриваюсь :)
  12. 14 Август 2009 в 14:01 | #12
    @B.I.S. я его не видел :) спасибо за ссылку а вообще идея была именно в портировании этого плагина. и вообще мне показалось что у автора слишком много кода там... я так по примерам пробежался, да у него прикольный из явных отличий у него скролл может быть не такой высоты как див все остальное можно также закастомайзить а еще у него когда на скролл трак жмешь то скролл бар каждый раз приближается к мышке на половину расстояния тоесть сначала на половину ближе потом на четверть потом на восьмую, а у меня он каждый раз ближе на собственную высоту, так же как в винде
  13. kavkaz
    14 Август 2009 в 23:30 | #13
    Как то в проекте был нужен искусственный скролл, но и именно ещё и горизонтальный. Причем с возможностью одновременного использования на одной странице вертикального и горизонтального. Было бы неплохо когда нибудь такое и здесь увидеть.
  14. 14 Август 2009 в 23:33 | #14
    мне уже предлагали. будет время - сделаю
  15. 17 Август 2009 в 00:10 | #15
    все готов горизонтальный скролл, ждите, на днях выложу.
  16. vadim
    10 Сентябрь 2009 в 16:03 | #16
    прежде всего хочу поблагодарить за проделанную работу но в процессе использования появился вопрос, важный можно ли пересчитать высоту блока .scrollHandle, если я изменил количество контента? допустим, контента стало больше каким образом это сделать?
  17. vadim
    10 Сентябрь 2009 в 16:07 | #17
    как-то я выразился неправильно) еще раз: суть в том, что мне нужно чтобы скрипт пересчитал высоту блока с контентом (в .scroll) и скролил его правильно кто-то уже сталкивался с такой задачей? какие пути решения? зы в ие6 работает очень даже прилично
  18. 10 Сентябрь 2009 в 16:14 | #18
    проще говоря ты подгружаешь контент через ajax и хочешь обновить скролинг. если я правильно понял то тебе надо запустить $(window).rezise(); это самый простой способ
  19. vadim
    10 Сентябрь 2009 в 16:26 | #19
    не аякс js, у меня внутри блока .scroll 2 элемента и нужно по клику показывать их по очереди т.е. один скрыл, другой показал напиши подробнее про ресайз, пожалуйста
  20. 10 Сентябрь 2009 в 16:30 | #20
    на событие rezise повешена логика расчета высоты. просто запусти его руками и он все сделает
  21. 10 Сентябрь 2009 в 16:33 | #21
    О! так тут старая версия, я уже давно новую сделал там горизонтальный скролл появился и работает быстрее
  22. vadim
    10 Сентябрь 2009 в 16:35 | #22
    я не такой хавец в js, чтоб на словах понять можешь написать как это сделать? а лучше, включить это в мануал для всех) думаю, многим пригодится
  23. vadim
    10 Сентябрь 2009 в 16:38 | #23
    горизонтальный? мне высоту скрола надо пересчитать или я что-то недопонимаю?))
  24. vadim
    10 Сентябрь 2009 в 16:38 | #24
    помоги, пожалуйста сроки горят, а я на этом застрял (
  25. 10 Сентябрь 2009 в 16:44 | #25
    я тебе уже написал, после того как поменяешь контент своего дива выполни $(window).rezise(); Это все.
  26. vadim
    10 Сентябрь 2009 в 18:12 | #26
    мучался, мучался.. итог: $(window).rezise(); в моем случае не помог, т.к. событие не отрабатывает - изменения размера окна не происходит, меняется только высота блока контента который в свою очередь находится в блоке с фикс высотой и overflow:hidden, вся остальная часть контента страницы стоит на месте сделал 2 блока .scroll и их скрываю/показываю, но и тут вылезли неприятности хотя, решаемо зы надо подучить js ( скрипт хороший, буду пользовать, жаль что приходится вот так с ходу разбираться в сжатые сроки
  27. 10 Сентябрь 2009 в 18:14 | #27
    я проверю ночью. заодно свежую версию выложу
  28. 26 Октябрь 2009 в 16:51 | #28
    CTAPbIu_MABP - Все Красиво! -но не понятно! :) а вопрос такой - можно ли на одной странице иметь несколько блоков со скролами с разными размерами? например 1 вертикальный 400*70 2 квадратный 330*330 3 горизонтальный 100*500 а то как-бы я не выпендривался - у меня габариты (по скроллам) у всех блоков выходят сугубо одинаковыми :(
  29. 26 Октябрь 2009 в 18:31 | #29
    @leshak я боюсь ты даже пример не скачал, там на одной странице 5 разных скролов размер можно задать через css ".myscroll1 .wrapperEl { width: 600 px !important}"
  30. 27 Октябрь 2009 в 09:23 | #30
    @CTAPbIu_MABP ммммммм - ну да - 5 разных - но все Одного размера определяемого Одним стилем
    CTAPbIu_MABP : @leshak я боюсь ты даже пример не скачал, там на одной странице 5 разных скролов размер можно задать через css «.myscroll1 .wrapperEl { width: 600 px !important}»
    Скорее я не понял все возможности настройки скроллов или не правильно объяснил свою проблему (пример тут http://www.walks.ru/new/#stdt/moscow;mtr0_04;10 ) мне нужен скролл в блоках разного размера - а такого в примерах не нашел :( (знаю - поиск рулит, но ищу уже месяц)
  31. 27 Октябрь 2009 в 18:40 | #31
    @leshak поиграйся с CSS как я показал
  32. 28 Октябрь 2009 в 12:30 | #32
    CTAPbIu_MABP : @leshak поиграйся с CSS как я показал
    играться можно до бесконечности - вариантов много - а результата НЕТ! либо одинаковые размеры блоков - либо Ничего!
  33. 28 Октябрь 2009 в 17:54 | #33
    еще раз повторяю нужно сделать такую структуру
    
    <style>
    .wrapperEl{
    float:left;
    margin :10px;
    }
    .my_scroll .wrapperEl{
    width:500px !important;
    height:500px !important;
    }
    </style>
    
    <div class="my_scroll">
      <div class="scroll" style="width:500px;">
           текст
      </div>
    </div>
    
  34. 29 Октябрь 2009 в 09:19 | #34
    Вот теперь Понятно! Спасибо!
  35. 29 Октябрь 2009 в 17:56 | #35
    мда.. но это вложение ... напрочь отбивает желание встраивать этот способ в уже существующий код :( а я-то размечтался - картинки перерисовал...
  36. 29 Октябрь 2009 в 18:11 | #36
    найди в коде плагина
    
    html.conteiner = $('<div/>')
    .addClass('wrapperEl')
    .insertBefore(content);
    
    добавь туда
    
    html.conteiner = $('<div/>')
    .addClass('wrapperEl')
    .insertBefore(content)
    .css(self.css);
    
    тогда в параметры плагина можно будет передавать
    
    $(".scroll").jscroll({axis:{y:true,x:true},css:{width:700,height:700}});
    
    я не пробовал но должно работать
  37. 30 Октябрь 2009 в 09:56 | #37
    КласС! "я не пробовал но должно работать" типа - Повар, а что это? - Я не пробовал, но должно быть съедобно... я, наивный, уже начал корячить тексты, когда понял - данное исправление не избавит меня от вложения div class=my_scroll div class=scroll style=width:500px; /div /div а в этом пока основная проблема у меня слишком много завязано на на уже существующей структуре документа и впихивать в него еще один див потребует слишком больших исправлений и последующих ошибок... еще одна проблема связана с установкой размеров того, что за окном скрола div class=scroll style=width:1600px; height:200px; содержимое постоянно меняется .............
  38. 30 Октябрь 2009 в 11:20 | #38
    Послушай, я предлагаю плагин "как есть" без платы за использование и гарантий качества. Ты попросил помочь, я предложил тебе вариант решения, он тебе не понравился, я предложил другой, он теперь тоже не понравился. В результате я потратил свое время на тебя, и выслушиваю жалобы на то что я плохо тебе помогаю. Но ничего у меня есть для тебя решение, если тебе не нравится ни один из вариантов то попробуй взять другой плагин, их достаточно. Теперь по теме: мое последние исправление полностью рабочее, и оно избавляет от <div class=my_scroll>
    у меня слишком много завязано на на уже существующей структуре документа и впихивать в него еще один див потребует слишком больших исправлений
    это не нормально, может быть тебе стоит пересмотреть архитектуру приложения?!
  39. 30 Октябрь 2009 в 17:32 | #39
    Ок! Извини! Этот плагин Красив и интересен! - я это сказал Сразу! я ничего не требовал, думал если тебе интересна доработка плагина - то может мои попытки его использования окажутся полезными... - видать ошибся! Что же касается моих "жалоб на то что плохо помогаю" - извини - видать я не профи, и с полунамека плохо понимаю - как минимум с рабочего примера. так оно и с последней доработкой - я совсем не понял, как она избавляет от div class=my_scroll что касается "пересмотреть архитектуру" - так это уже пересмотренная - предыдущий вариант изобиловал "лишними" div Извини, что загрузил - я не нарочно! Успехов!!
  40. 2 Ноябрь 2009 в 11:17 | #40
    Да, ничего. Изменения я внесу, только если захочешь что-то еще исправить обьясняй нормально чем эта фича хороша и почему она обязательно должна быть добавлена, а не начинай с фразы "у мну не выходит"
  41. 5 Ноябрь 2009 в 15:46 | #41
    Ок! только еще раз скажу - грузить своими проблемами не не хочу! За плагин и его доработки - Благодарен! и думаю полезны они не только для меня окажутся! :) с №36 разобрался - все заработало без дополнительного diva! и это полезно - не я один, кто захочет использовать эти scroll'ы в уже существующих проектах, и не у всех будет возможность добавить еще один div.. если заинтересует, то есть следующие вопросы (опять же - при возможности) - для реализации "резиновой" верстки при изменении размеров окна я пересчитываю размеры многих элементов типа:
    
    function doResize() {
    	widthScrn = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth ;
    	heightScrn = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight ;
    
    	$('#PictsZona').width( widthScrn-18 );
    	$('#PictsZona').height( heightScrn-54 );
     ...
    	$('#PictsMsg_1').width( $('#PictsZona').width()-widthPict-171 );
    	$('#PictsMsg_2').width( $('#PictsZona').width()-widthPict-161 );
    } ;
    
    как в №16 - №25 пробовал добавить $(window).rezise(); или $(window).resize(); но, видать делал это не правильно - Firefox вешается серьезно и надолго... мои "исследования" здесь http://www.walks.ru/temp/jscroll/scroll_sm.html при создании скрола в плагин дважды передаются пары width,height возможно будет полезным передавать width, height только для опредерения размеров окна скролируемого элемента а размеры буфера задавать другой парой параметров ( типа width_buf, height_buf) - тогда при изменении содержимого скролируемого окна или размеров окна - я мог бы пересчитав размеры - передать их плагину....
  42. 5 Ноябрь 2009 в 17:48 | #42
    я ничего не понял из твоего кода :( но рад что с №36 у тебя получилось я внесу зменения когда у меня дома будет интернет, тоесть гдето через две недели. По поводу остального - выполни плз этот код в адресной строке браузера и посмотри что случилось со скролом.
    
    javascript:(function($){$(".scroll").css({height:100,width:100});$(window).trigger("resize");})(jQuery)
    
  43. 10 Декабрь 2009 в 11:13 | #43
    Отличный скрол, все рульно сделано... Пришлось порядком попотеть чтоб прикрутить, зато глюков пока не обнаружил. Спасибо за отличную переделку.
  44. 10 Декабрь 2009 в 11:35 | #44
    @Sliper а над чем тебе пришлось попотеть? там вроде все просто должно быть
  45. Pasha
    21 Декабрь 2009 в 17:31 | #45
    Добрый день! Отличный скрипт, только никак не удается сделать resize. Помогите пожалуйста. Контент в .scroll подгружаю AJAX-ом и есетественно возникает необходимость изменить размер блока в зависимости от величины загружаемого html $(window).trigger("resize") не помогает Спасибо за скрипт
  46. 21 Декабрь 2009 в 17:43 | #46
    @Pasha я в этой жизни ничего не понимаю скролл нужен для того чтобы текст любой величины можно было показывать в блоке строго определенного размера, зачем менять размеры блока от величины текста. но меньше с этим. покажи страницу с примером, если мой букмарклет не работает
  47. Pasha
    21 Декабрь 2009 в 17:48 | #47
    я имел ввиду саму полосу прокрутки, т.е при загрузке нового контента, в которм больше текста, я могу проскоролить только часть, которая равна части, которая была заружена первый раз, т.е. полоса прокрутки не пересчитывается для новго объема html, загруженого ajax
  48. 21 Декабрь 2009 в 18:04 | #48
    а ты точно помести $(window).trigger("resize") в метод onSuccess после того как сделал append новому тексту?
  49. Pasha
    21 Декабрь 2009 в 18:13 | #49
    А!!! все понятно, огромное спасибо! я его пытался вызвать по-другому!!! ОШИБАЛСЯ! Все работает! Есще раз БОЛЬШОЕ СПАСИБО! ;)
  50. 21 Декабрь 2009 в 18:27 | #50
    наздоровье
Страницы комментариев
1 2 1081
Комментирование отключено.