-->

Прокрутка CSS

Горизонтальный скроллинг

Содержимое можно ограничить рамками блока HTML благодаря свойству CSS overflow. При этом выступающие элементы будут доступны при перемещении ползунка полосы прокрутки.

пёсожившая картинкамечеклювтигрымишки
<style>
.scrolling {
 margin: 0 auto;
 width: 30em;
 height: 10em;
 overflow-x: scroll;
 overflow-y: hidden;
 white-space: nowrap;  /* чтобы картинки стояли в одну линию, не переходя на другую строку */
 word-wrap: normal;  /* то же для IE */
}

.scrolling img {
 width: 10em;
 height: 10em;
}
</style>

<div class="scrolling">
  <img src="адрес_изо" alt=""/>
  <img src="адрес_изо" alt=""/>
  <img src="адрес_изо" alt=""/>
  <img src="адрес_изо" alt=""/>
  <img src="адрес_изо" alt=""/>
</div>

На слайдере или галереи изображений часто можно увидеть стрелочки, смещающие блок div с картинками. Когда по нажатию на кнопку одно фото прячется, его место занимает следующее, а позади появляется скрытый рисунок.

пёсожившая картинкамечеклювтигрымишки
<style>
.element {
 margin: 0 auto;
 width: 30em;
 height: 10em;
 overflow: hidden;
 white-space: nowrap;
 word-wrap: normal;
}

.element img {
 width: 10em;
 height: 10em;
 transition: 999999s;  /* чтобы не дать элементу вернуться в исходное состояние, время обратного смещения очень велико */
}

.left:active ~ .element img, .right:active ~ .element img {transition: 2s linear;}
.left:active ~ .element img {transform: translateX(0);}
.right:active ~ .element img {transform: translateX(-20em);}
</style>

<button class="left">«</button><button class="right">»</button>
<div class="element">
  <img src="адрес_изо" alt=""/>
  <img src="адрес_изо" alt=""/>
  <img src="адрес_изо" alt=""/>
  <img src="адрес_изо" alt=""/>
  <img src="адрес_изо" alt=""/>
</div>

Для того, чтобы плавно прокручивалась вся фотография целиком.

пёс ожившая картинка мечеклюв тигры мишки Юрий Гагарин МКС Белка и Стрелка макет ракеты Восток Земля
<style>
[class^="scroll"] {
 position: relative;
 height: 10em;
 line-height: 10em;
 padding: 0 3em;
}
[class^="scroll"] input {
 display: none;
}
[class^="scroll"] div {
 height: 100%;
 overflow: hidden;
 white-space: nowrap;
 word-wrap: normal;
 font-size: 0;
}
[class^="scroll"] img {
 position: relative;
 right: 0em;
 width: 25%;
 height: 100%;
 transition: .5s;
}

[class^="scroll"] label {
 cursor: pointer;
 font-weight: 600;
 font-size: 3em;
}
[class^="scroll"] input:nth-of-type(1):checked ~ label:nth-of-type(2):after,
[class^="scroll"] input:nth-of-type(2):checked ~ label:nth-of-type(3):after,
[class^="scroll"] input:nth-of-type(3):checked ~ label:nth-of-type(4):after,
[class^="scroll"] input:nth-of-type(4):checked ~ label:nth-of-type(5):after,
[class^="scroll"] input:nth-of-type(5):checked ~ label:nth-of-type(6):after,
[class^="scroll"] input:nth-of-type(6):checked ~ label:nth-of-type(7):after {
 content: "\3009";
 position: absolute;
 right: 0;
}
[class^="scroll"] input:nth-of-type(2):checked ~ label:nth-of-type(1):after,
[class^="scroll"] input:nth-of-type(3):checked ~ label:nth-of-type(2):after,
[class^="scroll"] input:nth-of-type(4):checked ~ label:nth-of-type(3):after,
[class^="scroll"] input:nth-of-type(5):checked ~ label:nth-of-type(4):after,
[class^="scroll"] input:nth-of-type(6):checked ~ label:nth-of-type(5):after,
[class^="scroll"] input:nth-of-type(7):checked ~ label:nth-of-type(6):after {
 content: "\3008";
 position: absolute;
 left: 0;
}

[class^="scroll"] input:nth-of-type(2):checked ~ div img {right: 25%;}
[class^="scroll"] input:nth-of-type(3):checked ~ div img {right: 50%;}
[class^="scroll"] input:nth-of-type(4):checked ~ div img {right: 75%;}
[class^="scroll"] input:nth-of-type(5):checked ~ div img {right: 100%;}
[class^="scroll"] input:nth-of-type(6):checked ~ div img {right: 125%;}
[class^="scroll"] input:nth-of-type(7):checked ~ div img {right: 150%;}
</style>

<div class="scroll">

<input type="radio" id="l0" name="raz" checked="checked"/>
<input type="radio" id="l1" name="raz"/>
<input type="radio" id="l2" name="raz"/>
<input type="radio" id="l3" name="raz"/>
<input type="radio" id="l4" name="raz"/>
<input type="radio" id="l5" name="raz"/>
<input type="radio" id="l6" name="raz"/>

<label for="l0"></label>
<label for="l1"></label>
<label for="l2"></label>
<label for="l3"></label>
<label for="l4"></label>
<label for="l5"></label>
<label for="l6"></label>

<div>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
</div>

</div>

Красивый вертикальный скроллинг

Если нет необходимости в скролле, то тень не будет видна. Автор.

  • Тени нет сверху.
  • 2
  • 3
  • 4
  • 5
  • 6
  • Начинаем прокручивать блок
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • Конец!
  • Тут нет тени снизу.
<style>
.scrollbox {
 overflow: auto;
 width: 200px;
 max-height: 200px;
 margin: 30px auto;
 background:
  linear-gradient(white 30%, rgba(255,255,255,0)),
  linear-gradient(rgba(255,255,255,0), white 70%) 0 100%,
  radial-gradient(farthest-side at 50% 0, rgba(0,0,0,.2), rgba(0,0,0,0)),
  radial-gradient(farthest-side at 50% 100%, rgba(0,0,0,.2), rgba(0,0,0,0)) 0 100%;
 background-repeat: no-repeat;
 background-size: 100% 40px, 100% 40px, 100% 14px, 100% 14px;
 background-attachment: local, local, scroll, scroll;
}
</style>

<div class="scrollbox">
 <ul>
  <li>Тени нет сверху.</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>Начинаем прокручивать блок</li>
  <li>8</li>
  <li>9</li>
  <li>10</li>
  <li>11</li>
  <li>12</li>
  <li>13</li>
  <li>14</li>
  <li>15</li>
  <li>16</li>
  <li>17</li>
  <li>18</li>
  <li>19</li>
  <li>20</li>
  <li>21</li>
  <li>22</li>
  <li>23</li>
  <li>24</li>
  <li>25</li>
  <li>26</li>
  <li>27</li>
  <li>Конец!</li>
  <li>Тут нет тени снизу.</li>
 </ul>
</div>
в f t
наверх ↑

23 комментария:

Комиго
Не работает :(
NMitra
Где именно? В IE? Там transition да transform с 10 версии будет работать, выход которой не за горами. Можно заменить transform на margin или position: relative; - результат будет тем же.
Megapotato
В хроме не работает, а в опере работает.
NMitra
Я, честно говоря, поленилась продублировать выше названные свойства с префиксом -webkit-. Все другие браузеры их (префиксы) уже убрали (IE, Опера, Мозила), а вот браузеры на основе WebKit (Chromium, Safari) пока нет. Также это просто вопрос ближайшего времени. Я решила немного на опережение сделать, чтобы потом не править статью.
Комиго
У меня, да, хром, и всё мёртвое.
Комиго
И в опере всё мёртвое ._.

только в мазилке работает.
NMitra
В Опере у меня всё в порядке. Для Хрома добавила -webkit- для transition и transform. Посмотрите снова.
Комиго
Спасибо, теперь работает :)
Анонимный
что-то нажимаю на "посмотреть код", но ничего не происходит
NMitra
В каком браузере на каком устройстве?
Анонимный
угу... В Maxthon4 (Webkit) на ПК. Под Firefox нормально.. спасибо, посмотрел.
Анонимный
Кстати вопрос на засыпку.. Реально ли учинить такую вот прокрутку варианта №3 в миниатюры вашей вот этой темы http://shpargalkablog.ru/2013/01/gallery-foto.html ? :) Думаю что это было бы актуально.
Unknown
А как сделать, что бы слайды не кончались с одной стороны, а по кругу шли?
NMitra
Третий вариант можно. http://shpargalkablog.ru/2013/07/slayder-dlya-sayta.html
Unknown
Что нужно дописывать, чтобы добавлять больше картинок?
И можно ли сделать, чтобы картинки шли в три ряда?
Unknown
забыла упомянуть, что говорю о третьем варианте (что со стрелками)
NMitra
Код изменила. Теперь лучше видны логические связи. Если нужно два ряда и более (id, for для id, name для одной строки должны быть индивидуальными):

<div class="scroll">

<input type="radio" id="l0" name="raz" checked="checked"/>
<input type="radio" id="l1" name="raz"/>
<input type="radio" id="l2" name="raz"/>
<input type="radio" id="l3" name="raz"/>
<input type="radio" id="l4" name="raz"/>
<input type="radio" id="l5" name="raz"/>
<input type="radio" id="l6" name="raz"/>

<label for="l0"></label>
<label for="l1"></label>
<label for="l2"></label>
<label for="l3"></label>
<label for="l4"></label>
<label for="l5"></label>
<label for="l6"></label>

<div>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
</div>

</div>

<div class="scroll1">

<input type="radio" id="h0" name="dva" checked="checked"/>
<input type="radio" id="h1" name="dva"/>
<input type="radio" id="h2" name="dva"/>
<input type="radio" id="h3" name="dva"/>
<input type="radio" id="h4" name="dva"/>
<input type="radio" id="h5" name="dva"/>
<input type="radio" id="h6" name="dva"/>

<label for="h0"></label>
<label for="h1"></label>
<label for="h2"></label>
<label for="h3"></label>
<label for="h4"></label>
<label for="h5"></label>
<label for="h6"></label>

<div>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
<img src="" alt=""/>
</div>

</div>
Unknown
Спасибо огромное, теперь все стало намного понятнее!
Но у меня еще один вопрос - можно ли таким же образом сделать прокрутку не картинок, а div'ов с различным содержимым?
NMitra
Почему нет. Все img замените на figure.
Unknown
Спасибо большое еще раз, отличные прокрутки, очень помогли!))
Комиго
Возможно, скоро добавят скроллинг по страницам через ЦСС - то-есть по жмяку на стрелочки у ползунка (или на клаве) контент будет смещаться на экран. Или на размер блока.

Идея была предложена ещё оперой в 2011 году http://people.opera.com/howcome/2011/reader/ , но сейчас интерес к газетному оформлению страниц возрос.
NMitra
Было бы интересно. Но пока а мобильных устройствах тормозит даже onscroll.
Комиго
Тормозит потому, что это методы яваскрипт, и его события "onscroll" срабатывают по несколько десятков раз в секунду, пока страница плавно прокручивается на мобильном устройстве, генерируя для плавности массу ненужных событий и убивая быстродействие несчастного браузера для дохленьких телефонов.

Нативная поддержка в цсс никак бы не тормозила)