Firefox и CSS3: использование переполнения: скрытый и box-shadow
Я не уверен, относится ли эта ошибка только к Firefox, а также к браузерам на базе WebKit, но это действительно очень раздражает.
У меня есть шаблон/фреймворк для моего интерфейса CMS, с использованием box-shadow на нескольких элементах шириной 100%. Поскольку это вызывает тень с правой стороны элемента, появляется полоса прокрутки. Чтобы скрыть уродливую полосу прокрутки, я устанавливал "overflow: hidden" в элементе body и на обертке div.
Это вызывает странное поведение. Хотя нет полос прокрутки, страница по-прежнему прокручивается вправо, когда я прокручиваю ее с помощью сенсорной панели (горизонтальная прокрутка). Я пробовал чертовски много и искал свою задницу, но я не могу найти решение для этого.
Кто-нибудь знает решение проблемы? или это просто пример противоречивой реализации css3 box-shadow?
Ответы
Ответ 1
У меня была эта проблема с дизайном, над которым я работал. В принципе, Firefox создает прокручиваемую область для любой тени, которая проходит мимо правого края страницы. По какой-то причине Firefox не создает прокручиваемую область, если тень распространяется влево. Поэтому мое простое решение - полностью перемещать тень влево.
Проблемный код:
-moz-box-shadow: 5px 5px 5px #000;
Простое решение:
-moz-box-shadow: -5px 5px 5px #000;
Я попробовал установить смещение x на 0px, но поскольку размытие равно 5, все еще была область прокрутки шириной 2-3px.
Ответ 2
Поскольку я имею дело с той же досадной проблемой, я пойду дальше и включусь здесь, чтобы сказать, что это определенно дерьмовая функция (если она действительно упоминается как функция). Чтобы иметь тень в коробке, полоса прокрутки бесполезна, хотя я был бы счастлив съесть свои слова, если бы кто-то мог дать мне серьезную причину действительно, которая должна быть такой.
Я думаю, что ответ здесь лишь слегка изменил страницу и позволил пользователям firefox пропустить тень коробки. Достаточно легко, если вы просто не объявляете -moz-box-shadow
.
Ответ 3
Перейдите ко второму абзацу для фактического решения.
В зависимости от ваших потребностей моя проблема и решение, которые я нашел для себя, могут удовлетворить ваши потребности. Я обнаружил, что моя проблема была очень похожа, без полосы прокрутки, когда body { overflow: hidden; }
, причина, по-моему, в том, что размеры элементов html и body на самом деле продиктованы размером области видимости окна браузера.
Решение. Если вы выдаете только переполнение с оси x, вы можете сделать body{ overflow-x: hidden; }
, а затем используя javascript или медиа-запросы, вы можете легко изменить свойства, применяемые к элементу body, и изменить его на все, что угодно.
Пример:
body { overflow-x: hidden; }
@media screen and (min-width: 1200px) {
body { overflow-x: visible; }
}
надеюсь, что это поможет.
Ответ 4
Во-первых, будьте осторожны, указывая на кого-то еще, как на причину ваших проблем. Подумайте сами, что более вероятно, что проблема связана с частью кода, используемой пользователями 200k и разработчиками 20k на ежедневной основе, или что это в используемой вами вещи в течение 4 часов.
Тем не менее, ваш следующий шаг должен состоять в том, чтобы уменьшить это до простой тестовой страницы, содержащей достаточно HTML для демонстрации поведения. В вашем случае это будет такая страница:
<html>
<body style="overflow:hidden;">
<div style="box-shadow:whatever;">
This should cause scrollbars to show
</div>
</body>
</html>
Произойдет одна из двух вещей:
Либо проблема не появится, и в этом случае вы постепенно добавляете другие вещи на свою реальную страницу, пока не узнаете, что действительно вызывает проблему.
Или проблема все равно будет там, и в этом случае вы можете сообщить нам об этом здесь. Затем вы также сможете подать отчет об ошибке с пользователями Mozilla.
Удачи!
Ответ 5
Хотя это может быть неприятно слышать, это не ошибка, это действительно особенность. Если есть полоса прокрутки/прокручиваемая область, и область активирована, и стрелка или другое устройство ввода стреляют, область будет прокручиваться.
Чтобы противодействовать этому, вы можете попытаться бороться с каждым возможным пользовательским вводом (прокрутка сенсорной панели, клавиши со стрелками, выделение и перетаскивание) с помощью javascript, но лучшим ответом для вас является переосмыслить, как вы используете CSS здесь. Попробуйте использовать width:auto
вместо width:100%
, например.
Чтобы продемонстрировать (обновить):
CSS
#parent { width:50px; height:20px;overflow:hidden; }
#overflow { width:50px;height:50px;overflow:auto; }
HTML:
<div id="parent">
<div id="overflow">blahaahhahahahahahahahahahahaaaaaaaaaaahahahahahaaaaaaaaaaaaaaahhhhhhhhhhhhhhhhhhahhaahahaha</div>
</div>
Поднимите высоту на #parent
до 50 пикселей, и вы увидите, что полоса прокрутки все еще - су, она просто закрыта; содержимое не скрывается безвозвратно. Установите overflow:hidden
на #overflow
и нет полос прокрутки.
Ответ 6
Я не знаю вашего макета сайта, но по моему я только хочу вертикальную прокрутку, а не горизонтальную. Это служит основой для того, почему ядро-тень, вызывающее горизонтальную прокрутку, для меня нежелательно, так как мой CSS-сайт теперь создан для макетов, растянутых горизонтально за пределы области просмотра.
Я смог исправить его в Firefox 3.6 (все, что я тестировал) и проверил его кросс-браузер в Google Chrome 8.0.552.327 и IE 8 со следующим правилом CSS в моем элементе body:
body{
overflow-x: hidden;
}
Ответ 7
Вы можете использовать радиус распространения (4-я длина), чтобы размер тени был меньше размера элемента, а затем большое смещение y, чтобы оно отображалось под элементом. Что-то вроде box-shadow: 0 10px 10px -5px black;
(конечно, я не знаю, какие значения вам нужны, так как вы не предоставили скрипку, вам нужно поиграть с ними в инструментах dev). Имейте в виду, что радиус распространения заставляет тень расширяться/сжиматься со всех сторон. Так, например, радиус распространения -1px фактически сделает тенью 2px уже.