Скрыть полосу прокрутки вложенного div, но все же сделать ее прокручиваемой

Это является ссылкой, которую я использовал, в которой объясняется, как скрывать прокрутку div с помощью скрытой полосы прокрутки. Единственное различие заключается в том, что у меня есть вложенные div. Проверьте мой fiddle

HTML:

<div id="main">
    <div id="sub-main">
        <div id="content">
            <div id="item-container">
                <div class="item">a</div>
                <div class="item">b</div>
                <div class="item">c</div>
            </div>
        </div>
    </div>
</div>

CSS

#main {
    width: 500px;
    height: 500px;
}

#sub-main {
    width: 500px;
    height: 500px;
    overflow: hidden;
}

#content {
    background-color: red;
    width: 500px;
    height: 500px;
    overflow: auto;
}

#item-container {
    width: 1500px;
    height: 500px;
}

.item {
    width: 500px;
    height: 500px;
    font-size: 25em;
    text-align: center;
    float: left;
}

Как и выше, у меня есть переполненный горизонтальный div, и я хочу скрыть его полосу прокрутки. Я должен сделать это еще прокручиваемым, потому что $.scrollTo() не будет работать иначе.

UPDATE:

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

  • Когда я устанавливаю overflow: hidden в родительский контейнер прокручиваемых элементов, я не могу прокручивать (собственные функции прокрутки javascript тоже не работают).
  • Я хочу прокрутить только переполненный контейнер, а не все окно. Это можно сделать, установив цель в $.localScroll({ target: '#projects-content' }), но ничто не прокручивается, когда я устанавливаю цель. Если я этого не сделаю, прокрутка работает до тех пор, пока overflow:hidden не применяется. Опять же, любая помощь будет принята с благодарностью.

HTML:

<div id="projects"> <!-- start of entire projects page -->
  <div id="project-sidebar">
    <a href="#project-first">
      <div class="sidebar-item sidebar-first">first</div>
    </a>
    <a href="#project-second">
      <div class="sidebar-item sidebar-second">second</div>
    </a>
    <a href="#">
      <div class="sidebar-item sidebar-third">third</div>
    </a>
  </div>

  <div id="project-content"> <!-- this must be the scrollable itmes' container, not the entire window -->
    <div id="project-first" class="project-item"> 
      <!-- these items should be scrollable -->
      <div class="project-subitem" id="first-sub1">
        <a href='#first-sub2' class='next'>next</a>
      </div>
      <div class='project-subitem' id='first-sub2'>
        <a href='#first-sub1' class='prev'>prev</a>
      </div>
      <!-- end of scrollable items -->
    </div>
  </div> <!-- end of scroll scroll container -->
</div> <!-- end of entire projects page -->

<script>
  // FIXME: when I set target, nothing scrolls.
  // But I don't want the entire window to scroll
  $('#projects').localScroll({
    //target: '#project-content',
    hash: false
  });
</script>

CSS

#project-content {
  width: 80%;
  height: 100%;
  position: relative;
  float: left;
}

#project-sidebar {
  float: left;
  width: 20%;
  height: 100%;
}

.project-item {
  width: 300%;
  height: 100%;
}

.project-subitem {
  height: 100%;
  width: 33.33%;
  position: relative;
  float: left;
}

Update:

После добавления overflow:scroll в #project-content прокрутка работает, как и ожидалось. Все, что мне нужно сейчас, это заставить полосы прокрутки исчезнуть в #project-content. Я попробовал добавить overflow:hidden к своему родителю, но не имел успеха. Я также попытался добавить его в html, body, но тогда весь документ отказывается принимать любые прокрутки, такие как scrollTop().

Любая помощь будет принята с благодарностью!

Ответ 1

Теория:

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

Hide scollbar

Практика:

В вашем случае я предлагаю использовать абсолютное позиционирование и отрицательное нижнее значение на #project-content, чтобы оно переполнило его родительский контейнер (#projects) внизу.

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

Это CSS, который вы должны добавить на свой сайт:

#projects{
    position: relative;
}

#project-content{
    position: absolute;
    top: 0;
    left: 20%;
    bottom: -30px;
    /* remove: 
        height: 100%; 
        position: relative; 
        float: left; 
        padding-bottom: -15px
    /*
}

Ответ 2

scollbars занимают около 20 пикселей, поэтому просто прокручивайтесь div 20px выше и на 20px шире, и ваши полосы прокрутки будут скрыты:

#content {
    background-color: red;
    width: 520px;
    height: 520px;
    overflow: auto;
}

Пример

Ответ 3

Это своего рода обман, но вы можете скрыть его за #content следующим образом DEMO

#content {
    background-color: red;
    width: 500px;
    height: 480px;
    overflow: hidden;
}

#item-container {
    width: 1500px;
    height: 500px;
    overflow: scroll;
}

Ответ 4

Если вы знаете все контейнеры, которые можно прокручивать, вы можете скрыть полосу прокрутки с помощью CSS и немного JS. Для браузеров на веб-страницах (сафари, google chrome, opera) это будет только CSS-решение, чтобы установить ширину полосы прокрутки в 0. Для IE, Firefox и других браузеров, не являющихся веб-сайтами, вы должны рассчитать ширину полосы прокрутки, которая будет использоваться как отрицательная маржа, прямо для вас прокручиваемый контент.

Чтобы сделать это, вы должны обернуть свой контент в div с помощью overflow-y:scroll, чтобы всегда показывать вертикальную полосу прокрутки и скрывать эту полосу прокрутки с помощью margin-right:-17px и parent overflow:hidden. Пример здесь. Нет необходимости устанавливать фиксированную ширину или высоту.

Это метод, используемый в jQuery Scrollbar. Скрытие горизонтальной полосы прокрутки более сложное и требует обработки изменений содержимого для пересчета высоты контейнера.

Ответ 5

Я обычно добавляю padding:0 1em 1em 0; к элементу, где он должен быть скрыт, это скрывает обе полосы прокрутки, если у родителя есть переполнение: hidden. настройте padding-bottom или только padding-right, если нужно скрыть только один из них.

1em - средняя ширина полос прокрутки в большинстве браузеров: http://jsfiddle.net/5GCsJ/912/

Ответ 6

Решение для самого содержимого с горизонтальной прокруткой.

Просто увеличьте высоту #main и #content.

#main {
    width: 500px;
    height: 520px;

}

#sub-main {
    overflow: hidden;

}

#content {
    background-color: red;
    width: 500px;
    height: 520px;
    overflow: auto;

}

#item-container {
    width: 1500px;
    height: 500px;
    overflow: hidden;
}

.item {
    width: 500px;
    height: 500px;
    font-size: 25em;
    text-align: center;
    float: left;
}

Ответ 7

  • Используйте script для создания пользовательских полос прокрутки.

http://manos.malihu.gr/jquery-custom-content-scroller/

  • Затем используйте CSS (или измените script или измените script config), чтобы скрыть пользовательские полосы прокрутки.

Ответ 8

Я сделал это грубо, используя jQuery и ваш пример

Отметьте fiddle:

Я просто обнаружил направление колеса прокрутки и нажал полосу прокрутки с помощью jQuery

$(document).ready(function(){
    $('#content').bind('mousewheel', function(e){
        var curScroll = $("#content").scrollLeft();
        if(e.originalEvent.wheelDelta > 0) {            
            $("#content").scrollLeft(curScroll-500);
        } else {
            $("#content").scrollLeft(curScroll+500);
        }
    });
});

Это "грубо", потому что я жестко закодировал некоторые значения, такие как количество 500 пикселей, чтобы прокрутить, вы могли бы написать еще несколько javascript для динамического определения количества прокрутки. Плюс я не знаю, будет ли значение wheelDelta +120 для up и -120 для down, для вас и других пользователей.

Также обратите внимание, что scrolLeft() может быть анимированным.. для более плавных переходов.