2011-10-20 8 views
10

Dato un file css, esiste un modo per esplorare l'intero file in modo che si applichi solo agli elementi all'interno di un dato elemento:È possibile eseguire l'oscilloscopio dei file CSS in modo che vengano applicati solo ai discendenti di un determinato elemento?

ad es. dato:

<div id="container"> 
    <span class="some_element"/> 
    <!-- etc --> 
</div> 

Esiste un modo per ambito di un intero file css da applicare a tutti gli elementi all'interno "contenitore" senza anteponendo #container ad ogni clausola singolo css?

risposta

7

Ho paura di no. Alcuni pre-processori CSS ti consentono di scrivere codice che ottenga lo stesso risultato.

E.g. LESS implementa regole annidate:

/* This LESS code... */ 

#header { 
    h1 { 
    font-size: 26px; 
    font-weight: bold; 
    } 
    p { font-size: 12px; 
    a { text-decoration: none; 
     &:hover { border-width: 1px } 
    } 
    } 
} 

/* ...produces this CSS */ 

#header h1 { 
    font-size: 26px; 
    font-weight: bold; 
} 
#header p { 
    font-size: 12px; 
} 
#header p a { 
    text-decoration: none; 
} 
#header p a:hover { 
    border-width: 1px; 
} 

E Andy menzionato SASS, che fa la stessa cosa.

+0

È possibile eseguire questa operazione all'interno del browser utilizzando [demo di LESS] (http://leafo.net/lessphp/#demo). Basta incollare il CSS e avvolgerlo con il selettore, ad es., "# Your-custom-scope-selector {/ * CSS qui * /}", fare clic su "Compila" e avrai il tuo CSS con ambito personalizzato. Utile se hai solo bisogno di una trasformazione una tantum e non hai LESS o SCSS sulla tua macchina. – Josh

+0

Ovviamente questo tipo di "scoping" non funzionerà su regole applicate agli elementi del contenitore all'esterno dell'elemento host. Cioè, se il file CSS sorgente ha 'body {font-family: Georgia;}', e lo si cambia in '# your-custom-scope-selector body {font-family: Georgia;}', la regola si fermerà funzionante (assumendo che # your-custom-scope-selector sia da qualche parte * all'interno * dell'elemento body, nello scenario dell'Op, sembra che sia il caso) – Josh

3

Non solo con CSS, ma è possibile utilizzare Sass, che viene compilato in CSS.

-1

Si può caricare la pagina con php e lanciare qualsiasi tag desiderato in modo dinamico, o fare lo stesso con javascript/jQuery ... anche se è abbastanza goffo. Non esiste un metodo integrato per farlo, poiché il CSS viene sempre applicato all'intera pagina.

6

È possibile utilizzare l'attributo scoped su un elemento <style>, anche se il supporto del browser è scarso o nullo. Nel tuo esempio:

<div id="container"> 
    <style scoped>.some_element{}</style> 
    <span class="some_element"></span> 
</div> 

Ecco un jQuery Polyfill: http://thingsinjars.com/post/360/scoped-style/

4

Ci sono 2 modi si potrebbe avvicinarsi a questo:

1) In HTML5, (non ancora ampiamente supportato) ci deve essere un L'attributo scoped è possibile inserire un tag <style>. Here è un breve articolo sull'argomento.

2) È possibile utilizzare un linguaggio di foglio di stile dinamico (come LESS o SASS) che consente di annidare insieme le regole CSS correlate.

+0

# 1 ha le mie speranze ma NO, è solo nella bozza HTML5.1, non nelle specifiche HTML5, e funziona solo su firefox al momento in modo così attuale # 2 è l'unica strada da percorrere – pilavdzice

0

È possibile utilizzare la notazione di denominazione BEM - http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/ ("blocco, elemento, modificatore").

Il vostro esempio diventerebbe:

<div id="container"> 
    <span class="container__some_element"/> 
    <!-- etc --> 
</div> 

Sì, se non utilizzare un'abbreviazione, si sta scrivendo lo stesso numero di caratteri nel CSS ... ma i vostri stili avrete meno specificity - - che può essere utile.

Speriamo che il supporto del browser per <style scoped> migliorerà nei prossimi anni!

Problemi correlati