(For english speaking readers: this post explains a hack for IE letting it properly display fieldset and legend with background colors. Pictures describe the problem, and the code at the end of post solves it.)

В рамках упомянутой "интернетоэксплореризации" мне не повезло натолкнуться на довольно гадко выглядящий баг. Дело в том, что мне захотелось сделать, казалось бы, простую вещь: назначить элементам Fieldset и Legend цвета фона...

Я, ничтоже сумяшеся, сделал так:

fieldset {
  background-color:#E3EEE3;
}

legend {
  background-color:#ACA;
}

И вот как это выглядит в моем Firefox'е:

Прямоугольник Legend со своим фоном висит поверх верхней границы Fieldset'а со своим фоном

А вот IE:

Прямоугольник Legend со своим фоном висит поверх верхней границы Fieldset'а, но его фон вылезает за верхнюю границу ровно до верхней границы Legend

Фон, выползающий за верхнюю границу, выглядит ужасно. Поиск того, как это поправить, помимо парочки заявлений о том, что это поправить невозможно, выявил все же одно решение, которое мне не понравилось тем, что использует дополнительный пустой div, а также тем, что вешает Fieldset абсолютно, чем сбивает все раскладку.

Тогда я решил помучиться немного сам. Я стал экспериментировать с различными margin'ами и padding'ами и позиционированием, что довольно быстро ввело меня в удручающее состояние. Верхние положительные margin'ы на Legend действуют на всю конструкцию целиком, а отрицательные и вовсе приводят к страннейшему эффекту, когда едущий наверх Legend тащит за собой рамку Fieldset'а, но оставляет на месте его фон!

Впрочем, потом мне удалось поймать комбинацию, которая делает как-раз то, что хочется. Вот она:

* HTML fieldset {
  position:relative;
}

* HTML legend {
  position:relative;
  top:-0.6em; margin-bottom:-0.6em;
}

Пара комментариев:

Что интересно, буквально через день я наткнулся на практически такой же способ, который вывел сам. Причем, я не очень понимаю, как у меня вышло не найти его в первый раз :-). Но тем не менее, мой мне все равно нравится больше, потому что в нем меньше уродливых хаков со скрытиями разных правил от разных браузеров.

Комментарии: 7

  1. Cain

    По теме fieldset еще один вопрос, если можно :) Из тех же картинок видно, что в разных браузерах отступ от края fieldset разный - отсутствует в IE и Opera и есть отличный от нуля в NN и FF. Из-за Opera просто * HTML не отделаться. Есть идеи, как с этим бороться? А то пришлось отказаться от использования этого элемента :(

  2. Иван Сагалаев

    По идее, вполне можно... Этот отступ - всего навсего дефолтный padding, который Gecko назначает "для красоты". Его можно убрать:

    fieldset {   padding-left:0; }

    Там подвинется Legend, но ее уже можно сдвинуть обратно с помощью ее margin-left.

    Но вообще сам бы , я бы не очень сильно морочился по этому поводу :-). Некоторая свобода в отображении браузерам дана в CSS совершенно намерено, особенно в элементах управления. Пока это не выглядит отвратительно, нет ничего страшного, что это выглядит по-разному.

  3. Cain

    Спасибо, все работает, но возникает еще вот какая проблема. Если задать стиль для fieldset таким образом "width:160px;margin:0;padding:0;" то окажется, что в Opera и IE ширина этого блока на 1-2 пикселя меньше, чем ширина таблицы с шириной 160px, что в принципе не критично, а вот в FF - на 5 пикселей больше. И вот если расположить fieldset под таблицей, то в каком-то из броузеров все равно криво будет :) Понимаю, что таблицы надо использовать для других целей, но пока поддержка CSS в разных броузерах настолько различна, иногда все-таки проще сделать таблицами, по крайней мере на моем уровне знаний :) Если есть информация, как эту проблему обойти - буду рад ознакомиться :)
    С уважением, Cain.

  4. Иван Сагалаев
  5. Anton

    Спасибо. Только почему-то во всех браузерах на момент моего комментария звездочка и слово "HTML" в коде приводят к отсутствию фона и кривым границам. А вот без них все нормально. Видимо уже это дело стало поддерживаться...

  6. Николай

    Для того чтобы убрать отступ слева в теге Legend в IE можно просто проставить свойство

    margin-left:-6px;
    
  7. Сергей

    Это уже всё поддерживается браузерами опера и мозилла так, что его нельзя использовать, но в IE отображается тогда правильно..а во стальных всё съезжает..(((

Добавить комментарий