Ques核心思想——CSS Namespace

Facebook’s challenges are applicable to any very complex websites with many developers. Or any situation where CSS is bundled into multiple files and loaded asynchronously, and often loaded lazily. ——@vjeux 将Facebook换成Tencent同样适用。

同行们是怎么解决的?

  • Shadow DOM Style

Shadow DOM的样式是完全隔离的,这就意味着即使你在主文档中有一个针对全部 <h3> 标签的样式选择器,这个样式也不会不经你的允许便影响到 shadow DOM 的元素。

举个例子:

<body>
  <style>
    button {
      font-size: 18px;
      font-family: ‘华文行楷‘;
    }
  </style>
  <button>我是一个普通的按钮</button>
  <div></div>

  <script>
    var host = document.querySelector(‘div‘);
    var root = host.createShadowRoot();
    root.innerHTML = ‘<style>button { font-size: 24px; color: blue; } </style>‘ +
                     ‘<button>我是一个影子按钮</button>‘
  </script>
</body>

这就很好地为Web Component建立了CSS Namespace机制。

  • Facebook: CSS in JS

http://blog.vjeux.com/2014/javascript/react-css-in-js-nationjs.html

比较变态的想法,干脆直接不要用classname,直接用style,然后利用js来写每个元素的style……

例如,如果要写一个类似button:hover的样式,需要写成这样子:

var Button = React.createClass({
  styles: {
    container: {
      fontSize: ‘13px‘,
      backgroundColor: ‘rgb(233, 234, 237)‘,
      border: ‘1px solid #cdced0‘,
      borderRadius: 2,
      boxShadow: ‘0 1px 1px rgba(0, 0, 0, 0.05)‘,
      padding: ‘0 8px‘,
      margin: 2,
      lineHeight: ‘23px‘
    },
    depressed: {
      backgroundColor: ‘#4e69a2‘,
      borderColor: ‘#1A356E‘,
      color: ‘#FFF‘
    },
  },
  propTypes: {
    isDepressed: React.PropTypes.bool,
    style: React.PropTypes.object,
  },
  render: function() {
    return (
      <button style={m(
        this.styles.container,
        // 如果压下按钮,mixin压下的style
        this.props.isDepressed && this.styles.depressed,
        this.props.style
      )}>{this.props.children}</button>
    );
  }
});

几乎等同于脱离了css,直接利用javascript来实现样式依赖、继承、混入、变量等问题……当然如果我们去看看React-nativecss-layout,就可以发现,如果想通过React打通客户端开发,style几乎成了必选方案。

我们的方案

我们期望用类似Web Component的方式去写Component的样式,但在低端浏览器根本就不支持Shadow DOM,所以,我们基于BEM来搭建了一种CSS Namespace的方案。

我们的Component由下面3个文件组成:

  • main.html 结构
  • main.js 逻辑
  • main.css 样式

可参考:https://github.com/miniflycn/Ques/tree/master/src/components/qtree

可以发现我们的css是这么写的:

.$__title {
    margin: 0 auto;
    font-size: 14px;
    cursor: default;
    padding-left: 10px;
    -webkit-user-select: none;
}
/** 太长忽略 **/

这里面有长得很奇怪的.$__前缀,该前缀是我们的占位符,构建系统会自动将其替换成Component名,例如,该Component为qtree,所以生成结果是:

.qtree__title {
    margin: 0 auto;
    font-size: 14px;
    cursor: default;
    padding-left: 10px;
    -webkit-user-select: none;
}
/** 太长忽略 **/

同样道理,在main.htmlmain.js中的对应选择器,在构建中也会自动替换成Component名。

这有什么好处呢?

  1. 基于路径的Namespace,路径没有冲突,那么在该项目中Namespace也不会冲突
  2. Component可以任意改名,或复制重构,不会产生任何影响,便于Component的重构和扩展
  3. Component相对隔离,不会对外部产生影响
  4. Component非绝对隔离,外部可以对其产生一定影响
时间: 2024-10-25 00:21:59

Ques核心思想——CSS Namespace的相关文章

jQuery的核心思想

jQuery?----www.jQuery.com jQuery的理念:write less, do more jQuery的成就:世界排名前100的公司,46%都在使用jQuery,远远超过其他库,微软公司甚至把jQuery库 作为了他们的官方库. what is jQuery?(这是我复制官网上的介绍,觉得说的很专业) jQuery is a fast, small, and feature-rich(功能丰富) JavaScript library. It makes things lik

hadoop的核心思想【转】

[转自]:http://www.superwu.cn/2014/01/10/963/ 1.1.1. hadoop的核心思想 Hadoop包括两大核心,分布式存储系统和分布式计算系统. 1.1.1.1. 分布式存储 为什么数据需要存储在分布式的系统中哪,难道单一的计算机存储不了吗,难道现在的几个TB的硬盘装不下这些数据吗?事实上,确实装不下.比如,很多的电信通话记录就存储在很多台服务器的很多硬盘中.那么,要处理这么多数据,必须从一台一台服务器分别读取数据和写入数据,太麻烦了! 我们希望有一种文件系

《深入理解SPARK:核心思想与源码分析》——SparkContext的初始化(中)

<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析>一书第一章的内容请看链接<第1章 环境准备> <深入理解Spark:核心思想与源码分析>一书第二章的内容请看链接<第2章 SPARK设计理念与基本架构> 由于本书的第3章内容较多,所以打算分别开辟三篇随笔分别展现. <深入理解Spark:核心思想与源码分析>一

vue.js学习笔记(一):什么是mvvm框架,vue.js的核心思想

一:MVVM框架 MVVM框架的应用场景:  1.针对具有复杂交互逻辑的前端应用 2.提供基础的架构抽象 3.提供ajax数据持久化,保证前端用户体验 二:vue.js的核心思想 (一):数据驱动 (二):数据响应原理 (三):组件化 (四)组件设计原则 1:页面上每个独立的可视/可交互区域视为一个组件 2:每个组件对应一个工程目录,组件所需要的各种资源在这个目录下就近维护 3:页面只不过是组件的容器,组件可以嵌套自由组合形成完整的页面

Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍

本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: http://rookey.gotoip2.com/Page/Example.html?page=Example&flag=Video 下期视频将介绍如何通过Rookey.Frame v1.0极速开发平台项目结构及核心代码介绍

RAID2.0核心思想:数据保护与物理资源管理域分离

记得在2013年末的时候,开始将存储虚拟化为主导的数据保护技术归纳为RAID2.0.从市场的角度来看,这个一个非常好的概念,一方面可以延续传统RAID的思想,大家可以很容易明白这是一种数据保护技术:另一方面又表述了这是一种传统RAID的技术延伸,而且具有更新换代的意思.在技术发展的过程中,HP称这种技术为virtual RAID:NetApp称之为DDP(Dynamic Disk Pool).本质上的思想是相同的,都是通过底层虚拟化的方式使得RAID构建的灵活性大为增加,并且在数据恢复的时候能够

Hibernate核心思想—ORM机制(一)

转:http://blog.csdn.net/wanghuan203/article/details/7566518 hibernate是一个采用ORM(Object/Relation Mapping对象关系映射)机制持久层的开源框架 其主要核心思想是面向对象,而非面向过程,而这个面向对象则主要通过ORM实现. ORM是将表与表之间的操作,映射成对象和对象之间的操作,就是通过操作实体类来达到操作表的目的.从数据库提取的数据会自动按你设置的映射要求封装成特定的对象.之后你就可以通过对对象进行操作来

数据挖掘十大算法总结--核心思想,算法优缺点,应用领域

本文所涉算法均只概述核心思想,具体实现细节参看本博客"数据挖掘算法学习"分类下其他文章,不定期更新中.转载请注明出处,谢谢. 参考了许多资料加上个人理解,对十大算法进行如下分类: ?分类算法:C4.5,CART,Adaboost,NaiveBayes,KNN,SVM ?聚类算法:KMeans ?统计学习:EM ?关联分析:Apriori ?链接挖掘:PageRank 其中,EM算法虽可以用来聚类,但是由于EM算法进行迭代速度很慢,比kMeans性能差很多,并且KMeans算法 聚类效果

java核心思想

第一章 多线程 多线程和多进程之间的区别: 本质区别在于每个进程有他自己的变量的完备集,线程则共享相同的数据,这个听起来似乎有些危险,事实上也的确如此,你将会在本章后面的内容中看到这个问题,尽管如此,对于程序来说,共享的变量使线程之间的通信 比进程间的通信更加有效简单,而且,对于某些操作系统而言,线程比进程更加轻量级.创建和销毁单个线程比发起进程的开销要小很多. 线程优先级 在Java程序设计语言中,每一个线程都有一个优先级,默认情况下,一个线程继承他的父线程的优先级,一个线程的父线程就是启动他