2016-11-30 4 views
0

У меня есть кусок CSS как строка, и я хочу вставить его в DOM, чтобы он применим только к элементам в конкретном контейнере. Некоторые инструменты, такие как Polymer, например, переписывают селектор CSS, поэтому они применяются только в ограниченной области. Как я могу сделать что-то подобное, чтобы при вставке этого CSS в DOM он не изменил все элементы на странице?Как я могу программно изменить CSS, чтобы ограничить его область?

Чтобы сделать его более конкретным, представьте себе следующий HTML и CSS из внешнего источника:

<style>p { font-size: 20px; }</style> 
<p>Boo.</p> 

Я хочу, чтобы вставить эти элементы в #container элемент, но я не хочу, чтобы изменить Font- размер для всех <p> элементов. Я хотел бы переписать все селекторы внутри этого элемента <style>, поэтому они применимы только в пределах #container (p ->#container p и т. Д.). Как?

ответ

2

Использование https://github.com/reworkcss/css для разбора CSS, а затем изменить селекторы, и, наконец, stringify:

const CSS = require('css'); 

function scopeCSS(css, scope) { 
    const ast = CSS.parse(css); 
    for (let rule of ast.stylesheet.rules) { 
    if (rule.type == 'rule') { 
     rule.selectors = rule.selectors.map(selector => `${scope} ${selector}`); 
    } 
    } 
    return CSS.stringify(ast); 
} 

scopeCSS('div { color: black; }', '#foo'); 
// #foo div { 
// color: black; 
// } 

http://requirebin.com/?gist=trevordixon/839d0674531dafa98fb95ae51474245e

+1

интересно так с этим вы можете изменить любое поведение селектора CSS может быть более точным, как именно? вы добиваетесь такого поведения – Geeky

+1

reworkcss/css - это синтаксический анализатор CSS, который использует CSS как строку и возвращает объект, описывающий таблицу стилей. Модифицируя этот объект и передавая его обратно в 'CSS.stringify', я могу надежно изменить все селекторы. –

Смежные вопросы