手动css模块带有属性以区分组件
Manual css-modules with attributes to distinguish components
场景
我正在尝试使用自定义属性component
来区分组件。示例:
<div component="A">
<span>Hello</span>
</div>
造型很简单:
[component=A] span {
color: red;
}
问题
这是棘手的部分。为了确保组件不会产生副作用,它不应该对子组件中的任何东西进行样式化:
<div component="A">
<span>This should be styled by component=A styles</span>
<div component="B">
<span>This should NOT be styled by component=A styles</span>
</div>
</div>
完整示例
这是一个的简单示例。它定义了外部零部件的结构和样式。
HTML
<div component="A">
<span>Component A (red)</span>
<div>
<span>Component A (red)</span>
</div>
<div component="B">
<span>Subcomponent B (black)</span>
<div>
<span>Subcomponent B (black)</span>
</div>
<div component="A">
<span>Subcomponent A (red)</span>
</div>
</div>
<span>Component A (red)</span>
</div>
CSS
[component=A] :not([component]) span {
color: red;
}
第一种方法
这里有一个第一个天真的方法。
它有几个逻辑问题,但我想你已经明白我想做什么了
我的感觉是,这在纯css中是不可能的。但在编写自定义Javascript之前,我想问你我是否遗漏了什么或想得太多了。
如果您的组件有一个可靠的预期结构,为什么不使用>
直接子选择器?
[component="A"] > span {
color: red;
}
<div component="A">
<span>This should be styled by component=A styles</span>
<div component="B">
<span>This should NOT be styled by component=A styles</span>
</div>
</div>
编辑:
如果您想在没有指定组件集的情况下嵌套继承父样式的组件,那么这样的方法可能会起作用——基于您的初始方法。为此,您需要指定组件B和A的样式。
https://codepen.io/anon/pen/wGyeMg
body {
font-size: 20px;
}
[component=A] > span,
[component=A] div:not([component]) > span {
color: red;
}
[component=B] > span,
[component=B] div:not([component]) > span {
color: black;
}
<div component="A">
<span>Component A (red)</span>
<div>
<span>Component A (red)</span>
</div>
<div component="B">
<span>Subcomponent B (black)</span>
<div>
<span>Subcomponent B (black)</span>
</div>
<div component="A">
<span>Subcomponent A (red)</span>
</div>
</div>
<span>Component A (red)</span>
</div>
您可以遵循BEM约定:
.a {
/* component A */
}
.a__red {
/* element red child of component A */
color: red;
}
.b {
/* component B */
}
.b__black {
/* element black child of component B */
color: black;
}
<div class="a">
<span class="a__red">Component A (red)</span>
<div>
<span class="a__red">Component A (red)</span>
</div>
<div class="b">
<span class="b__black">Subcomponent B (black)</span>
<div>
<span class="b__black">Subcomponent B (black)</span>
</div>
<div class="a">
<span class="a__red">Subcomponent A (red)</span>
</div>
</div>
<span class="a__red">Component A (red)</span>
</div>
看看这些,
我不像你那样经验丰富,但也许这会对你有所帮助。
小提琴:https://jsfiddle.net/eua98tqa/2/
HTML:
<div component="A">
<span>This should be styled by component=A styles</span>
<div component="B">
<span>This should NOT be styled by component=A styles</span>
</div>
</div>
CSS:
[component=A] span{
color: red;
}
[component=B] span{
color: BLUE;
}
相关文章:
- 如何更改reactjs中外部/独立组件的状态或属性
- 当组件准备就绪时,如何在Polymer中动态注册新属性
- 自定义HTML元素属性未显示-Web组件
- Ember服务在注入组件并在计算属性中使用后是未定义的
- Ember.js:未在组件'中渲染的模型的计算属性;关于变更的参考
- 通过emberJS中的控制器修改组件的属性
- HTML代码表单Angular2组件属性
- Tapestry:访问相应javascript文件中的页面/组件属性
- 使用 React 将数组导出为组件属性
- Vue.js组件属性的动态值
- 将全局var传递给vue组件属性
- 在JSF组件属性中转义EL中的JavaScript引号
- 从子组件访问父组件/属性
- Handlebars.js:将对象属性作为Ember.js组件属性传递
- 从外部更新组件属性
- 当Vuex存储状态发生变化时,如何更新Vue组件属性
- Reactjs:是否可以从另一个Parent's子组件中使用Parent组件属性?
- 如何在模板中访问Angular 1.5的组件属性
- 复制反应组件属性时,扩展语法出错
- Angular 2使用组件属性动态地设置routerLink