2015-12-24 13 views
16

consideri la selezione CSS che ho qui:Selezione di un elemento dal suo attributo quando ha due punti nel suo nome

http://jsfiddle.net/dx8w6b64/

/* This works: 
#myChart .ct-series-b .ct-bar { 
*/ 


/* This does not (chromium, glnxa64) */ 
['ct\:series-name'='second'] .ct-bar { 
    /* Colour of your points */ 
    stroke: black; 
    /* Size of your points */ 
    stroke-width: 20px; 
    /* Make your points appear as squares */ 
    stroke-linecap: round; 
} 

Questo è un grafico di esempio utilizzando https://gionkunz.github.io/chartist-js/

Sono cercando di selezionare gli elementi della barra di ct:

enter image description here

Sembra che il colon tocchi il selettore. Ho provato diversi approcci di fuga:, \ 3A con uno spazio dopo, virgolette singole e doppie - senza fortuna.

+0

non inserire affatto l'attributo tra virgolette, ad esempio '[ct \: series-name = 'second']' (non testato, ma ho letto su questo da qualche parte ieri) –

+0

Questo è un po 'strano. '[ct \: series-name =" second "]' [funziona qui] (https://jsfiddle.net/f75pc8jg/), ma [non qui] (http://jsfiddle.net/zytLyyjo/). Nel DOM, l'attributo viene visualizzato come 'ct: series-name =" second "', ma quando si controlla l'HTML effettivo, l'attributo è 'series-name =" second "' (per me almeno nella console di Chrome). –

+0

Vedi http://stackoverflow.com/questions/24628932/do-css-namespace-attribute-selectors-work-with-xhtml-html-elements e http://stackoverflow.com/questions/24390558/css-attribute- namespace-selector-in-svg –

risposta

6

Non ho mai usato Chartist, ma a giudicare dal prefisso namespace ct:, sembra essere una proroga per SVG markup. Quindi non hai più a che fare con l'HTML qui; hai a che fare con XML, perché SVG è un linguaggio di markup basato su XML.

Evasione del colon o altrimenti specificandolo come parte del nome di attributo non funziona perché il ct: non entra a far parte del nome dell'attributo quando è trattato come un prefisso dello spazio dei nomi (che è quello che è). In un normale documento HTML, un nome di attributo come ct:series-name includerebbe effettivamente il prefisso, perché i prefissi dei namespace hanno solo un significato speciale in XML, non in HTML.

In ogni caso, l'ispettore web mostra il seguente codice XML per il tag svg inizio:

<svg class="ct-chart-bar" xmlns:ct="http://gionkunz.github.com/chartist-js/ct" width="100%" height="100%" style="width: 100%; height: 100%;"> 

Quello che dovete fare è riflettere questo namespace XML nel CSS utilizzando un @namespace rule:

@namespace ct 'http://gionkunz.github.com/chartist-js/ct'; 

E, piuttosto che sfuggire ai due punti, utilizzare un tubo per indicare un namespace prefix:

[ct|series-name='second'] .ct-bar { 
    stroke: black; 
    stroke-width: 20px; 
    stroke-linecap: round; 
} 

E it should work as expected.

+0

Oh, vedo che è questo il motivo per cui '\:' non funziona nemmeno dopo aver aggiunto la dichiarazione dello spazio dei nomi. – Harry

+2

O più facile, usa uno spazio dei nomi jolly ('* | attr') , non c'è bisogno di dichiarare il nome espaces. Vedi http: // StackOverflow.com/a/23047888/3702797 – Kaiido

+0

@Kaiido: supponendo che i nomi degli attributi siano abbastanza unici per i rispettivi spazi dei nomi, in realtà non è necessario che il nome dello spazio dei nomi sia disambiguo (che è, si sa, l'intero punto dei namespace). – BoltClock

3

Non si dovrebbe citare il nome dell'attributo, altrimenti si sta eseguendo correttamente l'escape dei due punti.

[ct\:series-name='second'] 

Vedi https://msdn.microsoft.com/en-us/library/ms762307(v=vs.85).aspx

+0

Ricordo di aver provato anche quello. Come questo: http://jsfiddle.net/whfactq2/? Ancora non sembra funzionare :( –

+0

Il mio male, di solito metto alla prova le mie risposte, ma sono sul mio telefono, hai visto la sintassi di @namespace? Https://developer.mozilla.org/en-US/docs/Web/CSS/@ namespace –

+0

Questo documento MSDN sembra essere molto vecchio - fa riferimento a IE come "Microsoft® Internet Explorer", che è stato utilizzato l'ultima volta con * IE6 * prima che iniziasse a chiamarlo "Windows® Internet Explorer" con IE7 nel 2006. @namespace è stato introdotto e implementato relativamente di recente - con IE prima implementandolo nella versione 9 nel 2011, insieme con l'introduzione del supporto per application/xhtml + xml. – BoltClock

3

Sembra che il selettore namespace avrebbe funzionato solo quando lo spazio dei nomi è definito all'interno della stessa CSS nel formato di seguito:

@namespace <namespace-prefix>? [ <string> | <uri> ]; 

Da Selectors Spec: enfasi è mio

Il nome attributo in un selettore di attributo è fornito come nome qualificato CSS: un prefisso dello spazio dei nomi che è stato precedentemente dichiarato può essere anteposto al nome dell'attributo separato dal separatore di spazi dei nomi "barra verticale" (|).

Un selettore di attributo con un nome di attributo contenente un prefisso del namespace che non è stato dichiarato in precedenza è un selettore non valido.

Una volta aggiunta la definizione dello spazio dei nomi per ct nel CSS, il selettore basato sullo spazio dei nomi funziona come previsto. L'URI dello spazio dei nomi è stato preso dal tag <svg> che è stato generato.

var data = { 
 
    labels: ['W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7', 'W8', 'W9', 'W10'], 
 
    series: [{ 
 
    name: 'first', 
 
    data: [1, 2, 4, 8, 6, -2, -1, -4, -6, -2] 
 
    }, { 
 
    name: 'second', 
 
    data: [3, 4, 2, 6, 3, 2, 1, 4, 6, 2] 
 
    }] 
 
}; 
 

 
var options = { 
 
    high: 10, 
 
    low: -10, 
 
    onlyInteger: true 
 
}; 
 

 
new Chartist.Bar('.ct-chart', data, options);
@namespace ct url(http://gionkunz.github.com/chartist-js/ct); 
 
[ct|series-name="second"] .ct-bar { 
 
    stroke: black !important; /* without important it doesn't seem to work in snippet but works in fiddle */ 
 
    stroke-width: 20px; 
 
    stroke-linecap: round; 
 
}
<script src="https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.js"></script> 
 
<link href="https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.css" rel="stylesheet" /> 
 
<div id="myChart" class="ct-chart" style="height:400px"></div>

Fiddle Demo.


Nota: Il sotto di selezione non funziona anche dopo che si aggiunge alla definizione dello spazio dei nomi. Il motivo è fornito da BoltClock inhis answer.

[ct\:series-name="second"] .ct-bar {} 
Problemi correlati