Jak kierować reklamy tylko na IE (dowolną wersję) w arkuszu stylów?

195

Mam odziedziczony projekt i są miejsca, w których jest kompletny bałagan. To jest jeden z nich. Muszę kierować tylko na IE (dowolną wersję).

#nav li {
    float: left;
    height: 54px;
    background: #4f5151;
    display: table;
    border-left: 1px solid grey;
}

Żeby było jasne: wewnątrz osadzonego arkusza stylów i bez dodawania identyfikatorów lub klas do tagów w html, muszę zastosować styl ramki tylko wtedy, gdy użytkownik używa IE. W jaki sposób mogę to zrobić?

Edycja: znalazłem rozwiązanie dla Firefoksa, edytując pytanie, aby to odzwierciedlić.

MetalPhoenix
źródło
Twoje pytanie jest trochę mylące. Czy odnosisz się do prefiksów dostawcy dla właściwości CSS, czy też do identyfikowania przeglądarki użytkownika za pomocą wąchania UA, a następnie stosowania arkusza stylów tylko wtedy, gdy pasuje? ...
War10ck
W przypadku Fireofox: stackoverflow.com/questions/952861/…
nikoskip
Aby kierować na IE, musisz zmodyfikować plik HTML i dodać komentarze warunkowe, w przypadku IE10 będziesz również potrzebować trochę Javascript, ponieważ ma on 0 komentarzy komentarzy warunkowych. EDYCJA Istnieje kilka hacków CSS, które mają na celu celowanie w niektóre wersje IE, ale to też jest problem - to są hacki.
Ramiz Wachtler,
1
możliwy duplikat Zastosuj styl TYLKO na IE
MatthewG
1
Jeśli potrzebujesz rozwiązania w swoim CSS, mogę myśleć tylko w JavaScript. Znalazłem ten rafael.adm.br/css_browser_selector, ale jest trochę przestarzały.
nikoskip,

Odpowiedzi:

429

Internet Explorer 9 i nowsze wersje : Możesz użyć komentarzy warunkowych, aby załadować arkusz stylów specyficzny dla IE dla dowolnej wersji (lub kombinacji wersji), na którą chcesz konkretnie kierować. Tak jak poniżej, używając zewnętrznego arkusza stylów.

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

Jednak począwszy od wersji 10 komentarze warunkowe nie są już obsługiwane w IE.

Internet Explorer 10 i 11: Utwórz zapytanie o media, używając opcji -ms-high-contrast, w której umieścisz style CSS specyficzne dla IE 10 i 11. Ponieważ -ms-wysoki kontrast jest specyficzny dla Microsoft (i dostępny tylko w IE 10+), zostanie przeanalizowany tylko w Internet Explorerze 10 i nowszych.

@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
     /* IE10+ CSS styles go here */
}

Microsoft Edge 12: Może korzystać z reguły @supports Oto link ze wszystkimi informacjami na temat tej reguły

@supports (-ms-accelerator:true) {
  /* IE Edge 12+ CSS styles go here */ 
}

Wykrywanie wbudowanej reguły IE8

Mam jeszcze 1 opcję, ale wykrywa ona tylko IE8 i wersję poniżej.

  /* For IE css hack */
  margin-top: 10px\9 /* apply to all ie from 8 and below */
  *margin-top:10px;  /* apply to ie 7 and below */
  _margin-top:10px; /* apply to ie 6 and below */

Jak określiłeś dla osadzonego arkusza stylów. Myślę, że musisz użyć zapytania o media i komentarza warunkowego dla poniższej wersji.

Jay Patel
źródło
14
Dobrze, przetestowałem, że ta poprawka nie wpływa na przeglądarkę Edge, zastanawiał się JIC.
j4v1
również potrzebuje @ wsparcia (-ms-Accelerator: auto) dla krawędzi patrz poniżej
Phyllis Sutherland
5
W Edge korzystam z @supports (-ms-ime-align: auto) zamiast -ms-Accelerator
SeventhSteel
-ms-high-contrast:activewpływa na Edge, jeśli system używa trybu wysokiego kontrastu.
ShortFuse
@supportsRozwiązanie jest naprawdę świetne: detekcja cechą jest droga. Byłem skłonny zaatakować Edge'a ze względu na brak wsparcia width: max-content: @supports not (width: max-content)czy robi to starannie i zostanie miło zignorowany, gdy Edge w końcu go poprze . (Powinno to nastąpić jesienią 2019 r., Ponieważ powinno się wtedy przełączyć na Chromium do renderowania).
Frédéric
76

Oto zbiór zapytań o media, które pozwolą ci to zrobić dla dowolnej wersji Internet Explorera (od IE6 do IE11 +), Firefox, Chrome i Safari (EDYCJA: także dodana Opera).

IE 6

* html .ie6 { property: value; }

lub

.ie6 { _property: value; }

IE 7

*+html .ie7 { property: value; }

lub

*:first-child+html .ie7 { property: value; }

IE 6 i 7

@media screen\9 { 
    .ie67 {
        property: value; 
    }
}

lub

.ie67 { *property: value; }

lub

.ie67 { #property: value; }

IE 6, 7 i 8

@media \0screen\,screen\9 {
    .ie678 {
        property: value;
    }
}

IE 8

html>/**/body .ie8 { property: value; }

lub

@media \0screen {
    .ie8 {
        property: value;
    }
}

Tryb norm IE 8

.ie8 { property /*\**/: value\9 }

IE 8,9 i 10

@media screen\0 {
    .ie8910 {
        property: value;
    }
}

Tylko IE 9

@media screen and (min-width:0\0) and (min-resolution: .001dpcm) { 
    // IE9 CSS
    .ie9{
        property: value;
    }
}

IE 9 i wyżej

@media screen and (min-width:0\0) and (min-resolution: +72dpi) {
    // IE9+ CSS
    .ie9up { 
        property: value; 
    }
}

IE 9 i 10

@media screen and (min-width:0\0) {
    .ie910 {
        property: value\9;
    } /* backslash-9 removes ie11+ & old Safari 4 */
}

Tylko IE 10

_:-ms-lang(x), .ie10 { property: value\9; }

IE 10 i wyżej

_:-ms-lang(x), .ie10up { property: value; }

lub

@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
    .ie10up {
        property:value;
    }
}

IE 11 (i wyżej ..)

_:-ms-fullscreen, :root .ie11up { property: value; }

Firefox (dowolna wersja)

@-moz-document url-prefix() {
    .ff {
        color: red;
    }
}

Firefox (tylko Quantum / Stylo)

@-moz-document url-prefix() {
    @supports (animation: calc(0s)) {
        /* Stylo */
        .ffStylo {
            property: value;
        }
    }
}

Firefox Legacy (przed stylem)

@-moz-document url-prefix() {
    @supports not (animation: calc(0s)) {
        /* Gecko */
        .ffGecko {
            property: value;
        }
    }
}

Webkit (Chrome i Safari, dowolna wersja)

@media screen and (-webkit-min-device-pixel-ratio:0) { 
    property: value;
}

Google Chrome (29+)

@media screen and (-webkit-min-device-pixel-ratio:0) and (min-resolution:.001dpcm) {
    .chrome {
        property: value;
    }
}

Safari (7.1+)

_::-webkit-full-page-media, _:future, :root .safari_only {
    property: value;
}

Safari (od 6.1 do 10.0)

@media screen and (min-color-index:0) and(-webkit-min-device-pixel-ratio:0) { 
    @media {
        .safari6 { 
            color:#0000FF; 
            background-color:#CCCCCC; 
        }
    }
}

Safari (10.1+)

@media not all and (min-resolution:.001dpcm) { 
    @media {
        .safari10 { 
            color:#0000FF; 
            background-color:#CCCCCC; 
        }
    }
}

Opera (12+)

@media (min-resolution: .001dpcm) {
    _:-o-prefocus, .selector {
        .opera12 {
            color:#0000FF; 
            background-color:#CCCCCC; 
        }
    } 
}

Opera (11 i niższe)

@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) {
    .opera11 {
        color:#0000FF; 
        background-color:#CCCCCC; 
    }
}

Aby uzyskać więcej informacji lub dodatkowe zapytania o media, odwiedź witrynę browserhacks.com i / lub sprawdź ten post na blogu, który napisałem na ten temat.

Darkseal
źródło
1
Wrzesień 2018, a ty wciąż ratujesz życie! Wielkie dzięki. A co z Operą (starsze wersje)? Tylko Webkit?
Dziewczyna z rudymi włosami
1
@Thegirlwithredhair jest kilka hacków do wyboru w celu wybrania Opery> = 9, Opera <= 9 i Opera <= 11 tutaj: browserhacks.com/#op
Darkseal
1
@Thegirlwithredhair Do mojej powyższej odpowiedzi dodałem dwa zapytania o media, których można użyć do kierowania Opery> = 12 i Opery <= 11.
Darkseal
12

Podczas korzystania SASSużywam następujących 2, @media queriesaby celować w IE 6-10 i EDGE.

@media screen\9
    @import ie_styles
@media screen\0
    @import ie_styles

http://keithclark.co.uk/articles/moving-ie-specific-css-into-media-blocks/

Edytować

Docieram również do późniejszych wersji EDGE @support queries(dodaj tyle, ile potrzebujesz)

@supports (-ms-ime-align:auto)
    @import ie_styles
@supports (-ms-accelerator:auto)
    @import ie_styles

https://jeffclayton.wordpress.com/2015/04/07/css-hacks-for-windows-10-and-spartan-browser-preview/

minlare
źródło
4

Aby kierować reklamy na IE tylko w moich arkuszach stylów, używam Sass Mixin:

@mixin ie-only {
  @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
    @content;
  }
}
Ilham Moutaharik
źródło
0

Innym działającym rozwiązaniem dla stylizacji specyficznej dla IE jest

<html data-useragent="Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)">

A potem twój selektor

html[data-useragent*='MSIE 10.0'] body .my-class{
        margin-left: -0.4em;
    }
Sahib Khan
źródło
Niestety, w oryginalnym poście HTML nie mógł być edytowany. Przyjrzałem się trochę twojemu proponowanemu rozwiązaniu i ma ono sens, jeśli możesz zaplanować to z wyprzedzeniem.
MetalPhoenix
Być może masz rację jak w poście, ale żadne z rozwiązań nie działa w najnowszych wersjach IE. Styl warunkowy nie jest już obsługiwany.
Sahib Khan
I tak, @supports to inne rozwiązanie, jeśli nie możesz edytować tagu HTML itp.
Sahib Khan
@supports (-ms-ime-align: auto) {.myclass {/ * styles * /}}
Sahib Khan
0

Po napotkaniu problemów z awarią witryn w Edge podczas korzystania z trybu wysokiego kontrastu natknąłem się na następującą pracę Jeffa Claytona:

https://browserstrangeness.github.io/css_hacks.html

To szalone, dziwne zapytanie medialne, ale w Sass są łatwiejsze:

@media screen and (min-width:0\0) and (min-resolution:+72dpi), \0screen\,screen\9 {
   .selector { rule: value };
}

To jest oczekiwane wersje IE oczekiwane dla IE8.

Lub możesz użyć:

@media screen\0 {
  .selector { rule: value };
}

Który celuje w IE8-11, ale także uruchamia FireFox 1.x (co w moim przypadku nie ma znaczenia).

W tej chwili testuję z obsługą drukowania, i wydaje się, że działa dobrze:

@media all\0 {
  .selector { rule: value };
}
ShortFuse
źródło