Установка границы прокручиваемого фрейма HTML

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

Рамка не имеет фиксированного размера, она заполняет всю левую часть окна браузера и меняет размер, когда пользователь изменяет размер окна браузера.

Фрейм дерева (и минимальный контекст) определяется как:

<html>
<head><title></title></head>
<frameset cols="250,*" frameborder="0" framespacing="0" >  
    <frame src="tree.html" scrolling="auto" /> 
    <frame src="about:blank" name="navTarget" scrolling="auto" /> 
</frameset>
</html>

В содержимом фрейма (tree.html) я определяю границу как:

<style type="text/css">
    html {
        border-right: red 2px solid;
        background: yellow;
    }
</style>

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

Однако, если дерево «слишком маленькое» и не расширяется, чтобы заполнить всю область кадра, тогда граница не заполнит всю правую часть кадра, а остановится на полпути вниз.

Содержимое дерева не будет в кадре

ОБНОВЛЕНИЕ: похоже, это зависит от браузера. В Firefox 8 и Opera 11 граница содержимого обрезана, но в Chrome она заполняет всю правую границу рамки.

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

<style type="text/css">
    html {
        height: 100%;
        border-right: blue 2px solid;
        background:yellow;
    }
</style>

Но в этом случае, когда дерево достаточно велико и требует прокрутки, вы заметите, что граница исчезает при прокрутке вниз. По крайней мере, в современных браузерах, таких как IE8+, Firefox, Chrome и Opera. В IE6 граница по какой-то причине остается на месте при прокрутке.

Граница исчезает при прокрутке вниз

ОБНОВЛЕНИЕ: Это не удается (т.е. граница исчезает при прокрутке) во всех Chrome, Firefox и Opera.

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

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

РЕШЕНИЕ:

Наконец, найденное решение состояло в том, чтобы установить границу элемента BODY вместо HTML, а также установить высоту элемента HTML на 100% и минимальную высоту элемента BODY на 100%.

Использование min-height для BODY вместо height гарантирует, что граница не исчезнет при прокрутке и заполнит всю границу для «слишком короткого» содержимого.

<style type="text/css">
    html { height:100%; }
    body { min-height:100%; }
    body { border-right:blue 2px solid; }
</style>

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

<!--[if lt IE 7]>
<style type="text/css">
body { height:100%; }
</style>
<![endif]-->

person Niklas Bäckman    schedule 15.11.2011    source источник
comment
вы не можете добавить стиль border не на внутреннюю html-страницу, а в iframe?   -  person Zoltan Toth    schedule 15.11.2011
comment
Но в этом случае, когда дерево достаточно велико, чтобы потребовать прокрутки, вы заметите, что граница исчезает, когда вы прокручиваете вниз --› Я просто думаю, что полоса прокрутки перекрывает ваши правые границы. Но это утверждение меня смущает. Граница исчезает только при прокрутке вниз?   -  person vantrung -cuncon    schedule 16.11.2011
comment
Граница исчезает только при прокрутке вниз. Да, до того, как вы начнете прокручивать, она заполняет всю правую часть содержимого фрейма, но части содержимого внизу, которые становятся видимыми при прокрутке вниз, по какой-то причине не имеют границы. Я предполагаю, что это связано с тем, что граница создается с высоты: 100%, которая будет размером фрейма хостинга. Так что только для видимой области содержимого, а не для всей прокручиваемой области.   -  person Niklas Bäckman    schedule 16.11.2011


Ответы (1)


Ага. Как сказал @Zoltan Toth, добавьте стили в сам iframe... (вам также может понадобиться атрибут frameborder="0" в некоторых браузерах, и вы захотите сделать:

ОБНОВЛЕНО:

В стилях tree.html:

body { border:0; border-right: 2px solid blue; min-height: 400px; /* change this */ }

В справочном документе:

<iframe src="tree.html" frameborder="0" style="border:0; width:400px; height:400px; "></iframe>
person landons    schedule 15.11.2011
comment
Спасибо за ответ, но, похоже, это не совсем работает. Когда вы применяете стиль border-right к фрейму, он помещается не с той стороны полосы прокрутки (когда она видна); Я хочу, чтобы это было слева от полосы прокрутки, а не справа. Таким образом, кажется, что граница должна быть определена в содержимом фрейма, а не в самом фрейме. - person Niklas Bäckman; 15.11.2011
comment
Я не думаю, что будет работать фиксированная высота рамки, так как это не соответствует требованиям. Я использую не iframe, а обычный фрейм внутри набора фреймов. Я отредактировал вопрос, чтобы сделать это более ясным. Хотя, если ничего не работает, возможно, min-height (даже если он не работает в IE6) можно было бы использовать, чтобы сделать его хотя бы немного лучше. Я думаю, нужно быть осторожным, чтобы выбранное значение не было слишком большим и не вызывало появление ненужных полос прокрутки. - person Niklas Bäckman; 16.11.2011
comment
В этом случае я бы сделал повторяющееся фоновое изображение на вашей странице tree.html. Просто синий .gif шириной 2 пикселя и высотой 1 пиксель, повтор-y - person landons; 16.11.2011
comment
Ну, что вы видите, использование фонового изображения css сделало свое дело. Спасибо за этот совет! Я закончил с этим CSS html, #idTreeContainer { background-image:url('images/tree_border.png'); фон-повтор: повтор-y; background-position:справа вверху; } . По какой-то причине пришлось указать это и в контейнере дерева. Если бы я сделал это для границы справа, я получил бы двойные границы, но не для фонового изображения. Ну пока работает! (Хотя решение, не использующее подобный хак, было бы предпочтительнее, наличие отдельного образа для обслуживания и, возможно, обновления позже не является идеальным.) - person Niklas Bäckman; 16.11.2011
comment
Конечно. Если бы вы хотели просто изменить цвет или ширину, это было бы сложно. Но, учитывая ваши другие требования (неизвестная высота, отсутствие ненужной полосы прокрутки и т. д.), это кажется наименее хакерским;). Рад, что это сработало. - person landons; 16.11.2011
comment
После прочтения этой страницы (phrogz.net/css/htmlvsbody.html) и понимания отношения между html и элементами тела лучше, мне действительно удалось найти менее хакерское решение. Но это также благодаря вашему предложению минимальной высоты! Я добавлю свой собственный ответ на это. - person Niklas Bäckman; 16.11.2011
comment
Большой! Устойчивые решения, ftw. - person landons; 16.11.2011