Колонки две, скроллер один!
Вариант адаптации к разным устройствам (экранам).
На странице две колонки, но скроллируются по вертикали они независимо одним общим браузерным ползунком. Фреймов нет. При уменьшении размеров экрана (смартфон) две колонки автоматически "сворачиваются" в одну. Разрабатывалось для просмотра на Full HD (1920 px) Отдых в Турции: http://gigalit.com.ua/cirali Какие ощущения от такой навигации? |
Маэстро,
а если попробовать скролировать одновременно? |
Цитата:
Очень много сайтов на которых 2,3 визуальные колонки. При этом заполнение контентом их неравномерное. Одна колонка длинная, другая короткая. При вертикальном скроллировании наблюдаем сначала полное заполнение экрана, а потом пол-экрана занято, а другая половина - "белый лист". На экранах 1920 px вообще слева и справа по 30% пустого места. Чтобы исправить такую ситуацию попробовал новый подход. Вторая причина - после прочтения содержимого одной колонки приходится подниматься вверх, чтобы читать вторую колонку, потом третью. В данном подходе этого не нужно. |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
синхронная прокрутка блоков разной высоты
Маэстро,
скролл колесом мышки, для теста "много спойлеров", покликать по любым блокам. <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="robots" content="noindex, nofollow"> <meta name="googlebot" content="noindex, nofollow"> <style type="text/css"> html, body { height: 100%; overflow: hidden; padding: 0; margin: 0; } #chating_wrapper{ box-sizing: border-box; padding: 0; height: 100%; border: 2px #8B4513 solid; } .chating_history{ font-weight: bold; } .chating_block{ height: 150px; border-bottom: 2px #8B4513 solid; transition: height .3s ease-in-out; } .chating_block:nth-child(2n){ background-color: #CD853F; } .chating_block:last-child { border-bottom: none; } .chating_list{ height: 100%; width: 50%; overflow-y: hidden; float: left; } .chating_text{ padding: 4px 0 4px 46px; } .chating_list:nth-child(1) .chating_block { height: 250px; border-right: 2px #8B4513 solid; } .chating_list:nth-child(1) .chating_block:nth-child(2n) { background-color: #FF4500; } </style> <title></title> <script src="https://cdn.polyfill.io/v1/polyfill.js?Element.prototype.closest"></script> <script> window.addEventListener("DOMContentLoaded", function() { var nodes = document.querySelectorAll(".chating_list"); function wheel(event) { var target = event.target; if (target.closest(".chating_list")) { var a = nodes[0].scrollHeight - nodes[0].clientHeight; var b = nodes[1].scrollHeight - nodes[1].clientHeight; event.preventDefault(); var delta = 0; if (event.wheelDelta) delta = event.wheelDelta / 120; else if (event.detail) delta = -event.detail / 3; delta = delta > 0 ? -30 : 30; if (target == nodes[0]) { nodes[0].scrollTop += delta; nodes[1].scrollTop = b * nodes[0].scrollTop / a } else { nodes[1].scrollTop += delta / 5; nodes[0].scrollTop = a * nodes[1].scrollTop / b } } } window.addEventListener("mousewheel", wheel, false); window.addEventListener("DOMMouseScroll", wheel, false); /* для теста изменить высоту, клик по любому блоку*/ window.addEventListener("click", function(event) { var target = event.target; if (target.closest(".chating_block")) target.style.height = 100 + (Math.random() * 700 | 0) + "px" }, false) }); </script> </head> <body> <div id="chating_wrapper"> <div class="chating_list" > <div class="chating_block">1</div> <div class="chating_block">2</div> <div class="chating_block">3</div> <div class="chating_block">4</div> <div class="chating_block">5</div> <div class="chating_block">6</div> <div class="chating_block">7</div> <div class="chating_block">8</div> <div class="chating_block">9</div> <div class="chating_block">10</div> <div class="chating_block">11</div> <div class="chating_block">12</div> <div class="chating_block">13</div> <div class="chating_block">14</div> <div class="chating_block">15</div> <div class="chating_block">16</div> <div class="chating_block">17</div> <div class="chating_block">18</div> <div class="chating_block">19</div> <div class="chating_block">20</div> </div> <div class="chating_list" > <div class="chating_block">1</div> <div class="chating_block">2</div> <div class="chating_block">3</div> <div class="chating_block">4</div> <div class="chating_block">5</div> <div class="chating_block">6</div> </div> </div> </body> </html> |
рони,
Да, понятно, что если принять меры, то будет как в Вашем примере. Но именно так лично мне и не нравится, когда при кручении колеса мыши двигается не только контент левой части сайта, но и правой тоже. Логика тут такая: если я читаю текст слева, то зачем двигать контент справа? |
Маэстро,
мне больше нравится, когда у каждого блока своя полоса прокрутки, а не общая как у вас, потому - что возникает вопрос: как крутить второй блок? |
Цитата:
Цитата:
на сенсорном экране прикасаетесь пальцем к контенту (левой или правой части) и двигаете вверх/вниз - скрипт сразу понимает какую сторону двигать. |
Цитата:
|
Цитата:
Если да, то я попробую их выполнить (сюда не относим всевозможные текстовые надписи типа "двигать туда", "крутить здесь", "смотреть далее" - на мой взгляд они только засоряют экран). Я исхожу из следующих практических наблюдений на сайтах: как правило, нескроллируемый блок 1. имеет ширину значительно меньшую, чем скроллируемый 2. содержит рекламный баннер или список рекламы, или меню/каталог сайта (если короткое) 3. имеет законченный вид, т.е. даже для высоты экрана 800px под собой имеет "белое поле". 4. соответственно не замечается внизу обрезания текста/таблицы/картинки. На показанном мною сайте обе колонки имеют одинаковую ширину, приблизительно равнозначный контент, видно обрезание снизу. В самом низу левой (скроллируемой по-умолчанию колонке) видна надпись: "Двухколоночный сайт с независимо скроллируемыми колонками". Раньше там было больше разъясняющего текста, но потом я его убрал, считая, что вроде бы уже должно быть понятно. |
Часовой пояс GMT +3, время: 04:07. |