CSS module和React 中的应用

html-css011

CSS module和React 中的应用,第1张

由于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

CSS按其位置可以分成三种:

内嵌样式(Inline Style)

内部样式表(Internal Style Sheet)

外部样式表(External Style Sheet)

内嵌样式(Inline Style)

Inline Style是写在Tag里面的。内嵌样式只对所在的Tag有效。

<P style="font-size:20ptcolor:red">这个Style定义<p></p>里面的文字是20pt字体,字体颜色是红色。</p>

内部样式表(Internal Style Sheet)

内部样式表是写在HTML的<head></head>里面的。内部样式表只对所在的网页有效。

<HTML>

<HEAD>

<STYLE type="text/css">

H1.mylayout {border-width:1border:solidtext-align:centercolor:red}

</STYLE>

</HEAD>

<BODY>

<H1 class="mylayout">这个标题使用了Style。</H1>

<H1>这个标题没有使用Style。</H1>

</BODY>

</HTML>

内部样式表(Internal Sytle Sheet)要用到Style这个Tag,写法如下:

<STYLE type="text/css">

......

</STYLE>

外部样式表(External Style Sheet)

如果很多网页需要用到同样的样式(Styles),用什么方法呢?

将样式(Styles)写在一个以.css为后缀的CSS文件里,然后在每个需要用到这些样式(Styles)的网页里引用这个CSS文件。

比如可以用文本编辑器(NotePad)建立一个叫home的文件,文件后缀不要用.txt,改成.css。文件内容如下:

H1.mylayout {border-width: 1border: solidtext-align: centercolor:red}

然后你建立一个网页,代码如下:

<HTML>

<HEAD>

<link href="../asdocs/css_tutorials/home.css" rel="stylesheet" type="text/css">

</HEAD>

<BODY>

<H1 class="mylayout">这个标题使用了Style。</H1>

<H1>这个标题没有使用Style。</H1>

</BODY>

</HTML>

使用外部(Extenal)样式表,相对于内嵌(Inline)和内部式(Internal)的,有以下优点:

样式代码可以复用。一个外部CSS文件,可以被很多网页共用。

便于修改。如果要修改样式,只需要修改CSS文件,而不需要修改每个网页。

提高网页显示的速度。如果样式写在网页里,会降低网页显示的速度,如果网页引用一个CSS文件,这个CSS文件多半已经在缓存区(其它网页早已经引用过它),网页显示的速度就比较快。

参考资料:http://www.blabla.cn/css_tutorials/001_CSS_Overview.html

要想为指定的HTML元素添加CSS样式,首先需要选中该元素。在CSS中,执行这一选择操作规则部分被称为选择器(选择符)。

CSS基本选择器可以分为五类:标签选择器、id选择器、类选择器、通配符选择器和伪类选择器。

多类名选择器

可以给单个标签添加多个类名,既可以提升类样式的复用性,也可以达到添加多种样式的效果。在后面复杂网页的布局中使用较多。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="html" cid="n2260" mdtype="fences" style="box-sizing: border-boxoverflow: visiblefont-family: var(--monospace)font-size: 0.9emdisplay: blockbreak-inside: avoidtext-align: leftwhite-space: normalbackground-image: inheritbackground-position: inheritbackground-size: inheritbackground-repeat: inheritbackground-attachment: inheritbackground-origin: inheritbackground-clip: inheritbackground-color: rgb(248, 248, 248)position: relative !importantborder: 1px solid rgb(231, 234, 237)border-radius: 3pxpadding: 8px 4px 6pxmargin-bottom: 15pxmargin-top: 15pxwidth: inherit"><div class="pink fontWeight font20">苹果</div>

<div class="font20">香蕉</div>

<div class="font14 pink">橘子</div>

<div class="font14"></div></pre>

通配器选择器用“*”号表示,它是所有选择器中作用范围最广的,能匹配页面中所有的元素。

常用的结构伪类选择器:

:target 选择器

可用于选取当前活动的目标元素,然后给它添加相应的样式。

<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded md-focus" lang="css" cid="n2337" mdtype="fences" style="box-sizing: border-boxoverflow: visiblefont-family: var(--monospace)font-size: 0.9emdisplay: blockbreak-inside: avoidtext-align: leftwhite-space: normalbackground-image: inheritbackground-position: inheritbackground-size: inheritbackground-repeat: inheritbackground-attachment: inheritbackground-origin: inheritbackground-clip: inheritbackground-color: rgb(248, 248, 248)position: relative !importantborder: 1px solid rgb(231, 234, 237)border-radius: 3pxpadding: 8px 4px 6pxmargin-bottom: 15pxmargin-top: 15pxwidth: inherit"><h2><a href="#brand">Brand</a></h2>

<div id="brand">

content for Brand

</div>

background: orange

color: #fff

}</pre>

复合选择器是由两个或多个基本选择器,通过不同的方式组合而成的,目的是为了更准确、更精细的选择目标元素标签。

复合选择器的三种类型:交集选择器、并集选择器、后代选择器、子选择器以及相邻元素选择器。