Выбор элемента по его атрибуту, когда он имеет двоеточие в своем имени

Рассмотрим выбор CSS, который у меня есть:

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

Это пример диаграммы с использованием https://gionkunz.github.io/chartist-js/

Я пытаюсь выбрать элементы ct-bar:

введите описание изображения здесь

Дыра, кажется, выбрасывает селектор. я пытался различные escape-подходы:,\3A с пробелом после, одиночные и двойные кавычки - не повезло.

Ответы

Ответ 1

Я никогда не использовал Chartist, но, судя по префиксу пространства имен ct:, он является расширением для разметки SVG. Таким образом, вы больше не имеете дело с HTML здесь; вы имеете дело с XML, потому что SVG - это язык разметки на основе XML.

Выход из двоеточия или иное указание его как части имени атрибута не работает, потому что ct: больше не становится частью имени атрибута, когда он обрабатывается как префикс пространства имен (что является тем, чем оно является). В обычном HTML-документе имя атрибута типа ct:series-name действительно будет включать префикс, потому что префиксы пространства имен имеют особый смысл в XML, а не в HTML.

В любом случае, веб-инспектор показывает следующий XML-код для вашего тега svg:

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

Что вам нужно сделать, это отразить это пространство имен XML в вашем CSS, используя @namespace rule:

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

И вместо того, чтобы избегать двоеточия, используйте канал, чтобы указать префикс пространства :

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

И он должен работать как ожидалось.

Ответ 3

Кажется, что селектор пространства имен будет работать только тогда, когда пространство имен определено внутри самого CSS в следующем формате:

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

От Спектры селекторов: акцент мой

Имя атрибута в селекторе атрибутов указывается как квалифицированное имя CSS: префикс префикса пространства имен, который был ранее объявлен, может быть добавлен к имени атрибута, разделенному разделителем пространства имен "вертикальная панель" ( |).

Селектор атрибутов с именем атрибута, содержащим префикс пространства имен, который ранее не был объявлен, является недопустимым селектором.

Как только мы добавим определение пространства имен для ct в CSS, селектор на основе пространства имен работает как ожидалось. URI пространства имен был взят из тега <svg>, который был сгенерирован.

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="#" onclick="location.href='https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.css'; return false;" rel="stylesheet" />
<div id="myChart" class="ct-chart" style="height:400px"></div>