Тень блока CSS на элементе div контейнера вызывает полосы прокрутки - PullRequest
7 голосов
/ 02 марта 2010

У меня есть сайт со следующей настройкой:

<div id="container">
   <div id="header"></div>
   <div id="content"></div>
   <div id="clearfooter"></div>
</div>
<div id="footer"></div>

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

Моя проблема в том, что я хотел бы применить тень к блоку контейнера следующим образом:

#container {width:960px; min-height:100%; margin:0px auto -32px auto; 
           position:relative; padding:0px; background-color:#e6e6e6; 
           -moz-box-shadow: -3px 0px 5px rgba(0,0,0,.8), 
           3px 0px 5px rgba(0,0,0,.8);}
#header   {height:106px; position:relative;}
#content   {margin:0px; padding:10px 30px 10px 30px; position:relative;}
#clearFooter {height:32px; clear:both; display:block; padding:0px; margin:0px;}
#footer   {height:32px; padding:0px; position:relative; width:960px; 
           margin:0px auto 0px auto;}

Как вы можете видеть его тень на каждой стороне контейнера div. Однако при этом, когда содержимое не занимает полную высоту, по-прежнему существуют полосы прокрутки, вызванные тем, что из-за размытия тень проталкивает нижнюю часть нижнего колонтитула.

Есть ли какой-нибудь способ не дать тени пройти через край контейнера div и вызвать полосу прокрутки?

Спасибо за вашу помощь!

Ответы [ 9 ]

9 голосов
/ 11 июля 2010

Webkit недавно изменил свое поведение, как указано здесь: http://archivist.incutio.com/viewlist/css-discuss/109662

Действительно, на сегодняшний день это все еще проблема в Gecko и, возможно, в других браузерах.


Мне удалось исправить эту неприятную проблему в Gecko, используя отрицательные поля, которые также работают во всех других браузерах.

Предположим, у вас есть элемент (E) на весь экран с примененной тенью от блока с нулевым смещением и радиусом размытия R. Предположим, что вы имеете дело с проблемой горизонтальной полосы прокрутки, поскольку тень приводит к ретрансляции элемента E с добавленной шириной. *

  1. обернуть E вспомогательным элементом-оберткой (W)
  2. установить переполнение: скрыто на W
  3. установить отступ: R 0 R 0 на W
  4. установить запас: -R 0 -R 0 для W

Идея состоит в том, чтобы использовать скрытое переполнение, чтобы вырезать проблемные тени слева и справа. А затем используйте отступы + трюк с отрицательным полем, чтобы не обрезать верхнюю и нижнюю тени и удерживать прямоугольник на одном и том же месте в потоке HTML.

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

1 голос
/ 02 сентября 2010

Лучшее решение для меня, по крайней мере, так как в нем нет обертывающего элемента, это поместить обтравочный прямоугольник на элемент с тенью.

В приведенном выше примере что-то вроде clip: rect(-LARGE_VALUE -LARGE_VALUE auto LARGE_VALUE) будет обрезать тень только внизу.

1 голос
/ 11 июля 2010

Попробуйте добавить padding-bottom: 8px (высота тени + размер размытия) к элементу # .

1 голос
/ 04 марта 2010

В родительском элементе #container добавление overflow: visible может решить проблему.

Хотя в качестве общего совета для нижнего колонтитула внизу, вы можете вместо этого забыть об установке min-height на #container и вместо этого установить нижний колонтитул с помощью position: absolute и bottom: 0 и дать #container a margin-bottom чтобы он никогда не скрывался за нижним колонтитулом. Если вы хотите, чтобы нижний колонтитул находился внизу окна, просто используйте position: fixed.

Надеюсь, это поможет.

1 голос
/ 02 марта 2010

Имхо, и согласно моим тестам кажется, что тень css на элементе увеличивает как общую ширину, так и высоту страницы (если окружающий элемент имеет ширину или высоту, равную 100%), как вы сказали, и я не нашел обходной путь css для этой проблемы еще.

Итак, у меня к вам вопрос, как вы держите нижний колонтитул внизу страницы? а какую ширину имеет нижний колонтитул?

Я пробовал с абсолютным позиционированием (как я привык делать, когда мне нужен нижний колонтитул внизу страницы), но проблема То же самое с шириной, конечно, вы можете установить ширину в процентах как 90% но проблема остается ... вот фрагмент, который иллюстрирует эту простую концепцию Так что это не настоящий ответ, я пока не нашел решения для этого

Pastebin

Надеюсь, это полезно

0 голосов
/ 02 ноября 2017

Пожалуйста, добавьте position: relative; в ваш теневой div, удалите из заголовка, содержимого, нижнего колонтитула. Это работа на моей стороне.

0 голосов
/ 05 мая 2011

У меня есть div, который равен 100% высоты (т.е. полная высота на экране), и была тень от коробки:
box-shadow: 0 0 10px rgba(0,0,0,0.4);

Это приводило к появлению полос прокрутки, даже если содержимое было не длиннее экрана.

Все, что я сделал, это установил отрицательное вертикальное смещение: box-shadow: 0 -10px 10px rgba(0,0,0,0.4); и это решило.

0 голосов
/ 16 июня 2010

Не уверен, что это лучшее решение, так как вам нужно добавить контейнерный div, но если вы оберните элемент в контейнерный div и установите переполнение скрытым, похоже, это работает. Вы должны будете установить отступ там, где хотите, чтобы тень была видимой.

Я знаю, что это не лучшее решение для этого, но оно прекрасно работает, и я не могу найти никакого другого решения.

0 голосов
/ 13 мая 2010

Ну, либо решение этой проблемы очень неясно, либо не существует решения с современной технологией. Очень жаль, что это невозможно сделать, так как это общая тема в веб-дизайне.

Я прибегнул к использованию тени png, так как она кажется единственным разумным решением.

...