Веб-разработка

индекс
236,88

Ещё один способ победить Internet Explorer

Рано или поздно все web-разработчики сталкиваются с ситуацией, когда Internet Explorer становится проблемой, тормозящей разработку проекта. Сайт свёрстан валидно, по стандартам. Нормально отображается в Mozilla, Opera, Safari и других нормальных браузерах. Но. Открываем его в IE. И видим. Как то, что мы подгоняли по пикселям, строго придерживаясь стандартов, размазано по странице. Ладно ещё в IE7 можно более-менее просто подогнать вёрстку (конечно зависит от дизайна), но от IE6 иногда волосы встают дыбом. К счастью, существуют способы, которые позволяют повлиять на ситуацию. Кто-то использует хаки, кто-то — conditional comments. Где-то можно пойти на компромис и упростить задумку дизайнеров, поддерживая пользователей недобраузеров.

В итоге можно добиться адекватного отображения сайта во всех популярных браузерах включая IE6 и IE7 которые, к сожалению, пока самые популярные. Но что мы получаем? Как правило, это один или несколько CSS файлов для IE. Или куча дополнительных свойств // или _. Всё это затрудняет поддержку сайта, внесение изменений, добавление новых элементов в вёрстку. Всегда остаётся шанс, что где-то что-то забыли подправить или не убрали стиль который работал только в IE.

Недавно нашёл очень интересное решение которое избавляет от множества проблем с IE. Сайт проекта. Решение написано на JavaScript.

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

  • supports the following CSS selectors:
    • parent > child
    • adjacent + sibling
    • adjacent ~ sibling
    • [attr], [attr=«value»], [attr~=«value»] etc
    • .multiple.classes (fixes bug)
    • :hover, :active, :focus (for all elements)
    • :first-child, :last-child, only-child, nth-child, nth-last-child
    • :checked, :disabled, :enabled
    • :empty, :contains(), :not()
    • :before/:after/content:
    • :lang()

  • supports imported style sheets
  • preserves the cascade of the style sheet
  • does not alter the document structure
  • does not repeatedly query the DOM tree using JavaScript
  • uses pure CSS to enforce style sheet rules
  • supports the W3C box model in both standards and quirks mode
  • supports fixed positioning (flicker free)
  • supports overflow:visible
  • supports min/max-width/height
  • fixes broken (X)HTML elements (abbr, object)
  • standardised forms behavior
  • supports PNG alpha transparency
  • lightweight script (11KB)
  • works for Microsoft Internet Explorer 5+ (Windows only)


На мой взгляд — отличный список возможностей.
Для того чтобы скипт заработал, нужно просто подключить его к странице. После загрузки он применяет стили непонятные IE к элементам страницы и выполняет дополнительные операции для поддержки стандартов.

Да. За всё надо платить. Естественно без поддержки JavaScript решение работать не может и на скорость это, хоть не сильно но, влияет. Как правило — пользователи IE это «среднестатистические пользователи», которые не отключают JavaScript, а небольшие замедления при загрузке страниц — не самая большая их проблема.

Зато мы получаем возможность использовать много вкусностей CSS типа :first-child, parent > child, [attr=«value»]. О которых, раньше, IE заставлял нас забывать.

Лично я буду использовать это решение в своих проектах.

Мне очень интересно услышать мнения хабрапользователей относительно этого решеня.
+40
15 ноября 2008, 17:49
87

комментарии (122)

0
Nikolay_Smeh #
Надо попробовать в реальных проектах.
НЛО прилетело и опубликовало эту надпись здесь
+1
PycmaM #
Хабр ссылку попортил, вот dean.edwards.name/IE7/
–2
PycmaM #
Спасибо за наводку, буду пользовать(:
+5
WIRTEL #
Всегда как-то не охотно относился к данным затеям, когда страница загружается, в вашем случаи, будет простая страница без стилей ~1 сек, потом вдруг, что-то дёрнется и появится стиль, глазу очень не приятно и первые моменты кажется, что браузер зарезал css.
НЛО прилетело и опубликовало эту надпись здесь
+2
WIRTEL #
Возможно, но самый первый, уйти скорее…
0
nicothin #
а от чего бежать то?
на мой взгляд, очень хорошее решение для описываемого случая.
–4
AreD #
BVadim, посмотрите еще и на это решение решение.
+2
Kalan #
Так это же оно и есть!
+4
mr_idiot #
Я как-то юзал эту штуку чтобы заствить IE6 отображать прозрачные PNG (и у фона элементов тоже). Отображаться то они отображались, но как IE при этом глючил! Элементы начинали мигать и дергаться.
На мой взгляд как раз заголовок у топика правильный — IE6 надо именно побеждать, то есть наоборот постепенно отказываться от его поддержки.
+1
Xelaan #
От поддержки то отказться можно, но ведь одновременно с этим придётся отказываться и от довольно большой части аудитории, а этого хочет не каждый…
0
kellas #
из всего что пробывал, лучше всего работал pngfix для jquery, но хорош только если вы используете jquery в своём проекте.
0
mr_idiot #
А куда в нынешнее время без jQuery :). В следующий раз если возникнет такая проблема может и попробую, но думаю, что надежней все-таки по старинке (_background-image: [JPG без прозрачности] — и пофиг что у приверженцев IE6 может пропадать красота:) ).
0
BisnoyZakat #
как скачать другой браузер… если у тебя вобще никакого нет?… предложение что мне это кто-то другой сделает абсолютно не рентабельно.
0
BisnoyZakat #
промахнулся
0
goodsprite #
Представим, что в Windows по умолчанию не будет IE и каждому пользователю нужно будет установить обозреватель :)

По-моему, было бы очень круто! Пользователям, использовавшим раньше (или вообще новичкам) IE, помогли бы опытные люди и поставили бы нормальный обозреватель. И что-то мне подсказывает этим обозревателем врядли стал бы IE. Вот это был бы прорыв! ^_^
0
neuymin #
во время первой браузерной войны MS отстоял право комплектовать ОС браузером. Это и уничтожило Netscape
+1
dfuse #
Ну скажем нетшкаф был еще глючнее, чем IE, так что не только то, о чем Вы написали, его убило.
0
neuymin #
Ок, быстро уничтожило
0
BisnoyZakat #
ак скачать другой браузер… если у тебя вобще никакого нет?… предложение что мне это кто-то другой сделает абсолютно не рентабельно.
НЛО прилетело и опубликовало эту надпись здесь
0
BisnoyZakat #
Товарищ? вы о чём собственно? я сказал что если в ОС по умолчанию не будет браузера совсем, то как мне скачать Firefox или Opera?????
НЛО прилетело и опубликовало эту надпись здесь
0
BisnoyZakat #
Вы предлагаете компаниям которые продают компьютеры устанавливать браузеры отдельно?
Товарищ… это бред.
Единственно верное решение… это чтобы MS сделали хороший браузер который бы не глючил… тогда бы других не напрягало и каждый пользовал тем что ему нравится.
НЛО прилетело и опубликовало эту надпись здесь
0
dfuse #
А как Вы скачаете себе нормальный браузер, если у Вас НЕТ БРАУЗЕРА по-умолчанию? ;) Оперу то на чистую систему откуда ставить, если ни дисков, ни флешки допустим нет? А так хоть открыл осла, скачал что надо, поставил. Пэтому вообще выкинуть браузер из ОС — это маразм.
НЛО прилетело и опубликовало эту надпись здесь
+9
WilliamKidd #
+1
BVadim #
Извините, поиск на эту статью не вывел.
+1
WilliamKidd #
Бывает.
+1
Ezkimo #
IE вообще самый убогий браузер. Бывают такие баги, что просто ужас. К примеру, изменил я значение (уже не помню точно какое именно, но связанное с текстом), а он мне ничего не изменяет. В Mozill'e и Oper'e всё отлично изменяется. Только reset помог.
НЛО прилетело и опубликовало эту надпись здесь
0
Ezkimo #
ага. постоянно через задний проход делаю.
0
kellas #
мне вот интересно, это такая политика microsoft? Не верю что они не могут написать нормальный браузер.
0
phpdude #
пишут 8ой, обещают что будет правильный браузер) посмотрим.
+1
BVadim #
выпуск восьмой версии не решит проблему IE6 и IE7. IE7 уже 2 года, однако до вытесения им IE6 ещё очень далеко.
+3
mastikhin #
И вы им действительно верите? :)
Я просто даже не знаю… Представляете, рраз — и вдруг все эти проблемы с ослами уйдут в прошлое. Ну такого просто не может быть :)
–2
bolk #
Я им действительно верю, потому что у меня стоит IE8beta2, я её посмотрел.
+3
sphere #
С виду вроде хорошо, а изнутри торчат уши старого осла.
Навскидку, шибко не копаясь: прототипы DOM вроде открыли, а textNode забыт; всё ещё неясная генеалогия некоторых объектов (навроде currentStyle, у которого нельзя перечислить все свойства из-за отсутствия и невозможности назначить hasOwnProperty); перечислить атрибуты элемента всё ещё значительно быстрее регекспом по outerHTML; неймспейсы вроде добавили, а с незнакомыми тегами html-парсер что попало так и делает.
Больше на косметический ремонт по списку фич похоже, чем на капитальный. Потому, на мой взгляд, верить пока рановато.
(Побрюзжал вот.)
НЛО прилетело и опубликовало эту надпись здесь
+1
Treg #
Конечно, это политика Microsoft. Изначально у них в браузере было много «своего», например разные фильтры, которые использовали веб-мастера в своих проектах. В альтернативных браузерах такие сайты не работали, чем и держали аудиторию на IE.
0
bolk #
У всех браузеров собственных стандартов хватает. Вспомните хотя бы XUL в FireFox.
0
Q_Zma #
глупости, каким боком XUL пересекается с проприетарными фичами IE? XUL — язык разметки для создания пользовательских интерфейсов, который используется в интерфейсе самого браузера, это часть платформы.
+1
dfuse #
XUL между прочим — тоже стандарт. И существует он не только в FF. Не путайте тёплое с мягким ;)
0
bolk #
Я не понял причём тут «путанье тёплого с мягким», видимо, просто популярная фраза. Если так посмотреть, что и VML стандарт: www.w3.org/TR/NOTE-VML.html
+1
dfuse #
Ну так а мелкософтовские фильтры и всякие runtimeStyle нигде, кроме как в MSDN официально не описаны, т.е. являются проприетарными, т.е. никакой не стандарт.

Так что тёплое — это узкоспециальные, но стандарты, а мягкое — это мелкософтовские свойства.
0
bolk #
Я вам дал ссылку на VML. Canvas тоже нигде не был описан, сейчас описали, до того как описание на W3C появилось, он был проприетарным?
+1
dfuse #
Вы же прекрасно понимаете о чем речь идет, к чему этот бесполезный спор?
0
bolk #
Вы знаете, я не понимаю.

Когда Microsoft вводит что-то новое, все плюют в Microsoft, тем не менее, во многих браузерах есть что-то своё.
+1
dfuse #
Хорошо, я объясню. *Капитан Очевидность* Идиотская политика Microsoft по части фильтров и проприетарных свойств приводит к тому, что веб-разработчики реализуют через костыли то, что должно было бы быть реализовано само по себе. Вот если бы IE6 поддерживал ВЕСЬ CSS2, со всеми дочерними селекторами, свойствами min- и max-width и прочее — никто бы не ругался, тот же expression вещь удобная. Живет же FF со свойствами -moz- и ничего.

Фишка в том, что вместо добавления своих «недо-креативов» лучше бы задумались о стандартах. И о безусловно верной реализации того, что обязано быть в наличии. Задание на дом — сверстайте мне полупрозрачный фон из PNG, с repeat и смещением фона -10px -10px (background: url(some.png) repeat -10px -10px) в IE6 с помощью гребаных фильтров — может поймете, что их костыли крайне ограничены.

Еще раз чтоб не было кривотолков — в FF есть куча свойств, расширяющих функционал. А в IE есть куча замещающих. Почему я должен писать min-width с помощью expression, когда эта вещь есть в стандарте и всеми нормальными браузерами поддерживается?
0
bolk #
Вы год выпуска IE6 посмотрите. Тут спорить не о чем. Другое время было.
0
Rulez #
Могли бы и апдейты выпустить толковые
0
ayavryk #
вы искренне убеждены что только благодаря фильтрам IЕ натолько популярен, что броузер почти 10 летней давности до сих пор держит четверть аудитории?
0
Treg #
читайте внимательнее, я написал «например»
–1
ayavryk #
Ваш например — глупость. Как и все остальные например. Причина популярности совсем не в «многом своем».
+2
dfuse #
Да нету у него популярности. Просто есть туча контор, где внутренний софт пашет только под IE. Есть куча контор, где политика безопасности не позволяет поставить что-то стороннее, а админам не хочется переучивать кучу народу на другой браузер.

Самое зло — корпоративные клиенты. Сёрферы-одиночки обычно себе ставят что-то понормальнее, чем IE.
–16
exoundeeq #
Это хуета требует включенного js, значит нам не подходит. Тема закрыта. :)
–1
mastikhin #
Всего 2% пользователей выключают JS, это пренебрежимая величина.
+5
phpdude #
можете ему не писать ответы, он не сможет ответить, у него JS выключен 100% :-D
–42
Felix007 #
why-disable-js.on.nimp.org/
тут хорошо расписанно, почему JS все таки резать, и разрешать только для определенных доменов.
+2
phpdude #
как не стыдно, молодой человек!
+1
phpdude #
как плохо вирусы распространять!
+2
vietnamese #
гад, заминусовал бы, да не могу…
0
Felix007 #
А что наглядная демонстрация к чему приводит разрешение исполнять на своей машине чужие скрипты пришлась вам не по нутру? Кстати, включенная в «правильных» и «неправильных» браузерах по умолчанию.

Само оформление страницы наводит на мысли об её содержании, или вам таки хотелось бы почитать километры копипаст, пока на заднем фоне что-то исполняется?

По моему этот сайт наглядный пример для демострации дырявости систем защиты.

ps. Жаль, что в последнее время его режет NOD даже не дав насладиться пользователю парой чудных картинок.
pps. да прибудет с вами NoScript
+6
Lockal #
Для таких сайтов нужен не блокировщик JS, а www.stopbadware.org. Отправил отчёт — теперь к 173077 вредоносным сайтам прибавится ещё один. Эта база данных используется в Google и Firefox.
0
vibornoff #
Какая прелесть! Ссылка-аргумент :-)
0
sunnybear #
а еще у 2% скрипт не будет работать корректно…

Для домашней разработки это приемлемо, но для коммерческого проекта и бренда компании — нет
0
dfuse #
Да, 2% это всетаки достаточно, чтоб поддерживать… У нас в студии психологический барьер правда 3%…
+1
brutaler #
откуда взята эта цифра?
+1
BVadim #
компьютер требует включённого электричества. может эту тему тоже закроем? =)
–3
Ezkimo #
хабр уже не тот.)
–1
Qwertyfog #
Тролли уже не те…

(нет, серьёзно, задолбали хныкающие тролли.)
–1
acy #
У Вас проблемы с восприятием.
0
Ezkimo #
у вас ОБОИХ проблемы.
+11
pepelsbey #
Ещё один «недавно нашёл», а сколько лет проекту? Ага.
А что он делает, когда к странице подключён CSS-файл порядка тысячи строк? Вот именно.

Так что давайте не искать волшебных решений и всяческих JS-панацей.
0
sunnybear #
Вадим, апплодирую стоя! Почему верстальщики до сих пор не воспримут CSS-хаки и условные комментарии (для больших файлов) как меньшее зло из возможных (если сравнивать производительность всех альтернатив)?
0
pepelsbey #
*с достоинством кланяется*

Просто всем хочется найти решение, которое позволит наконец нормально верстать, без оглядки на калечны браузеры, но…

жизнь жёстче, чем ты ожидал, когда был мал.
чтобы её смягчить у меня не хватит мощи,
жизнь жёстче, да, точно, жизнь жёстче


© СБПЧ
+3
Chupa #
Вы бы сначала его попробовали, а потом писали.
Багов словите ще больше причем непонятно как их искоренить. Когда нативные баги ИЕ — то хоть решение на поверхности.
0
egorinsk #
О! Хотел бы спросить, может кто-то знает

1) безывратное решение position:fixed в ИЕ6. трюк с _top:exprression() не прет, там блок дергается при скролле страницы((.

2) как в ИЕ6 сделать якорь например на блок: <div id=«content»>, чтоб работала ссылка href="#content". пока что решел через conditional comments, добавляя для ИЕ тег <a name=«content»></a> перед дивом, и убирая ИД у дива, но это плохо. так как для ИЕ у дива нет ид (так как он уже использован в якоре)

Может кто сталкивался?
0
TiGR #
про position:fixed совсем недавно натыкался на сайте лебедева. Там делается некий финт ушами, когда первые потомки body абсолютно позиционируются. В итоге получается fixed, но несколько наизнанку. Зато работает. И без всяких экспрешенов.
0
bolk #
Можно и проще сделать, если не требуется задание фона картинкой, но последний ( www.artlebedev.ru/tools/technogrette/html/emulate-fixed/ ) способ универсальнее.
НЛО прилетело и опубликовало эту надпись здесь
0
bolk #
Вы посмотрите в чём заключается способ на который я дал ссылку.
НЛО прилетело и опубликовало эту надпись здесь
0
bolk #
Возможно то же самое, сейчас смотреть видео, потом разбираться в примерах только чтобы понять то же самое или нет, не хочется :)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
+1
bolk #
1) www.artlebedev.ru/tools/technogrette/html/emulate-fixed/

2) не знаю, мне всегда хватало <a name>
+1
egorinsk #
Мне надо чтобы при переходе по ссылке экран скроллился на див. Якорь через [a] делает только вертик. скролл. Кроме того, ичпользование [a] для якорей — неудобно, ставить ид на заголовках или дивах правильнее и логичней (и наверно семантичней).

Сразу предупрежу, обертывать див якорем снаружи нельзя, так как в диве есть ссылки.

В общем, из-за долбаного ИЕ опять не получается все сделать просто и красиво а приходится извращаться. Желаю ему сдохнть в страшных муках.
0
Q_Zma #
откройте для себя, что достаточно элементу выставить атрибут id, от можно отказаться
0
bolk #
Посмотрите на что я отвечаю, там написано, что это не работает.
–2
DEbuger #
Ссылки на Якоря по стандартам вешаются только на. htmlbook.ru/html/a.html

Трюки с дивом это уже хук

+2
egorinsk #
Эээ… вы за какой год мануалы читали? Вы стандарт видели?

> 12.2.3 Anchors with the id attribute

> The id attribute may be used to create an anchor at the start tag of any element (including the A element).

( www.w3.org/TR/REC-html40/struct/links.html#h-12.2.3 )
0
DEbuger #
Действительно я был не прав. Спасибо за то что ткнули носом. Просто читаю книжки на русском а не w3.org, как то больше люблю читать на своём родном языке. Видимо и книги какие то не такие… Что не слышал о такой возможности.

Правда все равно как то на мой взгляд, логичнее использовать якоря через ссылки.
Код проще человеком потом будет усваиваться.
+3
egorinsk #
Нет, через ид понятнее и семантичнее так (имхо):

[h2 id=«po4emy-ploxo-usat-a-name»]Почему плохо юзать A name[/h2]

[p]Lorem ipsum dolorem....[/p]

[h2 id=«po4emy-horosho-usat-id»]Почему хорошо юзать id[/h2]

[p]Lorem ipsum...[/p]

↑ так намного логичнее, зачем плодить пустые теги?
НЛО прилетело и опубликовало эту надпись здесь
+1
Delka #
1. body {background-attachment: fixed;}
2. ссылки-якори на div#id отлично работают в IE6. Даже в quirsk mode. И в IE5 тоже.
0
egorinsk #
1) Гм… и что? Это фиксирует фон body, а мен было нужно совсем другое, тут уже в Лебедевский вариант ткнули, плохо конечно, но работает всюду, видимо будем им пользоваться.
2) Точно работают) Видно, в чем-то другом ошибка была(
НЛО прилетело и опубликовало эту надпись здесь
0
egorinsk #
Интересный способ, не слышал)
+3
redigen #
Решение вроде «Каша из топора». Фиксить css с помощью js по моему, сам по себе дикий подход. Не буду говорить о том что ie6 тормозит верстальщиков в использовании доступных свойств и псевдоклассов css2.1, css3, самому хочется использовать в проектах возможности css3. Возможно использование такого скрипта на личных малопосещаемых проектах и нормально, но для крупных проектов скрипт весом 30 кбайт — что прилично, в коде которого еще нужно разобраться и убрать лишние не используемые фиксы, да и задержка при обработке скрипта браузером — слишком большой минус. Что касается уважения себя как верстальщика, хватит уже жаловаться на ie6,7,8 наша работа и заключается в написании кроссбраузерного кода независимо от общепринятых стандартов. Научитесь думать головой, если вы не хотите использовать в коде фиксы для ie и писать только валидный css, то чем данный способ лучше? Грамотный верстальщик может сверстать и без использование фиксов, вопрос только в усложнении кода и времени разработки.
НЛО прилетело и опубликовало эту надпись здесь
0
redigen #
смотря для каких тегов ты используешь эти свойства, если это блочный элемент, должно помочь position: relative;
НЛО прилетело и опубликовало эту надпись здесь
+1
Kirk #
Ну данный скрипт подключаем только под IE 6 например, тем более сей час говорят что IE 7 уже отобрал 70 % пользователей у IE 6, так что подключение этого скрипта для IE 6 не такая уж трата… Дальше можно развивать тему, как уйдет XP, так и уйдет IE 6…
–1
redigen #
70% преувеличение. Где то выше я видел вопрос «А что будет со скриптом при 1000 строчках кода?» у меня в одном проекте над которым я работаю уже более 3000 строчек. Пока скрипт будет выполняться не повесит ли он наш любимый ие? Не понимаю js-программистов, которые первыми пытаются предложить решение проблемы фиксов в верстке, когда в принципе все можно решить менее сложными вещами тому есть пример про top:exprression выше, что вполне можно обойтись без js. Фиксить css с помощью js — это радикально.
0
Q_Zma #
уважаемый, expression есть не что иное как javascript, и иной раз, неумеючи, можно такой экспрешшн написать, что всё будет глючить, виснуть и тормозить
0
redigen #
да уважаемый, но я пишу, что можно сверстать без применения js, иной раз неумелые верстальщики хватаются за js когда решение проблемы того не стоит, пример тому обсуждение выше про top:exprression.
0
Q_Zma #
не можно, а нужно, а костыли для IE это уже другой вопрос, и вопрос спорный — с одной строны: нафиг бы они кому обосрались эти экспрешены и фильтры, с другой стороной — насколько беден был бы сейчас веб, если бы не было этих костылей…
0
Nadin_M #
+1, использовать javascipt для этого — неимоверное извращение, в коде потом вообще не разберешься, и изменить/поправить что-ли станет практически не возможным :)
Я вообще использую скрипты для ИЕ только в двух случаях — для фикса png и для min-width. Всё остальное — верстка. (Хаки я тоже практически не использую) :)
–6
pgg #
Срочно портировать на jQuery!
0
brutaler #
Зачем?
+3
ayavryk #
>Рано или поздно все web-разработчики сталкиваются с ситуацией, когда Internet Explorer становится проблемой. тормозящей разработку проекта

Ваше лекарство хуже болезни.

Можно не любить ie6 или любой другой броузер, но нужно любить пользователя и свою профессию. А ваш подход демонстрирует пренебрежение и тем и другим.

+1
eugeneorlov #
Это общая болезнь всех разработчиков, не только вебных. Обладание знанием, недоступным простому пользователю, делает из большинства разработчиков тупых, самодовольных снобов. Это не ИЕ недобраузер. Это разработчик, не любящий пользователя — недочеловек.
0
variable #
бекграунд в эта штука не лечит…
:hover и :first-child жутко тормозит в ие6…
не буду юзать…
0
variable #
*бекграунд в [tr] эта штука не лечит…
0
lronman #
верстай под браузер camino на маке, и будет одно и тоже во всех браузерах включая осёл 6.
+1
AgaFonOff #
Может под Amaya? :)
0
vithar #
Славен Хабр пионэрами!
0
naryl #
> В итоге можно добиться адекватного отображения сайта во всех популярных браузерах включая IE6 и IE7 которые, к сожалению, пока самые популярные.

Firefox почти догнал IE6+IE7. Кажды из них по отдельности уже давно не самый популярный.
0
piumosso #
Вы меня извините, но если сначала верстаем по стандартам, а потом открываем в IE6, то Вашему верстальщику ещё учиться и учиться)) По-хорошему, нужно изначально учитывать IE.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.