Cколько-то способов min-height
29 Ноября, 2007Несколько способов реализации min-height для всех броузеров. Короткий обобщающий пост. Надеюсь все оценили как я изящно избежал цифры в названии поста?=)
Свойство нужное, часто полезное, но в Internet Explorer не работает. Далее способы вразумить синюю букву Е.
1. min-height через height
Говорят, разработчики IE5-6 реализовали свойство min-height, просто решили его назвать height, так оно вобщем то и есть. height для 5й и 6й версий ведет себя как min-height. В 7й версии min-height уже работает. Потому вопрос лишь в том, как им всем отдать свои значения. Об этом позаботился Дастин Диаз:
- .block {
- min-height:200px;
- height:auto !important;
- height:200px;
- }
Комментировать особо нечего – это работает. Первая колонка в примере.
На данный момент, в силу того что ИЕ7 уже поддерживает min-height, два другие способа я привожу скорее как историческую справку и пример интересных приемов.
2. min-height с помощью padding
Так же можно эмулировать минимальную высоту с помощью комбинации:
- .block{padding-top:200px}
- .block .inner{margin-top:-200px}
Этот способ требует однако дополнительного элемента “.inner”, тем не менее является пожалуй самым простым и иногда удобным.
Что бы кусок кода был максимально универсальным – лучше добавлять аж 2 обертки:
- .block .inner{padding-top:200px}
- .block .inner1{margin-top:-200px}
В примере я вместо второй обертки использовал элемент h2.
- Подробнее в блоге у Dave Shea
3. min-height с помощью expression
Как всегда все можно решить с помощью джаваскрипт.
До того как вышла 7ая версия можно было делать так:
- .block{height: expression(’32px’); min-height: 32px;}
Однако этот вариант не работает в 7й версии.
Более универсально и в лоб, проблема решается так:
- .block {
- height: expression(this.scrollHeight < 201px ? "200px" : "auto" );
- min-height: 200px;
- }
Или что бы ускорить работу скрипта, как советует Павел Корнилов, this можно опустить:
- .block {
- height: expression(scrollHeight < 201px ? "200px" : "auto" );
Для body, однако, так нельзя оптимизировать.
В конце
Буду рад услышать ваши методы и мысли по поводу решения этой проблемы!
Давно пользуюсь №1. Про второй не знал. Expression не люблю.
2 и 3й уже скорее дань истории, пока не было min-height в ИЕ7(а в бетах ее не было) приходилось к ним прибегать.
якщо мета питання про min-height – приліпити .footer до нижньої межі “бровзера” –
http://www.themaninblue.com/experiment/footerStickAlt/
молодца, давно было их все вместе собрать =)
romand: мета може бути різною – я частіше використовував для чисто дизайнерськіх моментів, але лінк звісно хороший та відомий – нехай буде =)
Zigzag: дякую!
Первым способом пользуюсь постоянно. Про второй не знал. Спасибо за него.
Только первый вариант! :)
Экспрешнами по возможности лучше не пользоваться. Вредит сильно быстродействию (кроме того, что JS-зависимо).
Второй способ требует дополнительного элемента в маркапе.
Так что лично для меня только первый :)
Если работает первый метод, то зачем изобретать велосипед?
В любом случае, интересно было узнать что-то новое (2й и 3й метод =) Спасибо!
А Conditional Comments использовать для чистоты основного CSS-файла это уже не модно? :) И никаких странных хаков, перехаков.
дада, так и есть, просто я проморгал поддержку min-height у IE7, и пост этот писал чуть не год назад, когда это было актуально, просто вот подзадержался он =). Стоит убрать этот один маленький нюанс – и уже нужны все три метода. :) Вобщем то на данный момент самым простым и правильным остается первый. Эх как быстро время бежит
@ЖенатыйAgat: дык хаки то валидные =) Чего лишний раз кондкомментить
Что-то я не понимаю про expression.
Это все браузеры поймут?
А какие преимущества перед JavaScript в отдельном файле?
Преимущества, что его(js) только ради этих целей можно не создавать, а описать это поведение в CSS. Оно отчасти и логично, ведь все что делает этот кусочек js — это эмуляция CSS свойства min-height.
Поймет это конечно только IE, а все остальные уже поддерживают min-height.
Я выложу :)
height: expression(this.scrollHeight < 201px ? “200px” : “auto” );
меняется на
height: expression(scrollHeight < 201 ? “200px” : “auto” );
Прооптимизировать это для динамического контента, или, если требуется зависимость от ширины окна браузера невозможно.
Еще есть способ, задать минимальную ширину вставив прозрачный gif, например тем же экспрешеном, вот это запросто оптимизируется. Можно развернуться и красиво написать.
а как на счет
.block { min-height:200px; *height:200px; }или валидность на первом месте?)
Отличный рабочий вариант, но тот(Дастина Диаза) не так из-за валидности рулит, как из-за future-proof.
Кто их знает как броузеры будут понимать эту * через пару лет, а !important – все же четко описан. Да и сафари иногда грешит пониманием невалидных ЦСС.
Впрочем де факто думаю это решение еще года два можно смело применять. =) не забывая тестить
Мой вариант такой:
.block { min-height: 200px; } * html .block { height: 200px; }Спасибо, пригодится!
Вот только у меня тот же вопрос возник, что и у Романа выше – зачем нужны другие способы если есть первый?
Я в 11 комментарии вроде как ответил =) Теперь уже больше для справки и как примеры идей, которые возможно применить в других областях.
К примеру второй метод можно легко приложить к кендо.
По второму способу заморачивался не давно:
http://trifler.ru/blog/post_1192811790.html
http://trifler.ru/blog/post_1193561490.html
Увы, масса дополнительных блоков является большим минусом.
Поэтому варианты 1 и 3 предпочтительней.
Все изложенные способы не очень практичны и ущербны.
1. Для эластичной верстки, как правило, часто блоку необходимо ДЕРЖАТЬ ВЫСОТУ ОКНА и только в случае малых размеров скролироваться, сохраняя дизайн и целостность юзабилити. При этом фиксированная в 200px высота не катит и след. метод №1 тоже не катит.
Остается скрипт все равно в виде expression или js.
width: expression(document.body.clientHeight > 200 ? “100%” : “200px”)
2. НО Действительно НАСТОЯЩЕЙ проблемой на сегодняшний момент является проблема больших мониторов (24″ и более), которых становится уже предостаточно. Проблема состоит в том – каким образом установить ОДНОВРЕМЕННО min-height и max-height ????
1) Вы видимо имели ввиду резиновой верстки? Эластичная — это зависимая от размера шрифта, такая принята терминология.
Решение проблемы высоты в экран куда проще – http://www.themaninblue.com/experiment/footerStickAlt/. Если я неправильно понял – покажите сайт с тем поведением которого вы хотите достигнуть, а то я слегка запутался в том почему методы не катят.
2) А что в этом такого? Так же как и min-max width http://uggallery.audiopeace.ru/2007/10/27/min-max-width-ie5-6 замените width на height и все. Чем такой вариант Вам неподошёл?
Или вот еще более оптимизированный – http://www.gunlaug.no/contents/wd_additions_14.html
CSS for standard compliant browsers: #wrapper {width: 99%; max-width: 1200px; min-width: 550px;} CSS for MSIE/win: * html div#wrapper {width: 760px /* fallback value */; width:expression(((document.compatMode && document.compatMode=='CSS1Compat') ? document.documentElement.clientWidth : document.body.clientWidth) > 1218 ? '1200px' : (((document.compatMode && document.compatMode=='CSS1Compat') ? document.documentElement.clientWidth : document.body.clientWidth) < 570 ? '552px' : '99.7%')); }А Тут вообще специальный джаваскрипт для таких целей написали =)
2 Sukebe +1
правильный ответ 1 !!!!
Отличный сайт, отличный контент. В работе ваши рекомендации помогут.
[...] Cколько-то способов min-height Min-height свойство нужное, часто полезное, но в Internet Explorer не работает, вразумить его можно несколькими способами о которых и идет речь. [...]
может, я что-то не так делаю, но по первому способу это работает, только до какой-то высоты (около 20 пикселов). Сделать min-height 1px это не помогло.
Пример где min-height имитируется с помощью important не работает в ie8 (где так же не работают min-height). Если для div указать overflow:hidden то ie будет обрезать данные, а ff и opera будут отображать нормально
Оставить комментарий