Подтвердить что ты не робот

CSS: make overflow-x: скрытый по-настоящему скрытый?

У меня есть div, который имеет стиль overflow-x: hidden, но я нахожу, что, когда в нем есть более широкий div, содержащий текст, пользователь может по-прежнему перетаскивать бок с помощью мыши, чтобы просмотреть скрытый текст.

Я хотел бы предотвратить это и сделать текст действительно скрытым. Этот jsfiddle должен показать, что я имею в виду: http://jsfiddle.net/YzsGF/11/ или вот код:

<div id="outer">
   <div id="inner">
       How can I truly hide the text beyond the margin?
    </div>
</div>
#outer { 
    width: 150px; 
    height: 300px; 
    overflow-x: hidden;
    border: 1px solid black;
}
#inner { 
    width: 300px;
    overflow-x: hidden;
}

Есть ли способ, которым я могу запретить пользователю видеть скрытый текст?

UPDATE: мне нужно переполнение-y для работы: это нормально, что overflow-x - только CSS3. Это может помочь объяснить реальный сценарий:

  • У меня есть внутренний div фиксированной ширины, но неизвестной длины.
  • Когда он достаточно короткий, чтобы поместиться в внешний div без панели y-scrollbar, все будет хорошо.
  • Когда внутренний div становится достаточно длинным, чтобы внешний div нуждался в панели y-scrollbar, появляется один, но отсекает часть правого содержимого внутреннего div. Это также ОК (я упустил некоторое дополнение RH), но не совсем то, что пользователь может выбрать текст и перетащить его вбок, показывая пустое заполнение RH и скрывая часть текста на стороне LH.

Любые решения?

4b9b3361

Ответ 1

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

#inner { 
position:absolute;
clip:rect(0px,150px,150px,0px);
width: 300px;
}

Пример:

http://jsfiddle.net/DigitalBiscuits/YzsGF/18/

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

Подробнее здесь http://www.w3schools.com/cssref/pr_pos_clip.asp

Ответ 2

Я не уверен, нужна ли вам ось y внутреннего div для прокрутки, но если вы этого не сделаете, это должно соответствовать вашим потребностям:

#outer { 
    width: 150px; 
    height: 300px;
    overflow-x: hidden;
    border: 1px solid black;
}
#inner { 
    overflow: hidden;
    width: 100%;
}​

Кажется, что переполнение и переполнение-x ведут себя иначе друг от друга. http://jsfiddle.net/G3T9w/5/

Ответ 3

overflow-x: hidden, в отличие от overflow: hidden не отключает прокрутку. Это просто заставляет содержимое обрезать и скрывать полосу прокрутки. Сам элемент по-прежнему прокручивается через javascript или, как вы обнаружили в некоторых сценариях выбора, где элемент автоматически прокручивается.

Нет никакого решения без JavaScript, а javascript все еще запутан, потому что onscroll не срабатывает, если полоса прокрутки не видна (то есть событие onscroll привязано к позиции изменения полосы прокрутки, а не фактическая прокрутка элемента).

Существуют различные способы обхода. Andrew Dunn решение размещения overflow:hidden на обертке, а установка обертки по ширине вашего контейнера - одна. Но это просто работает вокруг проблемы, не фиксирует актуальную проблему. Но если вы в порядке с этим, то это, вероятно, хороший выбор. Имейте в виду, что вам необходимо применить эту технику ко всем элементам контейнера, или вы можете столкнуться с той же проблемой.

Ответ 4

Предполагая, что упрощенный код HTML:

<html><body><div class=wrap>content...</div></body></html>

Установите оба тела, html в высоту: 100%;

body, html {height:100%;}

Поместите div внутри тела и установите его на всю высоту тела:

div.wrap {height:100%; overflow:hidden;}

Это предотвратит прокрутку окна от странных способов, например, нажатие колесика мыши и перемещение, использование якорей и т.д.

Чтобы удалить панель прокрутки (визуально), вы также должны добавить:

body {overflow: hidden; }

Чтобы отключить прокрутку с помощью клавиш со стрелками на клавиатуре:

window.addEventListener("keydown", function(e) {
    // space, page up, page down and arrow keys:
    if([32, 33, 34, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
        e.preventDefault();
    }
}, false);

Ответ 5

Самый простой ответ, который работает для меня, - добавить стиль CSS position: fixed; в тег <body>.