Min-width и max-width для Internet Explorer <= 6

Некоторые персонажи в комментариях к записи на схожую тему в одном блоге сетовали на то, что не могут найти в гуглояндексе «универсальное решение для реализации динамической ширины блока с минимальным и максимальным значением». Что ж, попробуем его туда добавить :). Сие есть не что иное как: min-width и max-width для Internet Explorer версий <= 6 (поскольку тварь последней модификации уже понимает эти свойства).

С тем, что dynamic properties (фирменная фича MS, используется для динамических расчётов значений CSS свойств элемента) зло, не могу согласиться. С их помощью можно научить ослика ходить более прямо, путём пририсовывания ему костыликов, причём замаскированных таким образом, что их наличие никак не сказывается на качестве рендерения страницы в других браузерах, а так же на драгоценной, так всеми желаемой, валидности. Именно эту фичу MS мы и будем использовать вкупе с ещё одной фирменной фичей, что звучно сonditional сomments зовётся.

Итааааак, работающий пример:

<!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>Title</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <style type="text/css">
        html
        {
            margin:0;
            padding:0;
        }
        body
        {
            background:olive;
            margin:0px;
            padding:10px;
            text-align:center;
        }
        #root
        {
            text-align:left;
            background:yellow;
            margin:0 auto;
            padding:1px 0;
            min-width:770px;
            max-width:990px;
        }
        </style>
        <!--[if IE]>
        <style type="text/css">
        * html #root
        {
            width:expression(
                (document.compatMode && document.compatMode == 'CSS1Compat')
                ?
                (
                    document.documentElement.clientWidth < 770
                    ?
                    "770px"
                    :
                    (
                        document.documentElement.clientWidth > 990
                        ?
                        "990px"
                        :
                        "auto"
                    )
                )
                :
                (
                    document.body.clientWidth < 770
                    ?
                    "770px"
                    :
                    (
                        document.body.clientWidth > 990
                        ?
                        "990px"
                        :
                        "auto"
                    )
                )
            );
        }
        </style>
        <![endif]-->
    </head>
    <body>
        <div id="root">
            <p>
                Vivamus nonummy. Fusce risus. Duis luctus. Mauris tempor.
                Nullam consequat dolor at urna. Donec porttitor lectus ac lacus.
                Pellentesque turpis tortor, bibendum non, dictum id, mollis non,
                nulla. Aenean vehicula dapibus erat. Proin felis lorem, faucibus
                vitae, accumsan sit amet, posuere ut, leo. Nulla enim felis, mattis
                id, laoreet sed, tempus non, neque. Vivamus eu nisl. Ut posuere
                porttitor ante. Cras scelerisque ipsum eget metus. Proin ultricies
                nonummy ipsum. Maecenas dignissim sem at sem. Pellentesque faucibus,
                augue dignissim interdum vulputate, elit massa suscipit orci, vel
                feugiat massa dolor vitae sapien. Aenean porttitor nunc ac
                tellus.
            </p>
        </div>
    </body>
</html>

А теперь я попытаюсь объяснить как эта магия работает :). У всех современных браузеров есть несколько режимов отображения страницы, так называемые «standarts compliant mode» (режим совместимости со стандартами) и «quirks mode» (режим обратной совместимости), и наш непарнокопытный друг не является исключением, начиная с версии 6. Подробнее и по-русски о режимах отображения я расскажу в следующих статьях, кому неймётся, тот может изучить довольно подробный материал, собранный, судя по всему, финскими коллегами по цеху, на английском языке. Вкратце: IE версий 5-5.5 всё время работает в режиме обратной совместимости, IE 6-7 только при условии отсутствия DTD, некорректного DTD, наличия XML декларации или простого комментария перед DTD. В разных режимах отображения роль основного элемента, который представляет собой канву для отрисовки всего контента, играют разные элементы. В случае режима обратной совместимости этим элементом является body, а в режиме совместимости со стандартами — элемент html. Для определения в каком именно режиме отображается текущая страница наши друзья индусы придумали интересное свойство document.compatMode, данное свойство появилось в IE6, и оно может принимать следующие значения: "CSS1Compat" и "BackCompat"; из этого следует, что мы можем легко разбить наш expression на две ветки: первая — для IE6-7 в режиме соместимости со стандартами, вторая — для IE всех версий в режиме обратной совместимости. В первой ветке мы используем свойство document.documentElement, которое, начиная с версии IE6 в режиме совместимости со стандартами содержит ссылку на корневой элемент документа, а во втором случае — давно известный нам объект document.body. Подобный тюнинг этого выражения позволяет избежать зависания IE разных версий в разных режимах отображения страницы.

В последующийх статьях я попробую рассказать о режимах отображения страницы в разных браузерах и conditional comments. Спасибо, что дочитали до конца ;).

Комментарии (11)

  1. tapazukk говорит:

    Зэр гут! Положу в свою копилку экспрэшнов.

  2. Q-Zma говорит:

    интересно, а как ты нашёл эту запись?

  3. uggallery говорит:

    Сам ты персонаж :) Но за решение еще раз спасибо! А подробное разъяснение так это вообще супер! Хорошая работа.

    Хотел спросить. Собираюсь опубликовать этот метод в одном справочном wiki-проекте, для использования широкими массами. Не могу обещать, что там можно будет разместить ссылку на тебя прямо на странице с кодом. Скорее где-то на отдельной странице с благодарностями. Даешь добро?

  4. UGgallery » Архив журнала » Мin-width и max-width для IE5-6 при помощи expression говорит:

    [...] Q-Zma также подробно описал принцип действия у себя в блоге. [...]

  5. Q-Zma говорит:

    ну я, когда писал «персонаж», не имел ввиду ничего плохо, уж не сердитесь, слог у меня такой… по-поводу «Даешь добро?» — ничего не имею против, за ссылками, кстати, не гоняюсь ;-)

  6. uggallery говорит:

    ОК! Супер! Ссылки действительно не самоцель. Но вот указание авторства — вещь не последняя.

  7. tapazukk говорит:

    интересно, а как ты нашёл эту запись?

    подписан на rss :)

  8. Mnilionic говорит:

    здесь отсчёт идёт от ширины body, как я понимаю, document.body.clientWidth. Но ведь min-width и max-width должны считаться от родителя. Эти свойства используются не только для того чтоб задасть ширину сайта :). Можно ли в этих экспрешенных обращаться к элементу, к которому они прописаны… чтонить типа «this»?

  9. Q-Zma говорит:

    пример довольно специфичен, можно, конечно: parentNode

  10. Mnilionic говорит:

    а для parentNode есть вариации связанные с compatMode, а то ИЕ виснет :(
    спасибо.

  11. Q-Zma говорит:

    пример в студийю





курсы 3ds max, обучение 3d max ; Где найти новых клиентов - способы увеличения продаж. Плохо идут продажи?