less样式如何使用cssmodule

html-css030

less样式如何使用cssmodule,第1张

1.Less

变量:@变量名

混合:在a类中使用b类的所有属性, .a{ .b()color:#fff}

嵌套:使用嵌套代替原始css的层叠,&表示当前选择器的父级

运算:+ - * /,可以对任何数字、颜色或变量进行运算

转义:

函数:Less 内置了多种函数用于转换颜色、处理字符串、算术运算等

命名空间和访问符

作用域:首先在本地查找变量和混合(mixins),如果找不到,则从“父”级作用域继承

注释: // 行注释,/.../块注释

导入:@import "library"可以导入一个 .less 文件,此文件中的所有变量就可以全部使用了, .less 扩展名,可以省略掉

2.css modules

CSS的规则都是全局的,任何一个组件的样式规则,都对整个页面有效。产生局部作用域的唯一方法,就是使用一个独一无二的class的名字,不会与其他选择器重名。 CSS Modules是通过哈希算法将类名编译,保证类名的唯一性。

声明全局规则:

灵活按需导入以便复用代码,避免样式全局污染,但不利于写组件单元测试

3.CSS bem规范

BEM - Block Element Modfier(块,元素,编辑器)

在选择器中用三种符号来表示扩展关系

-中划线 :仅作为连字符使用,表示某个块或者某个子元素的多单词之间的连接记号。

__ 双下划线:双下划线用来连接块和块的子元素

-- 双中划线:用来描述一个块或者块的子元素的一种状态

type-block__element--modifier

Block:不是指html中的块元素,任何独立的页面元素都可以视为一个块,这个独立的块容器有一个唯一的css类名,也就是这个块的名字

Element:属于块的某部分,任何的在Block中的DOM节点,都是一个element。在一个已知的block中,所有的element在语义上都是相等的,Block下的所有Element不考虑层级嵌套关系,扁平化处理都属于Block,即连续的__下划线只能出现一次

Modifier:用于修饰块或元素,体现在外观或行为上的改变,都可作为一个修饰器,如active状态,add/edit的操作

注意事项:

1)保证各个部分只有一级B__E--M,修饰器需要和对应的块或元素一起使用,避免单独使用。不能有 .block__el1__el2 的格式

2)仅以类名作为选择器,不使用ID或标签名来约束选择器

...import'./index.less'...<divclassName="article"><divclassName="article__body"><pclassName="article__title">title</p><buttonclassName="article__button--primary"></button><buttonclassName="article__button--success"></button></div></div>//index.less文件.article{max-width:1200px&__body{padding:20px}&__title{font-weight:700}&__button{padding:5px8px&--primary{background:blue}&--success{background:green}}}

由于CSS的规则是全局性的,添加任何一个样式,在全局都有效,优点是方便复用,缺点是会根据 权重的计算 造成样式冲突,非常难以管理。

有了钉子,自然就会有锤子。随着前端的发展出现了各种CSS模块解决方案,主要分两种:

一类是采用JS或者JSON 的方式写CSS,比如 jsxstyle , react-style ,虽然可以采用JS成熟方案来管理css, 但是它无法使用postcss ,sass等css预处理器,并且衍生了大批的api, 使用的代价较大。

另一类还是采用css 来写样式, 不过是通过工具生成CSS作用域的方式实现模块化,比如CSS module。常用的BEM命名技巧或者团队中约定的方案来实现命名空间从而实现模块化,不过约定总会出现问题,于是就出现了通过工具,比如webpack的css-loader根据算法,实现css 模块化。

webpack 内置的 css-loader 自带了CSS modoule, 配置如下:

create-react-app 2.0以上的版本中内置启动了CSS module, 如果需要特殊配置,则需要eject操作, 在webpack.config.js 中:

CSS module 默认采用局部样式,即给每个css 名添加上了“:local”, 对应的全局性的写法:

compose 组合样式:

对于样式复用,CSS module提供了唯一的方式 "compose":

多CSS class 的写法:

Sass 变量与JS共享

Css module 作者建议:

1.不使用选择器,只使用 class 名来定义样式

2.不层叠多个 class,只使用一个 class 把所有样式定义好

3.不嵌套

4.使用 composes 组合来实现复用

采用 classnames 来增强CSS module 在react 中的使用,类似Angular 中的样式指令:

参考链接: https://zhuanlan.zhihu.com/p/20495964