Переключение тем в элементе Polymer shadow DOM

Мы делаем довольно сложное приложение, которое будет иметь разные наборы файлов CSS для применения к различным пользовательским элементам. Каков хороший способ динамического переключения включенной таблицы стилей?

из

<template>
  <link rel="stylesheet" href="../themes/dark.css">
  <div id="container"></div>
</template>

to

<template>
  <link rel="stylesheet" href="../themes/light.css">
  <div id="container"></div>
</template>

person forresto    schedule 06.03.2014    source источник


Ответы (2)


Платформенная поддержка таблиц стилей внутри теневых корней практически не существует, поэтому Polymer применяет множество трюков, чтобы сделать его простым. Чтобы поддерживать нормальную производительность, Polymer делает это в качестве предварительной обработки при настройке типа элемента.

В результате трудно загружать или манипулировать таблицей стилей внутри теневого корня во время выполнения, как это.

Одна вещь, которую вы можете сделать сегодня, — это использовать комбинаторы /shadow/ и /shadow-deep/ (ранее ^ и ^^) для создания таблицы стилей, которая живет в основном документе, но может по-прежнему стилизовать внутренности элементов. Таким образом, вы можете использовать стандартные методы для управления динамикой вашей таблицы стилей.

http://dev.w3.org/csswg/shadow-styling/#inheritance

Также обратите внимание, что вы должны поместить атрибут shim-shadowdom в любой стиль или тег ссылки не в шаблоне Polymer, который использует новые комбинаторы, если вы хотите, чтобы они были полифиллированы в неподдерживающих браузерах.

e.g. <link rel="stylesheet" href="sheet.css" shim-shadowdom>

См. http://www.polymer-project.org/docs/polymer/styling.html#sdcss

person Scott Miles    schedule 06.03.2014
comment
У меня не получилось заставить котов и шапки работать как с нативом, так и с полифиллом. Трюки есть? - person forresto; 07.03.2014
comment
Вам нужно быть более конкретным, может быть, предоставить JSBin? - person Scott Miles; 07.03.2014
comment
С /shadow/ таблицей стилей, которая находится в основном документе, она работает в Chrome Canary, но не в Chrome 33 или Firefox. Без него наоборот. - person forresto; 08.03.2014
comment
/shadow/ совсем новый, буквально пару дней назад. Убедитесь, что вы обновили Polymer до последней версии. - person Scott Miles; 08.03.2014
comment
Этот пример из документации работает в Chrome 35, но не Chrome 33 или Firefox: i.imgur.com/XTqIRKt.png - person forresto; 18.03.2014
comment
Хорошо, html /shadow-deep/ button в стиле страницы работает с нативным, но не с полифиллом. button-thing /shadow/ button в пользовательском стиле элемента работает с обоими. jsbin.com/zabid/3/edit - person forresto; 20.03.2014
comment
О, пропустил совет shim-shadowdom. Теперь это работает извне. - person forresto; 20.03.2014
comment
Всегда ли она актуальна с новой версии полимера? - person maxiplay; 27.02.2016

Самый простой способ, который приходит мне на ум, это:

<template id="myTempl" bind>
  <link rel="stylesheet" href="../themes/{{theme}}.css">
  <div id="container">Hello {{theme}}</div>
</template>
<script type="text/javascript">
    document.getElementById("myTempl").model={
        theme: "dark" //"light"
    };
</script>
person tomalec    schedule 06.03.2014
comment
Извините, @tomalec, сегодня это не сработает. <link rel="stylesheet"> не поддерживается спецификацией ShadowDOM, поэтому Polymer пытается указать путь производителям браузеров через JavaScript. Мы делаем это с помощью трюков, которые нелегко обобщить (например, работать динамически) без ущерба для производительности. - person Scott Miles; 07.03.2014
comment
Извините за шум, как вы его разместили, это просто шаблон, так что может работать. Он не будет работать внутри элемента Polymer, что подразумевалось в ОП. - person Scott Miles; 07.03.2014