Applica lo stile SOLO su IE


184

Ecco il mio blocco di 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;
}

Voglio solo IE 7, 8 e 9 per "vedere" width: 100%

Qual è il modo più semplice per raggiungere questo obiettivo?


1
Perché stai cercando di farlo? Quali versioni di IE stai prendendo di mira? Che dire di IE10? (non supporta i soliti commenti condizionali)
tredici

Sto cercando di scegliere come target IE 7, 8 e 9.
FastTrack,

Quale motivo potresti avere come target IE9 ma non IE10? Mi piacerebbe saperlo ...
Il

1
IE non interpreta gli width: autoelementi a blocchi allo stesso modo di altri browser come Firefox o Chrome. In Chrome / Firefox width:autoestenderà la larghezza di un elemento a blocco per l'intera larghezza del suo contenitore. IE non lo fa e richiedewidth: 100%
FastTrack il

Risposte:


102

Aggiornamento 2017

A seconda dell'ambiente, i commenti condizionali sono stati ufficialmente deprecati e rimossi in IE10 +.


Originale

Il modo più semplice è probabilmente usare un commento condizionale di Internet Explorer nel tuo HTML:

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

Esistono numerosi hack (ad esempio l' hack di sottolineatura ) che puoi utilizzare per indirizzare solo IE all'interno del tuo foglio di stile, ma diventa molto complicato se vuoi scegliere come target tutte le versioni di IE su tutte le piattaforme.


10
Esiste un modo per utilizzare quel commento condizionale all'interno del mio file CSS? Volevo evitare di ingombrare il mio HTML se potessi evitarlo.
FastTrack,

2
@FastTrack - No, i commenti condizionali sono commenti HTML, quindi devono apparire nel markup. Tendo a creare un foglio di stile completamente nuovo solo per IE e quindi includerlo normalmente nei commenti condizionali.
James Allardice,

James: Stavo pensando di farlo, ma poi devo fare i conti con l'aggiornamento di due fogli di stile separati ogni volta che voglio cambiare qualcosa, giusto?
FastTrack,

3
@FastTrack - No, il foglio di stile di IE conterrebbe solo stili specifici di IE. Includilo dopo il foglio di stile principale in modo da poter sostituire gli stili impostati nel foglio di stile principale, ove necessario. Quindi dovresti aggiornarlo solo se vuoi cambiare qualcosa di specifico per IE.
James Allardice,

1
@ FastTrack - Sì. Quando qualcosa viene specificato in più di un foglio di stile, quello incluso in seguito ha la precedenza.
James Allardice,

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

Spiegazione: È una query multimediale specifica di Microsoft. Utilizzando la proprietà -ms-high-contrast specifica per Microsoft IE, verrà analizzato solo in Internet Explorer 10 o versioni successive. Ho usato entrambi i valori validi della media query, quindi verrà analizzata solo da IE, indipendentemente dal fatto che l'utente abbia abilitato il contrasto elevato o meno.


6
solo che non funziona sul nuovo Internet Explorer (edge), deve aggiungerlo anche senza ms
Saad Ahmed,


6
@SaadAhmed: è davvero un problema? Edge è un browser ragionevolmente ben educato, comunque molto meglio di IE, quindi molti hack di IE probabilmente non saranno necessari (o prudenti)?
Michael Scheper,

1
Bene, questo ha risolto i miei stupidi problemi con IE. Grazie per la correzione!
Giullare

1
@MichaelScheper Questo bug postato nel primo commento si applica ancora al limite più recente (17 per oggi). La piccola correzione di Saad mi ha aiutato a rimuovere questa stranezza.
SimonRabbit

54

Oltre ai commenti condizionali di IE, questo è un elenco aggiornato su come indirizzare IE6 a IE10.

Vedi specifici hack CSS e JS oltre a 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
Sono provato \9e \0/per displayun selettore di classe, ma entrambi si applicheranno anche a IE10. C'è un modo per fare domanda solo per IE9 [e sotto o no]?
Tom Brito,

Puoi provare: \0/IE9ma non l'ho provato. Altrimenti non conosco nessun altro modo per scegliere come target IE9 se non usi clausole condizionali:<!--[if IE 9]><link rel="stylesheet" type="text/css" href="ie9-specific.css" /><![endif]-->
Oriol

1
L' @media screen and (min-width:0\0) {hack sembra essere analizzato anche da IE11 - quindi non sono solo 9 e 10 - ricontrolla e aggiorna i tuoi commenti.
Rolf,

Ho usato lo schermo @media e (-ms-high-contrast: attivo), (-ms-high-contrast: none) {} Ha funzionato bene.
Harsimer,

43

Esistono vari hack disponibili per IE

Utilizzo dei commenti condizionali con foglio di stile

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

Utilizzo dei commenti condizionali con la sezione head css

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

Utilizzo di commenti condizionali con elementi HTML

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

Utilizzo di media query

 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; }
 }

Si noti che l'ultimo elencato ( min-width:0\0) si applica anche a IE11
CBarr

26

Oltre a un commento condizionale, puoi anche utilizzare il selettore browser CSS http://rafael.adm.br/css_browser_selector/ poiché ciò ti consentirà di scegliere come target browser specifici. È quindi possibile impostare il CSS come

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

Ciò ti consentirà anche di scegliere come target browser specifici all'interno del tuo foglio di stile principale senza la necessità di commenti condizionali.


Ciò non sembra avere alcun effetto in IE9
FastTrack il

Non vedo perché no, prova .ie9 .actual-form table {larghezza: 100%} nel tuo CSS. Spero che funzioni per te.
frontendzzzguy,

.ie9non funziona perché non è stato aggiornato dal 2010.
Hanna

Questo è sicuramente l'approccio più elegante. Personalmente preferisco aggiungere il lato server selettori css del browser durante il rendering della pagina.
opsb,

1
funziona se si utilizzano stringhe di agente e si aggiunge dinamicamente la classe selector al corpo.
pikapika,

6

Penso che per la migliore pratica dovresti scrivere una dichiarazione condizionale di IE all'interno del <head>tag che all'interno ha un link al tuo speciale foglio di stile. Questo DEVE ESSERE dopo il tuo link css personalizzato in modo da sovrascrivere quest'ultimo, ho un piccolo sito quindi uso lo stesso vale a dire css per tutte le pagine.

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

questo differisce dalla risposta di James come penso (opinione personale perché lavoro con un team di designer e non voglio che tocchino i miei file html e rovinino qualcosa lì) non dovresti mai includere gli stili nel tuo file html.


6

Un po 'in ritardo su questo, ma questo ha funzionato perfettamente per me quando ho cercato di nascondere lo sfondo per IE6 e 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;
}

Ho ricevuto questo trucco tramite: 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

Benvenuto BrowserDetect - una funzione fantastica.

<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>

Il Object BrowserDetect fornisce anche versioninformazioni in modo che possiamo aggiungere classi specifiche - ad es. $('*').addClass('ie9');se (BrowserDetect.version == 9).

In bocca al lupo....


4

Dipende molto dalle versioni di IE ... Ho trovato questa eccellente risorsa aggiornata da IE6-10 :

CSS hack per Internet Explorer 6

Si chiama Star HTML Hack e ha il seguente aspetto:

  • html .color {color: # F00;} Questo hack utilizza CSS completamente valido.

CSS hack per Internet Explorer 7

Si chiama Star Plus Hack.

*: first-child + html .color {color: # F00;} O una versione più breve:

* + html .color {color: # F00;} Come l'hacking HTML stella, utilizza CSS valido.

CSS hack per Internet Explorer 8

@media \ 0screen {.color {color: # F00;}} Questo hack non utilizza CSS valido.

CSS hack per Internet Explorer 9

: root .color {color: # F00 \ 9;} Anche questi hack non usano CSS validi.

Aggiunto il 2013.02.04: Sfortunatamente IE10 comprende questo trucco.

CSS hack per Internet Explorer 10

@media screen e (-ms-high-contrast: active), (-ms-high-contrast: none) {.color {color: # F00;}} Anche questi hack non usano CSS validi.


L'ultimo vale anche per IE11
CBarr

2

Per / * Internet Explorer 9+ (one-liner) * /

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

Solo questa soluzione funziona perfettamente per me.


So che questo è un necrocomment, ma sembra super lucido. Tuttavia, non sono sicuro di cosa stia facendo esattamente perché sembra un po 'arcano / bizantino. Qualcuno conosce la semantica di questa affermazione? (come il _ :: e il \ 0 alla fine?)
Adam R. Turner

1
Si applica anche la regola per Chrome: /
trincot

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

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

2

Per 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;
  }
}

Questo funziona su Edge e su tutti gli IE

:-ms-lang(x), .selector { color: red; }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.