Делаем вертикальный «скроллбар»

В разных браузерах полоса прокрутки выглядит по разному. И когда возникает необходимость настроить внешний вид скроллбара, появляются мысли что это должно быть как-то связано с CSS. Если вы будете искать информацию об этом, то скорее всего обнаружите что есть стили с помощью которых можно настроить цвет скроллбара. Стоит заметить, что поддерживаются эти стили только браузерами IE 5.5 и выше.

Бывают ситуации когда необходимо иметь полный контроль на внешним видом скроллбара. Например если дизайнер сделал элемент со специфической полосой прокрутки.
Для решения этой проблемы нам на помощь приходит Javascript со своими возможностями. Используя jQuery плагин jScrollPane, можно легко настроить внешний вид полосы прокрути по своему вкусу.

HTML разметка включает всего один внешний контейнер. Контейнер с id="scroll-wrap" в данном случае необходим лишь для позиционирования.

1
2
3
4
5
6
7
<body>
    <div class="scroll-wrap">
        <div class="scroll-pane">
            ....
        </div>
    </div>
</body>

CSS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
.scroll-wrap{
    width: 300px;
    margin: 40px auto;
    background: #F7F1E5
}
.scroll-pane{
    width: 290px;
    height: 200px;
    padding: 0 0 0 10px;
    overflow: hidden
}
a.jScrollArrowUp{
    display: block;
    position: absolute;
    z-index: 1;
    top: 0;
    right: 0;
    text-indent: -2000px;
    overflow: hidden;
    background:url(images/but.gif) no-repeat center top;
    height:18px;
}
a.jScrollArrowDown {
    display: block;
    position: absolute;
    z-index: 1;
    bottom: 0;
    right: 0;
    text-indent: -2000px;
    overflow: hidden;
    background:url(images/but.gif) no-repeat center top;
    height:18px;
}
.jScrollPaneDrag {
    position: absolute;
    cursor: pointer;
    overflow: hidden;
    background:url(images/drag.gif) no-repeat left top;
    height:42px
}

Далее необходимо подключить следующие файлы в секцию head:

1
2
3
4
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jScrollPane.js"></script>
<script type="text/javascript" src="jquery.mousewheel.min.js"></script>
<link rel="stylesheet" type="text/css" media="all" href="jScrollPane.css" />

Файл jquery.mousewheel.min.js необходим в том случае, если необходимо прокручивание содержимого колесом мыши.

и небольшой javascript:

1
2
3
4
$(function()
{
$('.scroll-pane').jScrollPane({showArrows:true,scrollbarWidth:19,dragMaxHeight:43});
});

Параметр showArrows отвечает за отображение кнопок прокрутки, scrollbarWidth отвечает за ширину полосы, а dragMaxHeight за максимальную высоту перетаскиваемой панели.

Удобство и доступность

Лишая скроллбар его естественного вида, вы рискуете тем, что пользователи не смогут распознать в новом дизайне, элемент, которым они привыкли пользоваться. Вы должны быть уверены, что новый вид ассоциируется именно с полосой прокрутки. Якоб Нильсен написал неплохую статью «Scrolling and Scrollbars», в которой описал, что можно, а что нельзя делать, когда дело касается настройки скроллбара. Учитывайте это когда будете применять данный способ.

Оригинал: Styling Scrollable Areas

UPD: Пример горизонтальной полосы прокрутки.

Обсуждение:

  1. angizij

    А есть такое же только для горизонтального скролбара ?

  2. rmaksim

    в FF при увеличении шрифта (по ctrl+ или ctrl+scroll) текст в окошке не прокручивается до конца, а только до размера блока с первоначальным шрифтом :( (

    это не есть удобно, ибо сча моники довольно большие, и приходится увеличивать почти на каждом сайте шрифт чтобы нормально читать

    … наверное надо бы пересчитывать высоту прокручиваемого блока при каждом перемещении ползунка

  3. petya

    Спасибо, а то как раз возникли проблемы с позиционированием скролбара.

  4. павлентий

    А реально ли как отследить чтобы когда скролим не оставляло текст наполовину показаным? Тобто чтобы небыло строк порубаных горзинтально?

  5. zhinzher

    нафик скролл который не реагирует на прокрутку мышью?
    а изчо у вас кнопь submit для комментария скрыта.

  6. Alex

    Zhinzher, внимательно прочтите статью.
    Кнопка отображается в основных браузерах. Вы каким пользуетесь?

  7. Truper

    Приветствую, подскажи пожалуйста, как сделать «Google Результаты поиска», как у тебя ?
    Заранее спасибо.

  8. Qirt

    А существует подобное решение, только для горизонтального скроллбара ?

  9. Mafka

    Спасибо, все красиво стало.
    Вот только в Опере баг наблюдается — если в прокручиваемом блоке много текста, внезапно появляется полоса прокрутки окна, а при приближении к концу прокручиваемого текста снова исчезает.
    Есть ли способы борьбы с этим?

  10. Holy Diver

    В FireFox 2 при задании свойсва max-height для .scroll-pane скроллер теряет стилизацию и выглядит по-умолчанию.

  11. Holy Diver

    Нашёл решение. При переносе max-height в .jScrollPaneContainer всё работает хорошо.

    • Athame

      Где ты нашёл такое свойство? Я не нашла

  12. Mihalytch

    Кто нибудь поборол глюк с Оперой, когда появлялась полоса прокрутки окна?

  13. bolzamo

    Для бОльшей информативности не хватает объявления стилей для .jScrollPaneTrack(фон полосы прокрутки).

  14. Mirash

    to Mihalytch:
    На официальном багсайте вроде сошлись на том, что это баг самой оперы.

    • Athame

      У меня тоже в IE не работает…

  15. Валерий

    В нормальном(стандартном скроле) при прокрутке скрола до самого низа или верха скролится начинает сама страница, это очень удобно. не знаете как можно достичь того же эфекта c jquery.mousewheel.min.js

  16. Гексли

    О вот это то что нужно. Почитал коментарии про оперу, у меня в 9.6 работает нормально, так что видимо в опере пофиксили.

  17. Борис

    Уважаемый автор!
    Возможен ли перенос скролбара в левую сторону. При этом попытка вставить в код direction: rtl не принесла успеха.
    Мне очень нужно, чтобы скроллбар был слева от текста.
    Помогите, плиз!

    • Alex

      Используйте параметр scrollbarOnLeft:true.

      • Борис

        Видимо, нужны дорполнительные изменения и в css?
        Так оно просто не становиться:(
        Спасибо за быстрый ответ, приготовился было ждать:)

        И еще вопросик.
        А если я хочу подложить на место пустого трека какой-то img в виде background (то есть в той трассе, где бегает бегунок) — это возможно?

  18. Борис

    Видимо, нужны дорполнительные изменения и в css?
    Так оно просто не становиться:(
    Спасибо за быстрый ответ, приготовился было ждать:)

  19. alexpts

    А что-то попроще не знаете? А то 3(2) js + 1 css это многовато для такой маленькой детали как скроллбар.

  20. alexpts

    Не получается что-то привернуть это все. Может быть пример простой напишите, где каждый элемент разбирается или помочь можете мне?

    • Alex

      Попробуйте этот вариант, он попроще и не требует никаких javascript библиотек.

      • alexpts

        От первого, конечно, отличается, но тоже требуюмую функцию реализует. Спасибо Alex ;)

  21. maddogrts

    Скрипт не работает с флешем, и другими скриптами для оформления уголов, использование его в полномасштабном проекте не рационально.

  22. linka

    Alex, спасибо огромное!
    но присоединюсь к вопросам: а как из этой красоты сделать горизонтальный скроллинг?:)

  23. linka

    Alex, добрый день! пожалуйста, помогите: в Opera 10 не работает прокрутка скроллинга колёсиком мыши:( что делать?:(

    • Alex

      Попробуйте использовать новую версию скрипта для прокрутки. Тут его можно скачать.

      • linka

        спасибо большущее, всё заработало!:)

      • Vitalii

        Спасибо большущее!как раз этого и не хватало,с новой версией скрипта всё нормально прокручивается

  24. anton

    а для textarea ни чего нет?

  25. Оксана

    Уважаемый автор, подскажите мне пжта со следующей проблемой. Оформление полосы прокрутки отображается только на страницах, где выбрана только категория и адрес страницы имеет следующий вид: http://www.permskie-medvedi.ru/?category=6 а когда в строке иммется еще и ID, например http://www.permskie-medvedi.ru/index.php?category=14&id=31 то оформление уже не работает. В чем может быть дело?
    Заранее, спасибо;-)

    • Alex

      Похоже оформление стандартное на обоих страницах. Посмотрел в FF и Opera.

      • Оксана

        Пардон, временно скрипт меняли, поэтому не отображалось. Можете посмотреть еще раз. Сейчас оформление прежнее.

        • Alex

          На страницах разная HTML разметка внутри блока page-wrap, проверьте.

          • Оксана

            Что вы имеете ввиду?

          • Alex

            Вижу разобрались что имел ввиду :)

          • Оксана

            Да, спасибо. Не работало из-за подключенного плагина комментариев

  26. Артур

    У меня проблема такого плана: имеется калькулятор, которой лежит в pane. В калькуляторе добавляются динамически различные поля из-за чего размер контента меняется. Получается что текст уползает вниз а размер pane каким был при загрузке — таким и остается. Как сделать резайз pane, подскажите пожалуйста?

  27. linka

    Алекс, подскажите пожалуйста!
    я увеличила количество информации в div’е, на котором установлена полоса прокрутки, и бегунок вдруг поменял свою высоту — я поняла он меняет её пропорционально высоте дива — а какие строчки надо убрать, чтобы бегунок не менял свою высоту?:)
    заранее спасибо.

    • linka

      ой, всё, спасибо, сама разобралась: в js файлике dragMinHeight и dragMaxHeight сделать равными между собой и равными нужной высоте бегунка:)

    • Alex

      За это отвечают параметры dragMinHeight и dragMaxHeight.

  28. IVAN_44

    Вопрос непростой: как использовать в joomla?
    необходимо заменить стиль прокрутки в основном информ. поле сайта
    Всю ночь просидел, но решения не нашёл! :-( ((
    Ну, т.е. подключить то я подключил плагин -и стили вроде подключились (т.к. управляется ширина блока из стилей)
    Но вот оформление! Не меняет он никак полосу! стандартная остаётся….
    Может подскажете что можно предпринять?

    • Михаил

      В шаблоне Joomla присвойте нужному блоку стиль, например, .info-block;
      поместите скрипты в папку js шаблона;
      в header’е шаблона index.php пропишите:
      <script type="text/javascript" src="baseurl ?>/templates/template ;?>/js/jquery.js»>
      <script type="text/javascript" src="baseurl ?>/templates/template ;?>/js/jquery.mousewheel.js»>
      <script type="text/javascript" src="baseurl ?>/templates/template ;?>/js/jScrollPane.js»>

      jQuery(function()
      {
      jQuery(‘.info-block’).jScrollPane({showArrows:true, scrollbarWidth:16, dragMinHeight:43, dragMaxHeight:43});
      });

      + содержимое CSS скрипта добавьте в CSS файл шаблона, и пути к картинкам изменить не забудьте;)

      • Михаил

        РНР-тэги обрезало. Вобщем если с шаблонами работали, поймёте

  29. F^[a].t

    !Ваще супер, весь день искал…)))
    спасибо огромное…

  30. linka

    Алекс, скажите пожалуйста, реальна ли работа вашего скроллинга в странице, подруженой в div при помощи jquery ajax? (в идеале http://habrahabr.ru/blogs/jquery/20245/ вот таким примерно способом)
    как я не пробую, сама по себе страница работает, а как подгружаю при помощи ajax — вместо красивого скроллинга вылезает обычный :(

    • Alex

      Хочу заметить что скрипт этот не мой, а что касается вопроса, то на официальном сайте есть пример с использованием AJAX.

  31. Mihail

    Здравствуйте подскажите пожалуйста как изменить ширину полосы прокрутки (пробовал изменить здесь .jScrollPaneTrack не помагает)

  32. Mihail

    Отлично!Спасибо Alex всё заработало!

  33. Александр

    В опере 10.10 не работает, всмысле появляется скролинг всей страницы.

    • Alex

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

      • Александр

        Спасибо, попробую

  34. Yuriy

    Подскажите, пожалуйста. Включил скрипты скроллбара, в Опере и Мазиле все ок, а вот в IE-6 проблемы, ползунка не видно и постоянно фигурирует какая-то надпись Scroll Up, которую невозможно убрать. И как можно поменять высоту скроллбара? Спасибо!!!

    • Alex

      В IE6 должно работать, проверьте правильно ли вы всё сделали.
      Высота устанавливается в css:
      .scroll-pane{width:290px;height:200px;padding:0 0 0 10px;overflow:auto}

  35. AlexMC

    В Opera 10.10 какой-то глюк, не хочет до конца прокручивать содержимое. Т.е. прокручивает текст, но не до конца. Что с этим можно сделать?

    • Alex

      Проверял в опере 10.10. Всё нормально. Может у вас шрифт увеличен?

  36. User

    Горизонтальный скролл как сделать???

  37. Pavel

    Если текста очень много, то полоса прокрутки меняет свой размер. Становится меньше и выглядит это не красиво. Верх полукруглый, а низ обрезан… Как сделать, чтобы не зависимо от объема информации ползунок изображающий полосу прокрутки не менял своего размера?

    • Alex

      Параметр dragMinHeight определяет минимальную высоту ползунка.

      • Pavel

        Спасибо! Все работает.

  38. trayanez

    вопросик тут появился…. если у меня на одной странице необходимо использовать 2 div-а со скроллами, то из них подгружается тока один div… может я что то не так делаю!!!!

    • Alex

      2 и более нормально работают, посмотрите примеры на офф. странице.

  39. trayanez

    у меня ситуация маленько другая- использую скрипт tabs, в котором есть девять кнопок раполагающихся слева, при нажатии на каждую из них справа появляется различный текст(без перезагрузки) и мне нужно почти для каждого из этих текстов сделать скролл, так как текста много!!!! Попробовал сделать как в вышепредставленном примере, не получается:(((

    • Alex

      Помотрите примеры, там есть вариант с подгружаемым контентом.

  40. adu

    как сделать такой же скроллинг только горизонтальный?

      • adu

        спасибо, посмотрю, не ожидал такого быстрого ответа)

  41. tanya

    Помогите пожалуйста, очень нужно перенести скролл в левую сторону, как сделать?

    • Alex

      Выше в комментариях уже спрашивали.

  42. Дмитрий

    А это работает только для diva с текстом? Пытался прикрутить к textarea — не получилось. Не пробовали реализовывать на формах?

  43. Athame

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

  44. Vadyos

    Недавно создал блог по скриптах на JQuery. Если кому то будет интересно то вот ссылка — vadyos.org.ua

  45. Вася

    Спасибо тебе дорогой автор. Из всех описаний jspane твоё самое понятое и полезное..
    Дай бог тебе счастья добрый человек.

  46. Максим

    Привет, гуру!
    У меня такая задача. Область, в которую вставляется ползунок, изменяемой высоты (туда вставляется посредством js разный контент). Как настроить скрипт, чтобы он считывал новую высоту?

  47. Al Green

    Привет! Спасибо за инфу с демкой.
    Сделал скрол из демки, все прекрасно, только он в Опере почему-то инвертированный (в ФФ в этом плане нормально). То есть крутишь колесико, а бегунок в обратную сторону движется (если он уперся в край, то просто не движется). Наверно нужно скрипт прокрутки обновить. Зашел по ссылке, которую вы давали.. не пойму как скачать — уже и зарегистрировался, а все равно нет линка на скачивание http://plugins.jquery.com/node/7146
    Подскажите пожалуйста.

  48. KolyaRS

    Добрый день!
    Такой вопрос: если жёстко не задана высота дива (не указана вовсе или используется соотношение — 80%, например) — всё перестаёт работать. Т.е. даже теоретически нельзя сделать, чтобы работало на дивах переменной, заранее не известной, высоты?

  49. ilya

    Прописал HTML

    <link type="text/css" rel="stylesheet" href="baseurl ?>/templates/template;?>/css/jScrollPane.css»/>

    <script type="text/javascript" src="baseurl ?>/templates/template;?>/js/jquery-1.4.2.min.js»>

    <script type="text/javascript" src="baseurl ?>/templates/template;?>/js/jquery.mousewheel.min.js»>

    <script type="text/javascript" src="baseurl ?>/templates/template;?>/js/jScrollPane.js»>

    $(function()
    {
    $(‘.scroll-pane’).jScrollPane({showArrows:true,scrollbarWidth:19,dragMaxHeight:43});
    });

    Скролл появился, но стандартный. Стили вроде работают. В чем дело? Помогите(((( Спасибо.
    P.S. Делаю в Joomla

    • Дым

      У меня такаеже хрень…

    • Максим

      Инструкция:
      1) установить мозиллу;
      2) поставить firebug;
      3) нажать на F12, потом на консоль, потом перезагрузить ту страницу — покажутся js ошибки.

      Навскидку могу сказать, что jquery конфликтует с другим фреймворком, использующим доллар.
      И код этот следует тогда заменить на:

      jQuery(function()
      {

      });

  50. balamut182

    Для бага с хаотично появляющимся скроллом при прокрутке в говнопере нам помогло
    html{overflow:hidden;}

  51. Андрей

    Здравствуйте, такой вопрос… если делать все через html, то плагин отлично работает во всех браузерах. А когда начинаю делать через cms joomla то плагин отображается в ie и ff , а в опере и в safari скрола не видно. В чем может быть причина? Как может повлиять использование плагина в cms на его работоспособность?

    • Alex

      Никакой разницы не должно быть. В итоге то всё равно html генерится. Смотрите внимательно что у вас там подключается.

  52. Андрей

    Спасибо за ответ Алексей, да, сейчас все работает.

  53. Андрей

    Вот такая проблемка появляется, при указании доктайп например вот такого некоторые элементы скролла не настраиваются через css, без указания все хорошо работает. Почему такое может быть? И что посоветуете?

  54. Дмитрий

    Автор,а вы знакомы с системой укоз?Если да,то как этот скрипт установить там?Потому что у меня ничего не получается — я скачал папку,установил в фтп моего сайта,прописал пути.Но застопорилось всё на

    Укоз подсвечивает закрывающие теги красным,т.е. код не работает.Что делать?

  55. Юрий

    Здравствуйте, возникла такая проблема: поле в котором, ставится скроллинг, должно растягиваться до конца экрана, в зависимости от разрешения монитора, при этом поле это начинается примерно с 1/3 страницы (не с самого верха). В опере все работает нормально. В IE скроллинг так же работает, но при этом поле растягивается больше чем монитор, и пявляется общий скролинг страницы. А вот в Хроме и FF скролинг вообще не появляется, и поле растягивается на весь текст.

  56. Anton

    Добрый день — есть такой вопрос — возможно ли при помощи jQuery реализовать скроллбар в виде полукруга, т.е. чтобы бегунок двигался не по вертикали а по дуге или же можно как-то переделать этот скрипт?

  57. Денис

    Встроил в шаблон joomla — тут же возникла проблема — если в материале на странице есть e-mail, то подгружается только белая пустая страница, на которой не ничего, кроме этого e-mail. Методом проб и ошибок было установлена, что причина кроется именно в этом приложении. Кто нибудь сталкивался?

  58. Basil

    Супер-полезная инфо!
    Долго искал. А кто знает, как отцентировать фрейм без учёта полосы прокрутки?

  59. da joke

    круто,спасибо огроменное. очень полезно и доступно!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*