摘要:目前業(yè)界的一些方案方案一如果用的話,可以參考的這個(gè)功能一段組件名,這個(gè)可能兼顧了辨識(shí)度命名污染的問(wèn)題。最后,規(guī)范已經(jīng)在插件里開(kāi)始實(shí)施,并打算推廣開(kāi)來(lái)。
原文鏈接:https://github.com/AlloyTeam/AlloyTouch/wiki/Scoped-CSS
寫(xiě)在前面問(wèn):什么是Scoped CSS規(guī)范?
Scoped CSS規(guī)范是Web組件產(chǎn)生不污染其他組件,也不被其他組件污染的CSS規(guī)范。
面對(duì)組件化的普及,組件的復(fù)用很普遍的需求,然而CSS相互污染是經(jīng)常遇見(jiàn)的問(wèn)題,建立規(guī)范讓開(kāi)發(fā)者放心使用各種組件,甚至跨生態(tài)的組件是很有必要的一件事情。
目前業(yè)界的一些方案方案一:
如果用webpack的話,可以參考css-loader的這個(gè)功能:
一段hash + 組件名,這個(gè)可能兼顧了辨識(shí)度 + 命名污染的問(wèn)題。
方案二:
用webpack和scss,less寫(xiě)成模塊化css就可以一定程度避免CSS污染,不能完全避免
方案三:樣式規(guī)范上,使用與組件同名的嵌套命名空間
如果只用自己的生態(tài)可以這么搞,但是有的時(shí)候會(huì)引入第三方生態(tài),第三方和自己的命名空間一樣還是很有可能,比如scroller插件,社區(qū)里也有很多scroller插件loading uplader插件等等。
現(xiàn)有方案的局限性這里還是會(huì)有污染的情況,因?yàn)椋?/p>
模塊化的粒度是大于等于組件化粒度,意思就是一個(gè)模塊可能有多個(gè)組件
非less和sass項(xiàng)目下的組件怎么保證
難以保證不污染第三方組件
難以保證不被第三方組件污染
同名組件的問(wèn)題
組件在第三方項(xiàng)目使用的問(wèn)題
組件自身生態(tài)閉環(huán)的問(wèn)題
所以得出:
用意念或者規(guī)范約定不然注入程序自動(dòng)化避免沖突
好處:
能保證不污染別的組件并且不被被的組件污染可以更放心的復(fù)用
Scoped CSS規(guī)范是運(yùn)行時(shí)產(chǎn)生唯一id~~ 永遠(yuǎn)不會(huì)css碰撞
返回的這個(gè)id那個(gè)指定給組件的頂層div就行,實(shí)施簡(jiǎn)單
如果把這個(gè)過(guò)程放在構(gòu)建過(guò)程就是工程問(wèn)題。但是組件多帶帶抽離出來(lái)給第三方用,其實(shí)就是組件本身的問(wèn)題。總之要保證:
不污染第三方的項(xiàng)目或組件
不被第三組件或項(xiàng)目污染(由于是層疊樣式,這個(gè)無(wú)法完全保證)
Scoped CSS代碼;(function () { function scoper(css) { var id = generateID(); var prefix = "#" + id; css = css.replace(//*[sS]*?*//g, ""); var re = new RegExp("([^ ,{}]+)(,(?=[^}]*{)|s*{)", "g"); css = css.replace(re, function(g0, g1, g2) { if (g1.match(/^s*(@media|@keyframes|to|from|@font-face)/)) { return g1 + g2; } if (g1.match(/:scope/)) { g1 = g1.replace(/([^s]*):scope/, function(h0, h1) { if (h1 === "") { return "> *"; } else { return "> " + h1; } }); } g1 = g1.replace(/^(s*)/, "$1" + prefix + " "); return g1 + g2; }); addStyle(css,id+"-style"); return id; } function generateID() { var id = ("scoped"+ Math.random()).replace("0.",""); if(document.getElementById(id)){ return generateID(); }else { return id; } } var isIE = (function () { var undef, v = 3, div = document.createElement("div"), all = div.getElementsByTagName("i"); while ( div.innerHTML = "", all[0] ); return v > 4 ? v : undef; }()); function addStyle(cssText, id) { var d = document, someThingStyles = d.createElement("style"); d.getElementsByTagName("head")[0].appendChild(someThingStyles); someThingStyles.setAttribute("type", "text/css"); someThingStyles.setAttribute("id", id); if (isIE) { someThingStyles.styleSheet.cssText = cssText; } else { someThingStyles.textContent = cssText; } } window.scoper = scoper; })();Scoped CSS實(shí)施
var id = scoper("h1 { color:red; /*color: #0079ff;*/ } /* h2 { color:green }*/");
scoper返回的id,在組件的JS里面賦給包裹的DOM便可以。這里詳細(xì)說(shuō)下生成id的過(guò)程:
function generateID() { var id = ("scoped"+ Math.random()).replace("0.",""); if(document.getElementById(id)){ return generateID(); }else { return id; } }
通過(guò)Math.random得到隨機(jī)數(shù)并經(jīng)過(guò)處理,然后通過(guò)document.getElementById去查詢頁(yè)面上有沒(méi)有同名ID,有的話則繼續(xù)重新生成,沒(méi)有的話就使用當(dāng)前id。這里需要特別注意的是,比如一些彈出層插件,display hide的時(shí)候有的組件是直接從body里面移除,所以這就帶來(lái)了CSS碰撞的可能性,所以這里Scoped CSS 規(guī)范強(qiáng)行約定:后插入的HTML,一定要經(jīng)過(guò)scoper過(guò)程重新生成唯一id。
最后,Scoped CSS規(guī)范已經(jīng)在AlloyTouch插件里開(kāi)始實(shí)施,并打算推廣開(kāi)來(lái)。
你有什么好的想法可以讓跨生態(tài)跨項(xiàng)目跨技術(shù)棧的組件復(fù)用更加愜意,可以交流交流。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/115447.html
摘要:它制定了整個(gè)平臺(tái)的規(guī)則,監(jiān)督整個(gè)進(jìn)程。特邀專家指的是被邀請(qǐng)參與標(biāo)準(zhǔn)制定的開(kāi)發(fā)者,都是一些技術(shù)大牛。備注數(shù)據(jù)來(lái)源于揭秘三制定過(guò)程制定過(guò)程是公開(kāi)透明的,內(nèi)部交流都是公開(kāi)的。 W3C的標(biāo)準(zhǔn)規(guī)范是怎么制定出來(lái)的?瀏覽器廠商是收到來(lái)自w3c的規(guī)范標(biāo)準(zhǔn)才結(jié)合自己的瀏覽器進(jìn)行開(kāi)發(fā)更新以支持新特性嗎?一直很好奇,搜集了一些資料,主要參考了W3C CSS工作組特邀專家Lea Verou寫(xiě)的《CSS揭秘》...
摘要:默認(rèn)選項(xiàng)偽類偽類會(huì)匹配那些在一組相關(guān)的集合中作為默認(rèn)選項(xiàng)的元素。瀏覽器對(duì)和支持范圍偽類和這兩個(gè)偽類對(duì)于那些要求數(shù)據(jù)介于一個(gè)指定范圍的表單元素是非常有用的。因而應(yīng)該像這樣子的注意默認(rèn)值是,不在數(shù)據(jù)允許的范圍之內(nèi)。 2014年1月,我寫(xiě)了一篇文章:The Current Generation of CSS3 Selectors,這篇文章的目的是介紹一些CSS3中新增的選擇器。文中的選擇器已...
摘要:我們知道,是規(guī)范,而語(yǔ)言是參照規(guī)范的實(shí)現(xiàn)。起因是年底,公司將提交給組織對(duì)語(yǔ)言進(jìn)行標(biāo)準(zhǔn)化。年,發(fā)布年,發(fā)布,成為的通行標(biāo)準(zhǔn),得到了各瀏覽器廠商的廣泛支持。年,發(fā)布,其間,因?yàn)楦陌孢^(guò)于激進(jìn),中途夭折。不適用與生產(chǎn)環(huán)境。 前言 ES2015/ES2016/ES2017等新語(yǔ)法,新API的出現(xiàn)讓前端寫(xiě)起來(lái)更爽,更不用說(shuō)考慮到面向未來(lái)編碼??晌覀兪褂眠@些新語(yǔ)法,新API,代碼的運(yùn)行兼容性勢(shì)必受到...
摘要:下面的代碼違反規(guī)則下面的代碼符合規(guī)則禁止使用十六進(jìn)制顏色十六進(jìn)制的顏色違反規(guī)則無(wú)效的十六進(jìn)制色同樣違規(guī)下面的是符合規(guī)則的自動(dòng)將十六進(jìn)制色轉(zhuǎn)換為大寫(xiě)或者小寫(xiě)可以使用實(shí)現(xiàn)同樣的功能。 showImg(https://segmentfault.com/img/remote/1460000014782565); 在PostCSS官網(wǎng)有著這樣的對(duì)PostCSS特性介紹,箭頭后面是對(duì)應(yīng)功能的插件及...
摘要:前言項(xiàng)目中我們經(jīng)常遇到這種需求,需要對(duì)單行多行文本超出顯示為省略號(hào)。單行文本省略文本溢出顯示省略號(hào)文本不會(huì)換行語(yǔ)法默認(rèn)值適用于所有元素當(dāng)對(duì)象內(nèi)文本溢出時(shí)不顯示省略標(biāo)記,而是將溢出的部分裁切掉。 前言:項(xiàng)目中我們經(jīng)常遇到這種需求,需要對(duì)單行、多行文本超出顯示為省略號(hào)。這篇文章主要總結(jié)了小編解決此問(wèn)題的方法,有不足之處歡迎大家指正。 單行文本省略 showImg(https://segme...
閱讀 954·2021-10-25 09:44
閱讀 1345·2021-09-23 11:56
閱讀 1284·2021-09-10 10:50
閱讀 3185·2019-08-30 15:53
閱讀 2193·2019-08-30 13:17
閱讀 684·2019-08-29 18:43
閱讀 2579·2019-08-29 12:57
閱讀 938·2019-08-26 12:20