<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      Scoped CSS規范草案

      2016-12-26 16:09  【當耐特】  閱讀(1756)  評論(0)    收藏  舉報

      原文鏈接: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插件等等。

      現有方案的局限性

      這里還是會有污染的情況,因為:

      • 模塊化的粒度是大于等于組件化粒度,意思就是一個模塊可能有多個組件
      • 非less和sass項目下的組件怎么保證
      • 難以保證不污染第三方組件
      • 難以保證不被第三方組件污染
      • 同名組件的問題
      • 組件在第三方項目使用的問題
      • 組件自身生態閉環的問題

      所以得出:

      用意念或者規范約定不然注入程序自動化避免沖突

      好處:

      • 能保證不污染別的組件并且不被被的組件污染可以更放心的復用
      • Scoped CSS規范是運行時產生唯一id~~ 永遠不會css碰撞
      • 返回的這個id那個指定給組件的頂層div就行,實施簡單

      如果把這個過程放在構建過程就是工程問題。但是組件單獨抽離出來給第三方用,其實就是組件本身的問題。總之要保證:

      • 不污染第三方的項目或組件
      • 不被第三組件或項目污染(由于是層疊樣式,這個無法完全保證)

      Scoped CSS代碼

      ;(function () {
      
          function scoper(css) {
              var id = generateID();
              var prefix = "#" + id;
              css = css.replace(/\/\*[\s\S]*?\*\//g, '');
              var re = new RegExp("([^\r\n,{}]+)(,(?=[^}]*{)|\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 = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
                      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實施

      var id = scoper("h1 {\
                     color:red;\
                  /*color: #0079ff;*/\
                      }\
              \
                      /*  h2 {\
                      color:green\
                      }*/");
      

      scoper返回的id,在組件的JS里面賦給包裹的DOM便可以。這里詳細說下生成id的過程:

      function generateID() {
          var id =  ("scoped"+ Math.random()).replace("0.","");
          if(document.getElementById(id)){
              return generateID();
          }else {
              return id;
          }
      }
      

      通過Math.random得到隨機數并經過處理,然后通過document.getElementById去查詢頁面上有沒有同名ID,有的話則繼續重新生成,沒有的話就使用當前id。這里需要特別注意的是,比如一些彈出層插件,display hide的時候有的組件是直接從body里面移除,所以這就帶來了CSS碰撞的可能性,所以這里Scoped CSS 規范強行約定:后插入的HTML,一定要經過scoper過程重新生成唯一id。
      最后,Scoped CSS規范已經在AlloyTouch插件里開始實施,并打算推廣開來。

      你有什么好的想法可以讓跨生態跨項目跨技術棧的組件復用更加愜意,可以交流交流。

      主站蜘蛛池模板: 一区二区中文字幕av| 国内少妇人妻偷人精品视频| 福利一区二区在线播放| 激情综合色五月六月婷婷| 欧洲精品码一区二区三区| 少妇高潮喷水正在播放| 女人被狂躁c到高潮| 日本亚洲色大成网站www久久 | 国产精品中文av专线| 国产成人精品成人a在线观看| yy111111在线尤物| 全免费A级毛片免费看无码| 茄子视频国产在线观看| 麻豆精品一区二区三区蜜臀| 岛国中文字幕一区二区| 亚洲精品一区二区动漫| 国产乱码精品一区二区上| 国产精品久久久久aaaa| 中文字幕有码无码AV| 一边吃奶一边做动态图| 人妻中文字幕精品一页| 亚洲精品欧美综合二区| 国产在线观看码高清视频| 丰满熟妇乱又伦在线无码视频| 国产在线不卡精品网站| 国产熟女av一区二区三区| 国产精品久久中文字幕| 国产乱子伦视频在线播放| 国产综合亚洲区在线观看| 性动态图无遮挡试看30秒 | 婷婷丁香五月亚洲中文字幕| 2019香蕉在线观看直播视频| 亚洲天堂伊人久久a成人| 蜜臀av人妻国产精品建身房| 亚洲乱码一区二区三区视色| 午夜男女爽爽影院免费视频下载| 亚洲欧美日韩成人综合一区| 欧美成人www免费全部网站| 亚洲中文字幕无码爆乳APP| 囯产精品久久久久久久久久妞妞 | 日本高清中文字幕免费一区二区|