Страницы

Поиск по вопросам

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

суббота, 14 декабря 2019 г.

margin-left для полосы прокрутки в Chrome

#html #css #прокрутка


Имеется полоса прокрутки:



#parent {
  height: 200px;
  width: 300px;
  overflow-y: auto;
}

#child {
  height: 500px;
  width: 100%;
  background: teal;
}

 ::-webkit-scrollbar {
  width: 8px;
}

 ::-webkit-scrollbar-track {
  background: #f6f5f3;
}

 ::-webkit-scrollbar-thumb {
  background: #c1c1c1;
}
Хочу сделать, чтобы между полосой прокрутки и контентом (блок #child) было расстояние в 2px. По сути хочу написать ::-webkit-scrollbar { margin-left: 2px; }. Так не работает. Пробовал добавить padding-right: 2px к элементу #parent, но тогда если полосы прокрутки нет (то есть в блоке #child мало содержимого (в примере высота #child фиксирована, но в реальном проекте зависит от содержимого)), то будут лишние 2px пустого места. Как добавить расстояние 2px между полосой прокрутки и блоком #child? Обновление: У блока #parent имеется свойство overflow-y: auto;. То есть появится полоса прокрутки или нет зависит от высоты блока #child. В примере высота #child фиксирована, однако в реальном проекте зависит от содержимого (там динамически подгружаемый текст, много текста => появится полоса прокрутки, мало текста => не появится). Это всё к тому, что если полосы прокрутки нет, то решение не должно влиять на отображение. То есть хочется добавить 2px свободного места между контентом и полосой прокрутки, если полоса прокрутки есть, и ничего не добавлять, если её нет.


Ответы

Ответ 1



#parent { height: 200px; width: 300px; overflow-y: auto; } #child { height: 500px; background: teal; } ::-webkit-scrollbar { width: 10px; // 8px (ширина полосы прокрутки) + 2px (расстояние между полосой прокрутки и контентом) } ::-webkit-scrollbar-track { background: #f6f5f3; } ::-webkit-scrollbar-thumb { background: #c1c1c1; border-left: solid 2px #fff; }


Ответ 2



Может, не так понял, но возможно, это имелось ввиду. Использована функция calc. #parent { height: 200px; width: 300px; overflow-y: auto; } #child { height: 500px; width: calc(100% - 2px); background: teal; } ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: #f6f5f3; } ::-webkit-scrollbar-thumb { background: #c1c1c1; }


среда, 11 декабря 2019 г.

Автоматический переход к якорю. Как?

#javascript #jquery #scroll #прокрутка


Всем здравствуйте! 

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

Как такое может быть сделано?
    


Ответы

Ответ 1



Набросал маленький скрипт реализации данной функции. На первый взгляд сложновато, но логику понять можно: У нас есть блоки с собственным скроллом. Когда мы листаем до конца, то один блок скрывается, а второй открывается уже со своим скороллом. Тем самым создаётся эффект, что ты начинаешь скроллить с начала страницы. $(function() { var blocks_list = ['#block--0', '#block--1', '#block--2', '#block--3'], index = null; var $block = $('.block'); // Открываем первый блок location.href = '#block--0'; index = 0; // Запускаем скролл блоков $block.scroll(function() { var scroll_all = this.scrollHeight, scroll_top = $(this).scrollTop(), scroll_bottom = $(this).scrollTop() + $(window).height(); // ЕСЛИ ДОЛИСТАЛИ ДО НИЗУ И ЕСЛИ СЕЙЧАС ОТКРЫТ НЕ ПОСЛЕДНИЙ БЛОК if( scroll_bottom === scroll_all && index !== blocks_list.length - 1){ // Добавляем + 1 к индексу index++; // Заменяем адрес location.href = blocks_list[index]; // Скролим следущий блок, чтобы всё выглядело красиво $(blocks_list[index]).scrollTop( 50 ); }; // ЕСЛИ СКРОЛЛ ВВЕРХУ И ЕСЛИ СЕЙЧАС ОТКРЫТ НЕ ПЕРВЫЙ БЛОК if( scroll_top === 0 && index !== 0){ // Вычитаем - 1 у индекса index--; // Заменяем адрес location.href = blocks_list[index]; // Скролим пердидущий блок, чтобы всё выглядело красиво $(blocks_list[index]).scrollTop(function(e, scrollTop) { return scrollTop - 50; }); }; }); }); html, body {height: 100%; margin: 0} /* Скрываем все блоки */ .block { display: none; height: 100%; overflow: auto; } /* Открываем блок соответствующий якорю */ .block:target { display: block; } /* Стилизуем контент блоков */ .block-content { height: 1500px; padding: 50px 0 0; } #block--0 .block-content {background-color: #ff9191} #block--1 .block-content {background-color: #6dc36d} #block--2 .block-content {background-color: #8686c1} #block--3 .block-content {background-color: #e2e26e}
Текст 0
Текст 1
Текст 2
Текст 3
Саму идею вы поняли, а уже какой блок куда скролить и как стилизовать, решайте сами :)

Ответ 2



URL адресом можно управлять, если именно это вызывает вопрос: window.history.pushState(null, null, '/#jakor1'); //в историю добавляется объект при вызове этой ф-ии - влияет на работу кнопок браузера назад/вперёд window.history.replaceState(null, null, '/#jakor1'); //в историю НЕ добавляется объект при вызове этой ф-ии, но заменяется текущий объект истории Обе ф-ии меняют урл в адресной строке. Также можно заскриптовать кнопки "Назад"/"Вперёд" браузера, чтобы вместо загрузки страницы был ajax с анимацией - см. jQuery(window).bind('popstate',yourBackCallback);

Ответ 3



Вот вариант на "коленках" и не претендует на самый красивый код. Проверяем какой якорь находится на экране и меняем хеш страницы. jQuery использовал только для быстроты написания трекинга скролла. В вашем примере есть еще подгрузка частей через AJAX запросы, но главная суть отражена. // функция проверки присутствует ли елемент на экрана function checkVisible(element) { var showThreshold = parseInt(element.offsetHeight * .7), elementTop = window.innerHeight - element.getBoundingClientRect().top, elementBottom = element.getBoundingClientRect().bottom, isVisible = (Math.min(elementTop, elementBottom) - showThreshold) >= 0; if(isVisible){ var newHash = element.getAttribute('name'); if(window.location.hash != '#' + newHash) { window.location.hash = newHash; console.log('change hash to - ' + newHash); } } } $(function(){ var links = document.querySelectorAll('a[name]'); // получаем все элементы для отслеживания $(document).on('scroll', function(){ // трекаем скролл for(var i = 0; i < links.length; i++){ checkVisible(links[i]); // проверяем отображается ли элемент на экране } }); })

Часть 1

Часть 2

Часть 3



Ответ 4



В js смотрим, докрутили ли мы страницу до самого-самого низа (или до самого-самого верха). Если да - запускаем скрипт: Скрипт аяксово загружает следующую (или предыдущую) страницу - главу в статье. Когда страница полностью загружена - скрипт меняет содержимое body на эту страницу, а скролл перебрасывает в противоположную сторону (таким образом из конца главы №1 мы оказываемся в начале главы №2, а из начала главы №2 - в конце главы №1).

воскресенье, 8 декабря 2019 г.

Скрипт некорректно работает в браузере Internet Explorer. Как исправить?

#javascript #jquery #internet_explorer #браузер #прокрутка


Скрипт некорректно работает в браузере Internet Explorer. Во время прокрутки происходит
сильное дерганье блока то вверх то вниз. Как исправить?



$(function() {
    var $hor = $("#horizontal");
    $("body").css('padding-bottom', $(window).width()*2);
    var delta = 0;
    $(window).on('scroll', function () {
        var top = $(document).scrollTop();
        var width = $(window).width();
        var lim = $hor.position().top - (delta) - ($(window).height() - $hor.outerHeight())
/ 2;
        delta = Math.min(Math.max(top - lim, 0), width * 2);

        $(".horizontal:first", $hor).css({left : delta});
        $(".horizontal:last", $hor).css({left : -(width*2 - delta)});
        $("body").css({'padding-top': delta, 'padding-bottom': width*2 - delta});
    });
});
p {
    height: 500px;
}
#horizontal {
    position: relative;
    overflow: hidden;
    width: 100%;
    font-size: 3em;
    margin: 0;
    padding: 0;
    height: 250px;
}
#horizontal .horizontal {
    position: absolute;
    width: 100%;
    left: -100%;
    padding: 20px;
}
#horizontal .horizontal .h_blockquote {
    position: relative;
    width: 100%;
    margin: 0 auto;
    font-size: 24px;
    line-height: 1.3em;
    color: #000;
}

test

Скрипт некорректно работает в браузере Internet Explorer. Как исправить? Скрипт некорректно работает в браузере Internet Explorer. Как исправить?
Скрипт некорректно работает в браузере Internet Explorer. Как исправить? Скрипт некорректно работает в браузере Internet Explorer. Как исправить?

test


Ответы

Ответ 1



Исправить нельзя, потому что вначале происходит движение по event scroll и только потом срабатывает функция на scroll. (Вначале страница поднемается, а потом добавляется padding к bady). Как вариант, отлавливать прокрутку ролика мышки: (в коде надо только правельно выставить границы) var boo = true; var delta = 10; $("body").css('height', "6000px"); var $hor = $("#horizontal"); $(document).ready(function() { $('body').bind('mousewheel', function(e) { var width = $(window).width(); if (e.originalEvent.wheelDelta / 120 > 0) { boo = false; $("body").css("overflow", "inherit"); if ($(document).scrollTop() < 250 && !boo && (delta > 0 - $(".h_blockquote_wrap").width())) { $("body").css("overflow", "hidden"); delta -= 10; $(".horizontal").css({ left: delta + "px" }); if (delta < 0 - $(".h_blockquote_wrap").width()) { $("body").css("overflow", "inherit"); boo = true; } } } else { boo = true; $("body").css("overflow", "inherit"); if ($(document).scrollTop() > 250 && boo && (delta < $("#horizontal").width())) { $("body").css("overflow", "hidden"); delta += 10; $(".horizontal").css({ left: delta + "px" }); if (delta > $("#horizontal").width()) { $("body").css("overflow", "inherit"); boo = false; } } } }); }); p { height: 500px; } #horizontal { position: relative; overflow: hidden; width: 100%; font-size: 3em; margin: 0; padding: 0; height: 250px; outline: 2px solid red; } .horizontal { display: block; position: absolute; width: 100%; left: -100%; padding: 20px; float: left; } .h_blockquote { position: relative; width: 100%; margin: 0 auto; font-size: 15px; line-height: 1.3em; color: #000; }

test

Скрипт некорректно работает в браузере Internet Explorer. Как исправить?

test



воскресенье, 21 октября 2018 г.

margin-left для полосы прокрутки в Chrome

Имеется полоса прокрутки:
#parent { height: 200px; width: 300px; overflow-y: auto; } #child { height: 500px; width: 100%; background: teal; } ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: #f6f5f3; } ::-webkit-scrollbar-thumb { background: #c1c1c1; }


Хочу сделать, чтобы между полосой прокрутки и контентом (блок #child) было расстояние в 2px. По сути хочу написать ::-webkit-scrollbar { margin-left: 2px; }. Так не работает. Пробовал добавить padding-right: 2px к элементу #parent, но тогда если полосы прокрутки нет (то есть в блоке #child мало содержимого (в примере высота #child фиксирована, но в реальном проекте зависит от содержимого)), то будут лишние 2px пустого места. Как добавить расстояние 2px между полосой прокрутки и блоком #child?
Обновление:
У блока #parent имеется свойство overflow-y: auto;. То есть появится полоса прокрутки или нет зависит от высоты блока #child. В примере высота #child фиксирована, однако в реальном проекте зависит от содержимого (там динамически подгружаемый текст, много текста => появится полоса прокрутки, мало текста => не появится). Это всё к тому, что если полосы прокрутки нет, то решение не должно влиять на отображение. То есть хочется добавить 2px свободного места между контентом и полосой прокрутки, если полоса прокрутки есть, и ничего не добавлять, если её нет.


Ответ

#parent { height: 200px; width: 300px; overflow-y: auto; } #child { height: 500px; background: teal; } ::-webkit-scrollbar { width: 10px; // 8px (ширина полосы прокрутки) + 2px (расстояние между полосой прокрутки и контентом) } ::-webkit-scrollbar-track { background: #f6f5f3; } ::-webkit-scrollbar-thumb { background: #c1c1c1; border-left: solid 2px #fff; }


среда, 17 октября 2018 г.

Автоматический переход к якорю. Как?

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


Ответ

Набросал маленький скрипт реализации данной функции. На первый взгляд сложновато, но логику понять можно: У нас есть блоки с собственным скроллом. Когда мы листаем до конца, то один блок скрывается, а второй открывается уже со своим скороллом. Тем самым создаётся эффект, что ты начинаешь скроллить с начала страницы.
$(function() { var blocks_list = ['#block--0', '#block--1', '#block--2', '#block--3'], index = null; var $block = $('.block'); // Открываем первый блок location.href = '#block--0'; index = 0; // Запускаем скролл блоков $block.scroll(function() { var scroll_all = this.scrollHeight, scroll_top = $(this).scrollTop(), scroll_bottom = $(this).scrollTop() + $(window).height(); // ЕСЛИ ДОЛИСТАЛИ ДО НИЗУ И ЕСЛИ СЕЙЧАС ОТКРЫТ НЕ ПОСЛЕДНИЙ БЛОК if( scroll_bottom === scroll_all && index !== blocks_list.length - 1){ // Добавляем + 1 к индексу index++; // Заменяем адрес location.href = blocks_list[index]; // Скролим следущий блок, чтобы всё выглядело красиво $(blocks_list[index]).scrollTop( 50 ); }; // ЕСЛИ СКРОЛЛ ВВЕРХУ И ЕСЛИ СЕЙЧАС ОТКРЫТ НЕ ПЕРВЫЙ БЛОК if( scroll_top === 0 && index !== 0){ // Вычитаем - 1 у индекса index--; // Заменяем адрес location.href = blocks_list[index]; // Скролим пердидущий блок, чтобы всё выглядело красиво $(blocks_list[index]).scrollTop(function(e, scrollTop) { return scrollTop - 50; }); }; }); }); html, body {height: 100%; margin: 0} /* Скрываем все блоки */ .block { display: none; height: 100%; overflow: auto; } /* Открываем блок соответствующий якорю */ .block:target { display: block; } /* Стилизуем контент блоков */ .block-content { height: 1500px; padding: 50px 0 0; } #block--0 .block-content {background-color: #ff9191} #block--1 .block-content {background-color: #6dc36d} #block--2 .block-content {background-color: #8686c1} #block--3 .block-content {background-color: #e2e26e}

Текст 0
Текст 1
Текст 2
Текст 3

Саму идею вы поняли, а уже какой блок куда скролить и как стилизовать, решайте сами :)

четверг, 11 октября 2018 г.

Скрипт некорректно работает в браузере Internet Explorer. Как исправить?

Скрипт некорректно работает в браузере Internet Explorer. Во время прокрутки происходит сильное дерганье блока то вверх то вниз. Как исправить?
$(function() { var $hor = $("#horizontal"); $("body").css('padding-bottom', $(window).width()*2); var delta = 0; $(window).on('scroll', function () { var top = $(document).scrollTop(); var width = $(window).width(); var lim = $hor.position().top - (delta) - ($(window).height() - $hor.outerHeight()) / 2; delta = Math.min(Math.max(top - lim, 0), width * 2); $(".horizontal:first", $hor).css({left : delta}); $(".horizontal:last", $hor).css({left : -(width*2 - delta)}); $("body").css({'padding-top': delta, 'padding-bottom': width*2 - delta}); }); }); p { height: 500px; } #horizontal { position: relative; overflow: hidden; width: 100%; font-size: 3em; margin: 0; padding: 0; height: 250px; } #horizontal .horizontal { position: absolute; width: 100%; left: -100%; padding: 20px; } #horizontal .horizontal .h_blockquote { position: relative; width: 100%; margin: 0 auto; font-size: 24px; line-height: 1.3em; color: #000; }

test

Скрипт некорректно работает в браузере Internet Explorer. Как исправить? Скрипт некорректно работает в браузере Internet Explorer. Как исправить?
Скрипт некорректно работает в браузере Internet Explorer. Как исправить? Скрипт некорректно работает в браузере Internet Explorer. Как исправить?

test



Ответ

Исправить нельзя, потому что вначале происходит движение по event scroll и только потом срабатывает функция на scroll. (Вначале страница поднемается, а потом добавляется padding к bady). Как вариант, отлавливать прокрутку ролика мышки: (в коде надо только правельно выставить границы)
var boo = true; var delta = 10; $("body").css('height', "6000px"); var $hor = $("#horizontal"); $(document).ready(function() { $('body').bind('mousewheel', function(e) { var width = $(window).width(); if (e.originalEvent.wheelDelta / 120 > 0) { boo = false; $("body").css("overflow", "inherit"); if ($(document).scrollTop() < 250 && !boo && (delta > 0 - $(".h_blockquote_wrap").width())) { $("body").css("overflow", "hidden"); delta -= 10; $(".horizontal").css({ left: delta + "px" }); if (delta < 0 - $(".h_blockquote_wrap").width()) { $("body").css("overflow", "inherit"); boo = true; } } } else { boo = true; $("body").css("overflow", "inherit"); if ($(document).scrollTop() > 250 && boo && (delta < $("#horizontal").width())) { $("body").css("overflow", "hidden"); delta += 10; $(".horizontal").css({ left: delta + "px" }); if (delta > $("#horizontal").width()) { $("body").css("overflow", "inherit"); boo = false; } } } }); }); p { height: 500px; } #horizontal { position: relative; overflow: hidden; width: 100%; font-size: 3em; margin: 0; padding: 0; height: 250px; outline: 2px solid red; } .horizontal { display: block; position: absolute; width: 100%; left: -100%; padding: 20px; float: left; } .h_blockquote { position: relative; width: 100%; margin: 0 auto; font-size: 15px; line-height: 1.3em; color: #000; }

test

Скрипт некорректно работает в браузере Internet Explorer. Как исправить?

test