Javascript-форум (https://javascript.ru/forum/)
-   (X)HTML/CSS (https://javascript.ru/forum/xhtml-html-css/)
-   -   IE6 и min-width (https://javascript.ru/forum/xhtml-html-css/8464-ie6-i-min-width.html)

DMH 27.03.2010 16:52

IE6 и min-width
 
Проблема в том, что в ie ширина блока не тянется до ширины окна после ресайза.
<!DOCTYPE HTML PUBLIC  "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<style>
html,body {
	margin:0;
	padding:0;
	height:100%;
	width:100%;
}
#pad {
	height:100%;
/*	width:expression(document.getElementById('pad').offsetWidth<685?'680px':'auto'); */
/*	width:expression(document.getElementById('pad').offsetWidth<685?'680px':'100%'); */
/*  width:expression(document.getElementById('pad').offsetWidth<685?'680px':document.documentElement.clientWidth+'px'); */

width:expression(document.getElementById('pad').offsetWidth<685?'680px':'1000px');

	border:1px solid red;
}
</style>

</head>

<body>

<div id="pad">xxx</div>

</body>
</html>


Теперь уменьшаем окно ie6 меньше min-width, затем снова его разворачиваем на весь экран и видим, что див не растянулся. Такое наблюдается при auto, 100% и document.documentElement.clientWidth. Если же я вручную ставлю 1000px, то всё работает. Но я не могу заранее знать ширину.

subzey 27.03.2010 17:25

body становится такой же ширины, как и #pad.
попробуйте плясать от documentElement.offsetWidth

А можно вставить в начало #pad див шириной 680px высотой 0 и overflow: hidden, и он будет распоркой, не позволяющей диву быть ýже.

DMH 27.03.2010 17:46

Самое интересное, что document.documentElement.clientWidth всегда показывает верные данные и при ресайзе окна на весь экран выдаётся тысяча с небольшим пикселей, но в стиль width эта тысяча просто не присваивается. Проверял алертом в head перед style.
Если с помощью css решить неудасться, то видимо придётся переделывать саму страницу, вставлять див и т.д.

subzey 27.03.2010 17:53

DMH,
ну… это IE6.

меня обычно спасает
body {
	width: expression((document.body.parentNode.offsetWidth < 1000)?"1000px":"auto");

DMH 27.03.2010 17:53

Пробовал с document.documentElement.offsetWidth.
<script>
window.onresize=function() {
alert(document.documentElement.offsetWidth); // при развёртывании окна - 1024, всё как надо
}
</script>

<style>
html,body {
	margin:0;
	padding:0;
	height:100%;
	width:100%;
}
#pad {
	height:100%;
	border:1px solid red;
width:expression(document.getElementById('pad').offsetWidth<685?'680px':document.documentElement.offsetWidth+'px'); // а тут эти самые 1024px не присваиваются
}
</style>

DMH 27.03.2010 18:07

body {  

    width: expression((document.body.parentNode.offsetWidth < 1000)?"1000px":"auto"); 
}

Оно самое. При выставлении этого expression для body, остальные expression тоже заработали.
Не понял лишь одного. Почему если вручную выставить 1000px для pad, то он растянется, а если через getElementById('pad').offsetWidth, который судя по алерту больше 1000px, то нет. Хотя ie6 непредсказуем.

subzey 28.03.2010 00:58

Дело в том, что для того, чтобы определить новую ширину, приходится считать старую. А старая равна значению, установленному при предыдущем запуске функции пересчета.

Т.е., по-хорошему, нужно сделать примерно так:
  1. скидываем старое значение style.width в переменную
  2. устанавливаем style.width в auto !important
  3. считаем clientWidth
  4. устанавливаем обратно style.width
  5. если clientWidth, посчитанный ранее, оказался меньше, чем надо,— кладем нужное значение, так, чтобы expression его вернул

Но тут есть одно но: для того, чтобы посчитать clientWidth, нужно сделать reflow, а для этого нужно значение самого expression, и ie6 вываливается в бесконечную рекурсию, а после этого очень скоро падает. :/

DMH 28.03.2010 05:38

Решил уже не тратить время на эксперименты. Задал document.body.parentNode.offsetWidth для body, остальные элементы пускай сами растягиваются/сжимаются вслед за body.
Насчёт бесконечной рекурсии - width:expression(document.getElementById('pad').of fsetWidth<680?'680px':'auto'); От этой строчки ie6 входит в рекурсию и виснет. Оказывается нужно, чтобы второй параметр был меньше первого, например 681?'680px', тогда работает. С document.body.parentNode.offsetWidth такого не наблюдается.


Часовой пояс GMT +3, время: 07:22.