Jump to content
  • 0

min-width для ие6


mishka
 Share

Question

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>min-width</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
div{
float:left;
background:#f00;
min-width:300px;
padding:0 5px;
_width:expression(this.offsetWidth-10<=300?'300px':'auto');
}
</style>
</head>
<body>
<div>Lorem</div>
</body>
</html>

Проблема в експрешене.

width:expression(this.offsetWidth-10<=300?'300px':'auto');

Число "10" - это сумма боковых паддингов. Так как offsetWidth учитывает и их. Так как експрешн выполняется постоянно, то ие6 без этих "-10" вешается. Потому что он постоянно добавляет эти 10 пикселей и тут же все пересчитывает...

Есть какой-нибудь способ заставить експрешн выполнятся только один раз, или записать его так чтобы он сам учитывал боковые паддинги?

Edited by mishka2
Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0

Ну одноразовый экспрешион не намного сложнее делается:

	div{
float:left;
background:#f00;
min-width:300px;
padding:0 5px;
abrakadabra: expression(style.width = offsetWidth - 10 <= 300 ? '300px' : 'auto');
}

this можно не писать

Edited by Octane
Link to comment
Share on other sites

  • 0

По-моему, для min-width одноразовый экспрешн — не панацея. При ресайзе окна привычное поведение нарушится.

Вот какой монстр у меня получился:

		width:expression(
this.tmp=document.body.createTextRange(),
this.tmp.moveToElementText(this),
this.tmp.boundingWidth > 300 || (this.tmp.getClientRects().length > 1 && parentNode.clientWidth > 320) ? 'auto' : '300px'
);

Тут замеряется размер текстового содержимого дива, и если оно не умещается в фиксированную ширину в одну строчку, а снаружи место есть, то ставится автоширина, иначе (мало контента в одну строчку или снаружи нет места, даже если внутри контент переносится на новую строку) ставится минимальная фиксированная. Лимит внешней ширины задан с запасом (320px вместо ожидаемых 310), потому что есть небольшой интервал (когда ширина внешнего контейнера меньше или равна лимиту, но больше реальной ширины самой широкой строки текста в блоке), в котором условие в скобках может выполняться, и блок становится уже лимита. Правда, процессор грузит немилосердно, так что много таких блоков лучше не заводить. Возможно, добрая старая "распорка" в этом смысле надежнее... ;)

Edited by SelenIT
Link to comment
Share on other sites

  • 0
По-моему, для min-width одноразовый экспрешн — не панацея. При ресайзе окна привычное поведение нарушится.

Да, я как-то упустил это из виду.

Содержимое дива может быть не только текст. И опять же - лимит задан с запасом "на глаз", тоесть даже нет определенного правила как этот лимит считать.

Ну одноразовый экспрешион не намного сложнее делается:

div{
float:left;
background:#f00;
min-width:300px;
padding:0 5px;
abrakadabra: expression(style.width = offsetWidth - 10 <= 300 ? '300px' : 'auto');
}

this можно не писать

Большое спасибо. Буду знать как это делается. Только действительно в данной ситуации одноразовый експрешн неподходит.

Link to comment
Share on other sites

  • 0

Может немного притормозит, но повесит врядли.

Для сравнения pngfix:

все время пользовался фильтром (filter:progid:dximagetransform.microsoft.alphaimageloader) ниразу незаметил тормозов даже на больших страницах. А попробовал pngfix.js так заметил как простая страничка несколько секунд прорисовывалась.

Да и не так уж много элементов встречаются которым надо min-width именно в таком контексте.

Link to comment
Share on other sites

  • 0

Значит они были неправильно написаны.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>min-width</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
div{
float:left;
background:#f00;
min-width:300px;
padding:0 5px;
_width:expression(this.offsetWidth-10<=300?'300px':'auto');
}
</style>
</head>
<body>
<div>Lorem</div>
</body>
</html>

Этот тоже может повесить если не учесть "-10" - это сумма боковых паддингов. Если паддинги будут, а в експрешене это не учесть, то естественно ие6 зависнет.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy