聊聊CSS Modules

CSS在工程化上的一些问题 关于React的CSS in JS,有一个著名的talk,由Facebook的工程师vjeux带来。 里面最有名的一张slide是这样的: 里面列举了CSS的一些问题。其中,Dead Code Elimination,Minification,和Sharing Constants这些问题我们已经通过在我们的工作流中加入SASS和PostCSS这样的CSS预处理器解决了。 然而还有一些问题没有解决,比如全局命名空间。同一个document下的所有CSS的类名,都是在同一个“作用域”下的,因此我们常常要考虑如何避免命名冲突问题。现有的解决办法主要是靠BEM这样的命名惯例,或者是用多层CSS父子选择器来模拟命名空间。然而这样的办法对工程师有许多的限制。多级选择器有比较高的优先级,不容易维护。 解决全局作用域:Webpack css-loader Webpack的css-loader首先做出了解决全局作用域的尝试。解决办法就是在写CSS类名时加入:local(...)这样的标记。 比如: :local(.className) { background: red; } :local .className { color: green; } :local(.className .subClass) { color: green; } :local .className .subClass :global(.global-class-name) { color: blue; } 会被转化为: ._23_aKvs-b8bW2Vg3fwHozO { background: red; } ._23_aKvs-b8bW2Vg3fwHozO { color: green; } ._23_aKvs-b8bW2Vg3fwHozO ._13LGdX8RMStbBE9w-t0gZ1 { color: green; } ._23_aKvs-b8bW2Vg3fwHozO ._13LGdX8RMStbBE9w-t0gZ1 .global-class-name { color: blue; } 这里的办法就是把CSS类名转化为hash字符串,这样就可以保证每个类名都是独一无二的,自然也就不用在意命名冲突的问题了。只要在类名在当前模块内不会相互冲突就可以了。 CSS Modules 上述的办法,还是有一些不便。大多数情况下,比如在JavaScript中,变量都默认是局部变量。你想要声明一个全局变量,只能去全局作用域声明,或者把变量挂到local上(非严格模式下,不写var声明的是全局变量这种坑就不说了)。 Webpack的开发者之后将css-loader中的local变成了默认设定,于是CSS Modules这个规范就呼之欲出了。 CSS Modules规范。我们可以通过css-loader?...

November 12, 2016

Thoughts on Reset.css

###导语 CSS reset的作用主要就是清楚浏览器的默认样式,比如我们在Chrome里看到的User Agent Stylesheet就是Chrome浏览器的默认样式。不同的浏览器会有不同的默认样式,因此我们需要清除一些默认样式,以达到在所有浏览器里显示效果的一致。 不过这里面的学问还是很大的。首先我们只需要reset我们在项目中会使用的元素,这就涉及reset的模块化使用。第二我们只需要reset必要的属性。因为reset会加重浏览器渲染的性能开销,因此我们在css reset时必须要慎之又慎,保证最少的代码量和最佳的效果之间的平衡。 ...

November 5, 2015

最佳实践之多个高度不定水平实体垂直居中

如何快速并且健壮地实现高度不一定的实体的居中呢? vertical-align显然是一种办法。这个元素从语义上来看就是用来实现垂直对齐的。要理解vertical-align,首先我们得了解几个概念,inline boxes, line box, 以及baseline。 inline boxes是行内元素构成的行内box,而line box则是由一行内所有的inline boxes构成的box,比如: <div> <span>我是inline box</span> 我是匿名inline box </div> 除了display为inline或者inline-block的标签会形成inline box,行内文本也会形成匿名的inline box。 一行所有的inline boxes构成匿名的line box,其中inline box中高度最高的那个的高度便是line box的高度,由此撑起了整行的高度。(这涉及到line-height方面的知识) 而关于baseline,则是文字在排版时顶部与底部中间的基线,如果是行内文本,具体位置随字体不同而不同,一般都在中线以下的位置。具体的需要参考西文字体学(Typography)(Jobs在大学旁听的课程之一,你值得拥有) 而line—height其实就是两条基线之间的距离。 ...

July 23, 2015

css像素与理想viewport宽度

最近在开发移动端网页时遇到了两大问题,一是移动端的触摸事件的实现;二是移动端页面的宽度设置问题。今天先来说一说移动端的页面宽度问题。 首先要说的是css的像素,一个css像素,一个px,和设备的物理像素不是一回事。 拿苹果的iphone来说,iphone3的分辨率是320*480,而retina屏的iphone4是640*960, 但如果在浏览器里输出视窗的宽度,两者都是320px宽。这说明Retina屏的iPhone用4个物理像素来渲染了一个css像素。iPad上的情况是相似的,新老ipad的css分辨率都是1024*768。安卓上的情况也是类似的,比如nexus 5的物理分辨率是1920*1080,而css分辨率是640*360。 关于这个可以参考一下quirksmode上的博文《此像素非彼像素》 ...

May 12, 2015