原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/Scoped-CSS
写在前面问:什么是Scoped CSS规范?
Scoped CSS规范是Web组件产生不污染其他组件,也不被其他组件污染的CSS规范。
面对组件化的普及,组件的复用很普遍的需求,然而CSS相互污染是经常遇见的问题,建立规范让开发者放心使用各种组件,甚至跨生态的组件是很有必要的一件事情。
目前业界的一些方案方案一:
如果用webpack的话,可以参考css-loader的这个功能:
一段hash + 组件名,这个可能兼顾了辨识度 + 命名污染的问题。
方案二:
用webpack和scss,less写成模块化css就可以一定程度避免CSS污染,不能完全避免
方案三:样式规范上,使用与组件同名的嵌套命名空间
如果只用自己的生态可以这么搞,但是有的时候会引入第三方生态,第三方和自己的命名空间一样还是很有可能,比如scroller插件,社区里也有很多scroller插件loading uplader插件等等。
现有方案的局限性这里还是会有污染的情况,因为:
所以得出:
用意念或者规范约定不然注入程序自动化避免冲突
好处:
如果把这个过程放在构建过程就是工程问题。但是组件单独抽离出来给第三方用,其实就是组件本身的问题。总之要保证:
(css) ()id; css )(); css (g0)) (g1.match(/:scope/)) { g1 (h0) h1); } g1 prefix g1 (cssid() .)()idisIE = (function () { var undef, v div = document.createElement('div'), all ( (all[0] )v : undef(cssText, id) { var d = document, someThingStyles .)id)...)();
Scoped CSS实施);
scoper返回的id,在组件的JS里面赋给包裹的DOM便可以。这里详细说下生成id的过程:
id .)()id
通过Math.random得到随机数并经过处理,然后通过document.getElementById去查询页面上有没有同名ID,有的话则继续重新生成,没有的话就使用当前id。这里需要特别注意的是,比如一些弹出层插件,display hide的时候有的组件是直接从body里面移除,所以这就带来了CSS碰撞的可能性,所以这里Scoped CSS 规范强行约定:后插入的HTML,一定要经过scoper过程重新生成唯一id。
最后,Scoped CSS规范已经在AlloyTouch插件里开始实施,并打算推广开来。
你有什么好的想法可以让跨生态跨项目跨技术栈的组件复用更加惬意,可以交流交流。