var sidebarNewsBlock = document.getElementById("sidebarNewsBlock"), children = sidebarNewsBlock.children, allChildren =[], stepScroll = 20,//регулировка скорости прокрутки №1 nodeElem; //получаем всех детей sidebarNewsBlock for (var i=0; i<children.length; i++){ if (children[i].children.length > 0) { for (var h=0; h<children[i].children.length; h++){ allChildren.push(children[i].children[h]); } } else if(children[i].children.length == 0){ allChildren.push(children[i]); } } sidebarNewsBlock.onwheel = function(event){ window.event.returnValue = false; var r = event.deltaY; //определяем направление движения колесика мышки if (r>0){ for (var i=0; i<allChildren.length; i++){ var t = allChildren[i].getBoundingClientRect(); if (t.top >0) { nodeElem = allChildren[i] lowScroll(); break; } } } else if (r<0) { for (var i=0; i<allChildren.length; i++){ var t = allChildren[i].getBoundingClientRect(); if ((t.top <= 0 && t.top > -2) || t.top > 0){ var g = i-1; if (g>=0) { nodeElem = allChildren[g]; lowScroll(); break; }else if (g<0){ sidebarNewsBlock.scrollTo(0,0) break; } } } } } function lowScroll(){ var k = nodeElem.getBoundingClientRect(); var t = sidebarNewsBlock.scrollTop+sidebarNewsBlock.clientHeight; var timer = 0; if (k.top >0){ if (t == sidebarNewsBlock.scrollHeight) {return};//определяем достигла ли прокрутка низа if (stepScroll < k.top){ sidebarNewsBlock.scrollBy(0,stepScroll); timer = setTimeout(lowScroll, 50);//регулировка скорости прокрутки №2 } else if (stepScroll > k.top) { sidebarNewsBlock.scrollBy(0,k.top+1); if (timer == 0) return; clearTimeout(timer); } } else if (k.top < 0) { var reverseStepScroll = 0-stepScroll; if (reverseStepScroll > k.top){ sidebarNewsBlock.scrollBy(0,reverseStepScroll); timer = setTimeout(lowScroll, 50);//регулировка скорости прокрутки №2 } else if (stepScroll >= k.top) { sidebarNewsBlock.scrollBy(0,k.top+1); clearTimeout(timer); } } }
body { margin: 0px; } .sidebar_news_block { display: block; position: relative; width: 200px; height: 300px; top: 0; left: 0; overflow-y: scroll; } .sidebar_news { display: block; margin: 0; padding: 0; overflow-y: auto; overflow-x: hidden; } .sidebar_news__item { box-sizing: border-box; display: block; padding: 10px; text-align: justify; }
<div id="sidebarNewsBlock" class="sidebar_news_block"> <h2> Красивый заголовок</h2> <div class="sidebar_news"> <div class="sidebar_news__item"> 1.Белая береза Под моим окном Принакрылась снегом, Точно серебром. </div> <div class="sidebar_news__item"> 2.Ах, метель такая, просто черт возьми! Забивает крышу белыми гвоздьми. Только мне не страшно, и в моей судьбе Непутевым сердцем я прибит к тебе.Ах, метель такая, просто черт возьми! Забивает крышу белыми гвоздьми. Только мне не страшно, и в моей судьбе Непутевым сердцем я прибит к тебе.Ах, метель такая, просто черт возьми! Забивает крышу белыми гвоздьми. Только мне не страшно, и в моей судьбе Непутевым сердцем я прибит к тебе.Ах, метель такая, просто черт возьми! Забивает крышу белыми гвоздьми. Только мне не страшно, и в моей судьбе Непутевым сердцем я прибит к тебе.Ах, метель такая, просто черт возьми! Забивает крышу белыми гвоздьми. Только мне не страшно, и в моей судьбе Непутевым сердцем я прибит к тебе. </div> <div class="sidebar_news__item"> 3.Вот уж вечер. Роса Блестит на крапиве. Я стою у дороги, Прислонившись к иве.Вот уж вечер. Роса Блестит на крапиве. Я стою у дороги, Прислонившись к иве.Вот уж вечер. Роса Блестит на крапиве. Я стою у дороги, Прислонившись к иве.Вот уж вечер. Роса Блестит на крапиве. Я стою у дороги, Прислонившись к иве.Вот уж вечер. Роса Блестит на крапиве. Я стою у дороги, Прислонившись к иве.Вот уж вечер. Роса Блестит на крапиве. Я стою у дороги, Прислонившись к иве.Вот уж вечер. Роса Блестит на крапиве. Я стою у дороги, Прислонившись к иве.Вот уж вечер. Роса Блестит на крапиве. Я стою у дороги, Прислонившись к иве.Вот уж вечер. Роса Блестит на крапиве. Я стою у дороги, Прислонившись к иве.Вот уж вечер. Роса Блестит на крапиве. Я стою у дороги, Прислонившись к иве.Вот уж вечер. Роса Блестит на крапиве. Я стою у дороги, Прислонившись к иве. </div> <div class="sidebar_news__item"> 4.Хорошо и тепло, Как зимой у печки. И березы стоят, Как большие свечки. И вдали за рекой, Видно, за опушкой, Сонный сторож стучит Мертвой колотушкой. </div> <div class="sidebar_news__item"> 5.Задремали звезды золотые, Задрожало зеркало затона </div> <div class="sidebar_news__item"> 6.Улыбнулись сонные березки, Растрепали шелковые косы. Шелестят зеленые сережки, И горят серебряные росы. </div> <div class="sidebar_news__item"> 7.Улыбнулись сонные березки, Растрепали шелковые косы. Шелестят зеленые сережки, И горят серебряные росы. </div> <div class="sidebar_news__item"> 8.Улыбнулись сонные березки, Растрепали шелковые косы. Шелестят зеленые сережки, И горят серебряные росы. </div> <div class="sidebar_news__item"> 9.Улыбнулись сонные березки, Растрепали шелковые косы. Шелестят зеленые сережки, И горят серебряные росы. </div> <div class="sidebar_news__item"> 10.Улыбнулись сонные березки, Растрепали шелковые косы. Шелестят зеленые сережки, И горят серебряные росы. </div> </div> </div>
плавной пошаговой прокруткой колесиком мыши, по блокам? Sosidebar_news_blocksidebar_news_block displays only 1 block when scrolling? What then to do if there is a lot of empty space? - Dmytryk.sidebar_news_blockso that inside the parent block the child blocks.sidebar_news__itemscrolled one by one, one after another, such as an anchor, from anchor to anchor. Or so I will try to explain: so that at each step of scrolling with the mouse wheel, scrolling stops as soon as the next and subsequent child blocks alternately reach the upper edge of the parent block. - LADYX.sidebar_news__item, the height of which can be different. - LADYX