Примените стиль ТОЛЬКО на IE


184

Вот мой блок CSS:

.actual-form table {
  padding: 5px 0 15px 15px;
  margin: 0 0 30px 0;
  display: block;
  width: 100%;
  background: #f9f9f9;
  border-top: 1px solid #d0d0d0;
  border-bottom: 1px solid #d0d0d0;
}

Я хочу, чтобы IE 7, 8 и 9 "видели" width: 100%

Какой самый простой способ сделать это?


1
Почему вы пытаетесь это сделать? На какую версию IE вы ориентируетесь? А как насчет IE10? (не поддерживает обычные условные комментарии)
— тридцатое

Я пытаюсь настроить таргетинг на IE 7, 8 и 9.
— FastTrack

По какой причине вы можете использовать IE9, а не IE10? Я хотел бы знать ...
— тридцать пятого

1
IE не интерпретирует width: autoблочные элементы так же, как другие браузеры, такие как Firefox или Chrome. В Chrome / Firefox width:autoбудет расширена ширина элемента блока на всю ширину его контейнера. IE не делает этого и требуетwidth: 100%
— FastTrack

Ответы:


102

Обновление 2017

В зависимости от среды, условные комментарии были официально объявлены устаревшими и удалены в IE10 +.


оригинал

Самый простой способ - использовать условный комментарий Internet Explorer в вашем HTML:

<!--[if IE]>
<style>
    .actual-form table {
         width: 100%;
    }
</style>
<![endif]-->

Вы можете использовать множество хаков (например, хак с подчеркиванием ), которые позволят вам нацеливать только IE в пределах вашей таблицы стилей, но это становится очень грязным, если вы хотите использовать все версии IE на всех платформах.


10
Есть ли способ использовать этот условный комментарий в моем файле CSS? Я хотел избежать загромождения своего HTML, если смогу помочь.
— FastTrack

2
@FastTrack - Нет, условные комментарии - это комментарии HTML, поэтому они должны появляться в вашей разметке. Я склонен создавать целую новую таблицу стилей только для IE, а затем включать ее как обычно в условные комментарии.
— Джеймс Аллардис

Джеймс: Я думал об этом, но потом мне приходится бороться с обновлением двух отдельных таблиц стилей каждый раз, когда я хочу что-то изменить, верно?
— FastTrack

3
@FastTrack - Нет, ваша таблица стилей IE будет содержать только стили, специфичные для IE. Включите его после основной таблицы стилей, чтобы при необходимости вы могли переопределить стили, установленные в основной таблице стилей. Так что вам нужно будет обновить его, только если вы хотите изменить что-то конкретное для IE.
— Джеймс Аллардис

1
@FastTrack - Да. Когда что-то указано в нескольких таблицах стилей, включенная позже имеет приоритет.
— Джеймс Аллардис

284
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
   #myElement {
        /* Enter your style code */
   }
}

Объяснение: Это специфичный для Microsoft медиа-запрос. Используя свойство -ms-high-контрастности, характерное для Microsoft IE, оно будет проанализировано только в Internet Explorer 10 или более поздней версии. Я использовал оба допустимых значения медиазапроса, поэтому он будет анализироваться только IE, независимо от того, включен ли пользователь с высокой контрастностью или нет.


6
только он не работает на новом интернет-проводнике (край), нужно добавить его тоже без мс
— Саад Ахмед

6
См. Здесь для определения
— Филлис Сазерленд,

6
@SaadAhmed: это на самом деле проблема? Edge - браузер с хорошим поведением, во всяком случае, намного лучше, чем IE, поэтому многие взломы IE, вероятно, не понадобятся (или разумны)?
— Майкл Шепер,

1
Ну, это решило мои глупые проблемы с IE. Спасибо за исправление!
— Шут

1
@MichaelScheper Эта ошибка, опубликованная в первом комментарии, по-прежнему применяется в новейшей версии (на сегодня 17). Небольшое исправление Саада помогло мне устранить эту причуду.
— SimonRabbit

54

Помимо условных комментариев IE, это обновленный список того, как настроить IE6 на IE10.

Смотрите конкретные CSS & JS хаки за пределами IE .

/***** Attribute Hacks ******/

/* IE6 */
#once { _color: blue }

/* IE6, IE7 */
#doce { *color: blue; /* or #color: blue */ }

/* Everything but IE6 */
#diecisiete { color/**/: blue }

/* IE6, IE7, IE8, but also IE9 in some cases :( */
#diecinueve { color: blue\9; }

/* IE7, IE8 */
#veinte { color/*\**/: blue\9; }

/* IE6, IE7 -- acts as an !important */
#veintesiete { color: blue !ie; } /* string after ! can be anything */

/* IE8, IE9 */
#anotherone  {color: blue\0/;} /* must go at the END of all rules */

/* IE9, IE10, IE11 */
@media screen and (min-width:0\0) {
    #veintidos { color: red}
}


/***** Selector Hacks ******/

/* IE6 and below */
* html #uno  { color: red }

/* IE7 */
*:first-child+html #dos { color: red }

/* IE8 (Everything but IE 6,7) */
html>/**/body #cuatro { color: red }

/* Everything but IE6-8 */
:root *> #quince { color: red  }

/* IE7 */
*+html #dieciocho {  color: red }

/* IE 10+ */
@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
   #veintiun { color: red; }
}

1
Я попробовал \9и \0/для displayселектора класса, но оба будут применяться к IE10, а также. Есть ли способ подать заявку только на IE9 [и ниже или нет]?
— Том Брито,

Вы можете попробовать: \0/IE9но не проверяли это. В противном случае я не знаю другого способа нацеливания на IE9, если вы не используете условные предложения:<!--[if IE 9]><link rel="stylesheet" type="text/css" href="ie9-specific.css" /><![endif]-->
— Oriol

1
@media screen and (min-width:0\0) {Хак , кажется, разбирается IE11, а - так что это не 9 , а 10 только - пожалуйста , перепроверить и обновить свои комментарии.
— Рольф

Я использовал экран @media и (-ms-high-контраст: активный), (-ms-высокий контраст: нет) {} Это работало нормально.
— Harsimer

43

Есть несколько хаков, доступных для IE

Использование условных комментариев с таблицей стилей

<!--[if IE]>
<link rel="stylesheet" type="text/css" href="only-ie.css" />
<![endif]-->

Использование условных комментариев с заголовком css

<!--[if IE]>
<style type="text/css">
    /************ css for all IE browsers ****************/
</style>
<![endif]-->

Использование условных комментариев с элементами HTML

<!--[if IE]> <div class="ie-only"> /*content*/ </div> <![endif]-->

Использование медиа-запроса

 IE10+
 @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
 selector { property:value; }
 }

 IE6,7,9,10
 @media screen and (min-width: 640px), screen\9 {
 selector { property:value; }
 }

 IE6,7
 @media screen\9 {
  selector { property:value; }
 }

 IE8
 @media \0screen {
  selector { property:value; }
 }

 IE6,7,8
 @media \0screen\,screen\9 {
  selector { property:value; }
 }

 IE9,10
 @media screen and (min-width:0\0){
  selector { property:value; }
 }

Обратите внимание, что последний из перечисленных ( min-width:0\0) также относится к IE11
— CBarr

26

Помимо условного комментария можно также использовать CSS Browser Selector http://rafael.adm.br/css_browser_selector/, так как это позволит вам ориентироваться на определенные браузеры. Затем вы можете установить свой CSS как

.ie .actual-form table {
    width: 100%
    }

Это также позволит вам настраивать таргетинг на определенные браузеры в основной таблице стилей без условных комментариев.


Похоже, что это не имеет никакого эффекта в IE9
— FastTrack

Я не понимаю, почему нет, попробуйте .ie9 .actual-form table {width: 100%} в вашем CSS. Надеюсь, это работает для вас.
— frontendzzzguy

.ie9не работает, потому что он не обновлялся с 2010 года.
— Ханна

Это определенно самый элегантный подход. Лично я предпочитаю добавлять браузер css-селекторов на стороне сервера при рендеринге страницы.
— opsb

1
это работает, если вы используете строки агента и динамически добавляете класс селектора в тело.
— Пикапика

6

Я думаю, для лучшей практики вы должны написать условное утверждение IE внутри <head>тега, внутри которого есть ссылка на вашу специальную таблицу стилей, т.е. Это ДОЛЖНО БЫТЬ после вашей пользовательской ссылки CSS, так что она переопределяет последнюю, у меня небольшой сайт, поэтому я использую один и тот же, т.е. CSS для всех страниц.

<link rel="stylesheet" type="text/css" href="index.css" />
<!--[if IE]>
    <link rel="stylesheet" type="text/css" href="all-ie-only.css" />
<![endif]-->

это отличается от ответа Джеймса, поскольку я думаю (личное мнение, потому что я работаю с командой дизайнеров, и я не хочу, чтобы они трогали мои html-файлы и что-то там испортили), вы никогда не должны включать стили в html-файл.


6

Немного опоздал, но это отлично сработало, когда я пытался скрыть фон для IE6 & 7.

.myclass{ 
    background-image: url("images/myimg.png");
    background-position: right top;
    background-repeat: no-repeat;
    background-size: 22px auto;
    padding-left: 48px;
    height: 42px;
    _background-image: none;
    *background-image: none;
}

Я получил этот взлом через: http://briancray.com/posts/target-ie6-and-ie7-with-only-1-extra-character-in-your-css/

#myelement
{
    color: #999; /* shows in all browsers */
    *color: #999; /* notice the * before the property - shows in IE7 and below */
    _color: #999; /* notice the _ before the property - shows in IE6 and below */
}

5

Добро пожаловать BrowserDetect - потрясающая функция.

<script>
    var BrowserDetect;
    BrowserDetect = {...};//  get BrowserDetect Object from the link referenced in this answer
    BrowserDetect.init();
    // On page load, detect browser (with jQuery or vanilla)
    if (BrowserDetect.browser === 'Explorer') {
      // Add 'ie' class on every element on the page.
      $('*').addClass('ie');
    }
</script>

<!-- ENSURE IE STYLES ARE AVAILABLE -->
<style>
    div.ie {
       // do something special for div on IE browser.
    }
    h1.ie {
     // do something special for h1 on IE browser.
    }
</style>

Object BrowserDetect также предоставляет versionинформацию , чтобы мы могли добавить определенные классы - напр. $('*').addClass('ie9');если(BrowserDetect.version == 9) .

Удачи....


4

Это действительно зависит от версий IE ... Я нашел этот превосходный ресурс, который актуален с IE6-10 :

CSS взломать для Internet Explorer 6

Он называется Star HTML Hack и выглядит следующим образом:

  • html .color {color: # F00;} Этот хак использует полностью корректный CSS.

CSS взломать для Internet Explorer 7

Это называется Star Plus Hack.

*: first-child + html .color {color: # F00;} Или более короткая версия:

* + html .color {color: # F00;} Как и взломанный HTML-код звезды, здесь используется действительный CSS.

CSS взломать для Internet Explorer 8

@media \ 0screen {.color {color: # F00;}} Этот хак не использует корректный CSS.

CSS взломать для Internet Explorer 9

: root .color {color: # F00 \ 9;} Этот хак также не использует допустимый CSS.

Добавлено 2013.02.04: К сожалению, IE10 понимает этот взлом.

CSS взломать для Internet Explorer 10

@media screen and (-ms-high-контраст: активный), (-ms-high-контраст: нет) {.color {color: # F00;}} Этот хак также не использует допустимый CSS.


Последний также относится к IE11
— CBarr

2

Для / * Internet Explorer 9+ (однострочный) * /

_::selection, .selector { property:value\0; }

Только это решение отлично работает для меня.


Я знаю, что это некроммент, но это выглядит супер гладко. Тем не менее, я не уверен, что именно он делает, так как выглядит немного загадочно / византийски. Кто-нибудь знает семантику этого утверждения? (как _ :: и \ 0 в конце?)
— Адам Р. Тернер

1
Также применяется правило для Chrome: /
— Trincot

2
<!--[if !IE]><body<![endif]-->
<!--[if IE]><body class="ie"> <![endif]-->

body.ie .actual-form table {
    width: 100%
}

2

Для IE9 +

@media screen and (min-width:0\0) and (min-resolution: +72dpi) {
   // IE9+ CSS
   .selector{
      color: red;
   }
}

IE Edge 12+

@supports (-ms-ime-align: auto) {
  .selector {
    color: red;
  }
}

Этот работает на Edge и всех IE

:-ms-lang(x), .selector { color: red; }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.