27.03.2010, 16:52
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
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, то всё работает. Но я не могу заранее знать ширину.
|
|
27.03.2010, 17:25
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
body становится такой же ширины, как и #pad.
попробуйте плясать от documentElement.offsetWidth
А можно вставить в начало #pad див шириной 680px высотой 0 и overflow: hidden, и он будет распоркой, не позволяющей диву быть ýже.
|
|
27.03.2010, 17:46
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
Самое интересное, что document.documentElement.clientWidth всегда показывает верные данные и при ресайзе окна на весь экран выдаётся тысяча с небольшим пикселей, но в стиль width эта тысяча просто не присваивается. Проверял алертом в head перед style.
Если с помощью css решить неудасться, то видимо придётся переделывать саму страницу, вставлять див и т.д.
|
|
27.03.2010, 17:53
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
DMH,
ну… это IE6.
меня обычно спасает
body {
width: expression((document.body.parentNode.offsetWidth < 1000)?"1000px":"auto");
|
|
27.03.2010, 17:53
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
Пробовал с 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>
|
|
27.03.2010, 18:07
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
body {
width: expression((document.body.parentNode.offsetWidth < 1000)?"1000px":"auto");
}
Оно самое. При выставлении этого expression для body, остальные expression тоже заработали.
Не понял лишь одного. Почему если вручную выставить 1000px для pad, то он растянется, а если через getElementById('pad').offsetWidth, который судя по алерту больше 1000px, то нет. Хотя ie6 непредсказуем.
|
|
28.03.2010, 00:58
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
Дело в том, что для того, чтобы определить новую ширину, приходится считать старую. А старая равна значению, установленному при предыдущем запуске функции пересчета.
Т.е., по-хорошему, нужно сделать примерно так: - скидываем старое значение style.width в переменную
- устанавливаем style.width в auto !important
- считаем clientWidth
- устанавливаем обратно style.width
- если clientWidth, посчитанный ранее, оказался меньше, чем надо,— кладем нужное значение, так, чтобы expression его вернул
Но тут есть одно но: для того, чтобы посчитать clientWidth, нужно сделать reflow, а для этого нужно значение самого expression, и ie6 вываливается в бесконечную рекурсию, а после этого очень скоро падает. :/
|
|
28.03.2010, 05:38
|
Аспирант
|
|
Регистрация: 26.02.2010
Сообщений: 71
|
|
Решил уже не тратить время на эксперименты. Задал document.body.parentNode.offsetWidth для body, остальные элементы пускай сами растягиваются/сжимаются вслед за body.
Насчёт бесконечной рекурсии - width:expression(document.getElementById('pad').of fsetWidth<680?'680px':'auto'); От этой строчки ie6 входит в рекурсию и виснет. Оказывается нужно, чтобы второй параметр был меньше первого, например 681?'680px', тогда работает. С document.body.parentNode.offsetWidth такого не наблюдается.
|
|
|
|