min-width для IE

02 Sep, 2005

ДваТри способа как это можно сделать в ИЕ...

min-width по нормальному

Это очевидно, так должно быть, это должно работать:
  1. #min-width {
  2. min-width:600px;
  3. }
Но, как вы можете легко догадаться, работает везде, кроме чего? Правильно! Интернет Эксплорера! :)

Вступление

Здесь и дальше я буду укрощать(задавать минимальную ширину) блок #min-width.

Метод 1: JavaScript

Вот такой простенький кусок CSS (перемешанного с JS) решает проблему..
  1. #min-width {
  2. min-width:800px;
  3. width:expression(document.body.clientWidth < 770? "770px": "auto" );
  4. }
Или так например:
  1. * html #min-width {
  2. width:expression(document.body.clientWidth > 770? "100%" :"770px");
  3. }
смотреть пример Одна из проблем с этим методом описана ниже - заголок ВАЖНО!

ВАЖНО

Однако помните, что первый метод при некоторых Доктайпах вызывает подвисание IE WinXP SP1 при ресайзах окон. Смена доктайпа и еще пару примочек помогает. Например переход XHTML на HTML спасает. Вот тут читайте подробнее - min-width, max-width re-hacked.

Метод второй: два обертывающих DIV

Этот метод потребует добавления в код двух дополнительных DIV. Примерно так:
  1. <div id="min-width">
  2. <div class="minwidth">
  3. <div class="container">
  4. tut ku4a texta
  5. </div>
  6. </div>
  7. </div>
Тогда вот такой CSS нам сымитирует min-width для IE:
  1. /*для всех броузеров что понимают min-width */
  2. #min-width {
  3. width:50%;
  4. min-width:400px;
  5. }
  6. /* для IE */
  7. * html .minwidth {
  8. border-left:400px solid #fff;/*min-width*/
  9. position:relative;
  10. float:left;
  11. z-index:1;
  12. }
  13. * html .container {
  14. margin-left:-400px; /*-min-width*/
  15. position:relative;
  16. float:left;
  17. z-index:2;
  18. }
смотреть пример Если вкратце: то внутрь блока помещают другой, с границей равной минимальной ширине. Который и не дает ИЕ сжимать этот блок. Более подробное описание:

Update: Метод 3: JavaScript

Для простоты приводимого кода я сделаю min-width для тэга body. Если необходимо реализовать для какого то блока - достаточно задать ID и использвать getElemetById.

Вобщем достаточно проинклюдить в страницу вот такой скрипт:

  1. var d = document;
  2. var winIE = (navigator.userAgent.indexOf("Opera")==-1 && (d.getElementById && d.documentElement.behaviorUrns)) ? true : false;
  3. function bodySize(){
  4. if(winIE && d.documentElement.clientWidth) {
  5. sObj = d.getElementsByTagName("body")[0].style;
  6. sObj.width = (d.documentElement.clientWidth<760) ? "760px" : "100%";
  7. }
  8. }
  9. function init(){
  10. if(winIE) { bodySize(); }
  11. }
  12. onload = init;
  13. if(winIE) { onresize = bodySize; }
В принципе аналогично первому методу с ескпрешонами - но этот вариант исключает подвисание броузера при ресайзе - поэтому если уж бить джаваскриптом, то лучше этим - хотя за определение броузера стыдно - но такова селяви... (подсмотрено живьем тут)

Заключение

В очередной раз убеждаемся что заставить ИЕ понимать можно все. Но не всегда это очевидно и стоит того.

Все ссылки

51 комментариев к “min-width для IE”

1.edgy | 05 Sep, 2005
Попробуйте сделать в IE border шире 960 пикселей. Весело, ага.
2.akella | 05 Sep, 2005
А что там такое страшное происходит? Интересно ж... Ну а когда нам понадобится min-width:960px думаю ИЕ уже будет это поддерживать...
3.kost | 23 Sep, 2005
Понадобилось как-то для ширины больше 960px. А то некоторые «дезайниры» считают, что людей с браузером открытым меньше чем в 1024×768 уже нет. При min-width > 960 px в IE6 контент сползает влево на ширину, равную min-width-960. Причем в IE5 этого не наблюдается (если мне не изменяет память). На сайте http://www.cssplay.co.uk/ когда-то были комментарии, я спросил, ответили, что в transparent варианте (http://www.cssplay.co.uk/boxes/min-widthSn.html) с этим все нормально.
4.gam | 10 Oct, 2005
Ну и 4-й самый тривиальный способ, но может и не всем интересный - вставка 1-нопиксельного прозрачного gif'а с нужной шириной. ;)
5.cssing :: Архив :: cssing 2005 | 27 Dec, 2005
[...] временем - алистапартовская байка про time management. Бородатая но все равно актуальная. min-width для IE - обзор 3 способов как это лучше делать. Прелоад через CSS - способы подзагр [...]
6.grlm | 21 Feb, 2006
<----> перед доктайпом и способ #1 рулят :)
7.akella | 26 Feb, 2006
А еще рулит изменения значения 770 на 771 например. То есть стоит поиграться +- 1 пиксел в exression - почти наверняка помогает
8.эдик | 30 Mar, 2006
А как с доктайпом поиграться?Вот пытаюсь сделать max-height для блока,даже Опера(!)не понимает.(правда у меня маргины по десять процентов стоят-ну думаю наврядли они во всем виноваты).
9.akella | 30 Mar, 2006
"Поиграться" - я имел ввиду попробовать менять разные доктайпы. А всего кода Вашего я не вижу - поэтому вряд ли могу помочь более конкретно. Смена доктайпа предназначается только для ИЕ и того джаваскриптового решения...
10.wil | 14 Apr, 2006
как все сложно....ыыыы
11.Script | 28 Aug, 2006
По поводу 3-го поста (насчёт min-width > 960 px): Тоже столкнулся с такой проблемой при использовании 2-го способа, описанного в данной статье, и решил её простым добавлением _margin-left: "min-width-960px" в body, и всё стало зашибись! =) т.е. получилось такое: body { min-width: 997px; margin: 0; _margin-left: 37px; padding: 0; } P.S.: Автору - ОГРОМНЫЙ РЕСПЕКТ!!! Меня эта проблема давно доставала.
12.faxenoff | 27 Aug, 2006
Самое лучшее JS-решение http://toserveman.kalebwalton.com/articles/2006/08/02/ie-min-width-css-workaround
13.akella | 16 Feb, 2007
Лучше просто дай ссылку на рабочий пример - видать там было упоминание тага, а у меня разрешен ХТМЛ каментах.
14.[e]Bu$ter | 17 Feb, 2007
Там есть знак "больше либо равно" и "меньше либо равно" — это он видимо «смущает» движок... Удалите все мои предыдущие посты, пользы от них в таком виде всё равно никакой (они же одинаковые все). Ссылки на рабочий пример тоже пока нет – в разработке. Ладно, последняя попытка (если получится тоже самое что и в предыдущих постах, удалите и этот): [code] function bodySize(){ sObj = document.getElementsByTagName("body")[0].style; if (document.documentElement.clientWidth<=760) { sObj.width = "600px"; } else if (document.documentElement.clientWidth>=1100) { sObj.width = "900px"; } else { sObj.width = "80%"; } } if(navigator.appName == "Microsoft Internet Explorer") { onresize = bodySize; onload = bodySize; } [/code] Смысл такой: body всегда занимает 80% от ширины окна в диапазоне ширины окна от 760px и до 1100px. Как только ширина окна выходит из заданного диапазона, растягивание (или сжатие) body в IE прекращается. Проще говоря, сей костыль реализует подержку min-width и max-width в IE.
15.Cybersurfer | 22 Feb, 2007
Только что столкнулся с проблемой min-width > 960 px, решение действительно работает по схеме "двух обертывающих дивов" просто если используется min-width> 960 то из min-width вычитаем 960 и пишем получившуюся цифру в margin-left для body. Пример: * html body{ margin: 0 0 0 40px; } /*для всех броузеров что понимают min-width */ #min-width { min-width:1000px; } /* для IE */ * html .minwidth { border-left:1000px solid #fff;/*min-width*/ position:relative; float:left; z-index:1; } * html .container { margin-left:-1000px; /*-min-width*/ position:relative; float:left; z-index:2; } все работает!
16.CTAJIKEP | 21 Mar, 2007
А не пробовали просто изменить немного так * html .container { margin-left:-960px; /*-min-width*/ position:relative; float:left; z-index:2; } Зачем еще и body трогать? . :)
17.Magentoua | 19 Apr, 2010
39. Александр "Что означает запись * html в css?" - Це відсічка на Internet Explorer 6. Тобто стрічка яка починається з * html буде зрозуміла тільки IE6
18.askari | 04 Apr, 2010
март 2010-ого..нано технологии стремительно рвуться вперёд. max-width по прежнему не работает
19.Ilya | 25 Nov, 2009
На дворе конец 2009 года, в ходу ie8. за 4 года max-width так и не заработал.
20.Евгений | 10 Jul, 2009
Мы знакомы всего несколько минут, но кажется, я люблю вас =)) Спасибо за статью. Очень во время помогли.
21.tolstyj | 17 May, 2007
выход в случае с шириной больше 960px:
/*для всех броузеров что понимают min-width */
#min-width {
 min-width:1000px; 
 }
/* для IE */
* html .minwidth {
 border-left:960px solid #fff;
 border-right:40px solid #fff;/*min-width-960*/
 position:relative; 
 float:left; 
 z-index:1;
 }
* html .container {
 margin-left:-960px; /*-min-width*/
 margin-right:-40px; /*-(min-width-960)*/
 position:relative; 
 float:left; 
 z-index:2; 
 }
22.nick | 04 Sep, 2007
помогло, спасибо..
23.SelenIT | 12 Dec, 2007
> Смена доктайпа и еще пару примочек помогает. Например переход XHTML на HTML спасает. Не может спасать переход "XHTML на HTML" - хотя бы по той простой причине, что XHTMLя в IE просто не бывает). Спасает переход из Strict mode в Quirks mode (именно это, кстати, происходит в IE6 при вставке чего угодно перед доктайпом). А все потому, что в Quirks document.body является внешним контейнером, а в Strict он сам вложен в document.documentElement, от которого и нужно "плясать". "Играться" с доктайпами смысла не вижу - какой из них дает какой режим рендеринга, давно известно (http://hsivonen.iki.fi/doctype/), нужно просто выбрать наиболее подходящий по результату сообразно задаче. Простите за резкость, просто задрал уже этот миф про "волшебную букву X"...
24.akella | 12 Dec, 2007
XHTML настоящего в ИЕ нет, но смена XHTML доктайпа на HTML действительно иногда помогает, и это без quirks mode. Мифа нет, вы попробуйте просто =) Не знаю где вы тут миф этот нашли - я уже писал о том что такое настоящий XHTML - http://cssing.org.ua/2005/02/25/xhtml-worth-or-not/ почти 3 года назад )
25.Wakh | 13 Jan, 2008
использовал первый метод - ширина 995px http://avia2.mosaero.org/ теперь возникла проблема с исчезновением картинок-бэков в ИЕ, если: 1. сделать размер окна 800х600, а потом распахнуть (по Ф5 не лечится) 2. сделать размер окна 1024х768 и выше (лечится если распахнуть (и обратно))
26.Wakh | 14 Jan, 2008
прочитав http://xpoint.ru/forums/internet/html_css/css/thread/34023.xhtml помогло "зум:1" ура!
27.mrAdamoff | 18 Mar, 2008
спасибо, очень помогло. Для ширины более 960px использовал вариант tolstyj. Только в контейнере опечатка, второй марджин предназначается естественно для правой границы.
28.akella | 19 Mar, 2008
Спасибо! Теперь все верно, подправил его комментарий
29.Webych | 31 Mar, 2008
Почему вставка однопиксельного (в высоту) div'а или gif'а не помогает?
30.CSS XHTML &#8220;Шпаргалка на промокашке&#8221; &laquo; Студия AlterEgo. Блог | 06 Apr, 2008
[...] Учим ИЕ "плохому" — min-width, max-width * «min-width для IE» (cssing.org.ua/2005/09/02/..) * «max-width в Internet Explorer» (xhtml.ru/2005/06/11/max-w..) * «min-width for Internet [...]
31.Санча | 28 Apr, 2008
не знаю что ставит в тупик IE, но я вместо строго неравенства, поставил <=, и при этом глюк упорхнулв небытие. Во всяком случае на моём компе. Очень интересно знать от чего есть подвисание, и если подвисание не наблюдается у меня, возможно ли оно на машине пользователя.
32.Александр | 28 May, 2009
Что означает запись * html в css ?
33.Фдучфтвук | 07 Jun, 2008
#all { text-align:center; min-width:1000px; width:expression(((document.compatMode && document.compatMode=='CSS1Compat') ? document.documentElement.clientWidth : document.body.clientWidth) < 1020 ? "1020px" : "auto"); } У меня чтои ттакой скрипт в css все пашет все супер ) но это не валидно ) что подскажите по этому поводу. ПОнимаю конечно что всем плевать на валидацию цсс, но все же.
34.рус | 25 Apr, 2009
Юрий, в ИЕ6 твой пример тупо задает фиксированную ширину, так что можешь сам пойти ;)
35.Kor-Elf | 24 Jun, 2008
#site{min-width:1000px;} *html #site{ -width:1000px; z-index:1; height:0px; margin:0px; padding:0px; background:transparent; color:transparent; } мне это помогло! и без скриптов!
36.Jony | 14 Jul, 2008
я подобную задачу решил пустым гифом + overflow:scroll. вроде такого: <img alt="" src="empty.gif" width="1024" height="0" style="overflow:scroll; margin:0px; padding:0px;"> . как результат - в блоке содержащем этот гиф появляется скролбар после уменьшения ширины меньше 1024. да и вообще с overflow:scroll можно в этих целях эксперементировать. весьма просто и без инvalidности. хотя в ie из за этого могут возникнуть проблемы с отступами, но при желании они легко решаются.
37.Семантическая верстка — советы и решения. Часть VIII. Минимальные и максимальные размеры | 26 Aug, 2008
[...] min-width для IE [...]
38.Женя | 11 Oct, 2008
# #min-width { # width:50%; # min-width:400px; # } # /* для IE */ # * html .minwidth { # border-left:400px solid #fff;/*min-width*/ # position:relative; # float:left; # z-index:1; # } # * html .container { # margin-left:-400px; /*-min-width*/ # position:relative; # float:left; # z-index:2; # } У меня вопрос по поводу второго метода. Я его использовал. Все супер. Но вот тоько фон моей рабочей зоны которая в .winwidth в ИЕ: белая. Я заменил цвет на тот который у меня на сайте, благо это просто замена цвета. но а если это уникальный цвет, т.е. постоянно меняющийся , который нужн будет отрезать одним пикселем и повторить по всей ширине? ТО белый цвет вмешается в мои планы?
39.akella | 11 Oct, 2008
Совершенно верно, в методе проблемы когда нужен свой фон. Потому существует усложненный вариант - там 4 дива обертки, вот тут второй пример
40.Эмуляция min-width, max-width под IE6 | ZODIOS.net | 08 Nov, 2008
[...] Источник материала [...]
41.min-width в Internet Explorer | HTML-CODER.ORG.RU | 12 Dec, 2008
[...] Вариант с JavaScript (да и еще много всего) можно подсмотреть на cssing.org.ua/2005/09/02/min-width-for-ie [...]
42.min-width в Internet Explorer | HTML-CODER.ORG.RU | 10 Jan, 2009
[...] Вариант с JavaScript (и еще много всего) можно подсмотреть на cssing.org.ua/2005/09/02/min-width-for-ie [...]
43.Юрий | 31 Jan, 2009
min-width:1000px; width:auto !important; width:1000px; И идите нахуй со своими костылями LOL
44.Олег | 25 May, 2010
# 17 мне помог, спс большое
45.min-width для IE | Искусство создания и продвижения сайтов | 29 Jun, 2010
[...] min-width для IE Теги:  ie [...]
46.Олег | 30 Jun, 2010
Вот еще один способ http://savvateev.org/blog/20/
47.Виталий Капля | 11 Aug, 2010
Спасибо, все отлично, вот только примеры куда-то сбежали =)
48.DeathBloom | 05 Nov, 2010
Немного оффтоп, но использованное словосочетания "такова селяви" - указывает на незнание автором перевода французского выражения "c'est la vie" и, как следствие, автор строит неправильные словосочетания с этой фразой. c'est la vie - "такова жизнь". В итоге получаем "такова такова жизнь" - глупость. Правильный вариант употребить просто "се ля ви". Или уже "такова la vie", но никак не то, что написал автор.
49.akella | 05 Nov, 2010
В итоге получаем “такова такова жизнь” - глупость.
Exactly =) Спасибо я прекрасно знаю его значение, для того и использую этот тавталогичный каламбур. Я наивно полагал что значение слов "се ля ви" достаточно очевидно для всех, чтобы с ним можно было шутить :)
50.Елена | 15 Sep, 2011
Конец 2011 года)) Все еще с костылями)) Эту страницу нужно отправить в майкрософт)))
51.Songo | 01 Jan, 2013
Начало 2013 года, исследуем Марс, покуда всё Ок :), а ie6 всё еще даёт о себе знать :( Интересно, Била икота не замучила?