理解CSS模块化

html-css021

理解CSS模块化,第1张

在瞬息万变的前端开发世界中,很难找到一个真正有意义的概念,并且将其清晰明了的向广大人民群众普及。

把目光投向CSS,一个重大转折就是CSS预处理器的出现(在工具方面来看),其中, Sass 应该是最为著名的一个。此外,还有 PostCSS ,它和Sass略有不同,但是殊途同归——都是用浏览器不能解析的语法编写,并且最终编译成浏览器能够理解的语法。

现在,又有一位新的成员出现了,它就是 CSS模块 。本文就将介绍CSS模块化的诸多优点,以及如何编写模块化的CSS。

首先,让我们从官方文档入手:

事实稍微有一些复杂。由于类名需要 默认具有局部作用域 ,这就涉及到一些初始设置、一个编译过程,以及其他一些难以琢磨的东西。

但是最终,我们会为CSS模块化带来的好处而开心:CCS模块将作用域限制于组件中,从而避免了全局作用域的问题。我们再也不用操心为组件寻找一个好的命名了,因为编译过程已经帮你完成了这个任务。

CSS模块需要在构建步骤进行管道化,这也就是说,它不是自动驱动的。它可以看成是 webpack 或 Browserify 的一个插件。其基本工作方式是:当你在一个JavaScript模块中导入一个CSS文件时(例如,在一个 React 组件中),CSS模块将会定义一个对象,将文件中类的名字动态的映射为JavaScript作用域中可以使用的字符串。举个具体的例子:

如下是一个简单的CSS文件。其中, .base 类名不需要是工程中唯一的,因为它将不会是真正被解析的类名。它可以看成是在JavaScript模块中使用的类在样式表中的别名。

下面是该CSS类在JavaScript组件中的使用方式:

最终,它将生成下面这个东西(当使用webpack的默认步骤时):

当然,生成的类名可以通过配置,使得它的长度更短或者遵循一些特定的模式。当然了,这些最终都不重要(虽然短的类名意味着更短的样式表),重点在于这些类名是动态生成的、唯一的且和正确的样式表一一对应的。

这就是CSS模块工作的方式了。这时,你可能会想,“这到底是个什么玩意儿,我甚至。。。”。OK,停下!我知道你想说什么。现在就让我一一解答你可能有的疑虑。

这看起来太丑了

确实如此。但是类名并不要求一定要长的好看对不对?只要可以将样式正确的应用于元素就可以了嘛。而CSS模块化方法完成的非常好,所以我觉得,这不是一个问题。

这非常难debug啊

由于需要有一个编译的步骤,所以直接debug是非常困难的。其实,像Sass直接debug也是相当不容易的,所以我们才有了 sourcemaps 。对于CSS模块,我们也可以设置sourcemap。

其实,我还想说的是,虽然在模块中,类的名字是自动生成而不可预知的,但是对于模块来说,它还是比样式表更容易debug的。只要你知道当前在开发者工具中查看的样式属于哪个模块,在相应的样式表中也是很容易定位。

这使得样式不容易复用啦!

这句话既对也不对。一方面来说,确实如此。但这是因为模块将CSS样式和组件相绑定,从而不会发生全局样式的冲突。这其实是一件好事,我相信你也会同意的对不对。

另一方面,要定义全局样式也是可以的,只要使用 :global() 就好了。比如,作者需要保留的全局辅助样式。

CSS模块还可以从其他模块中继承样式,这和Sass中的 @extend 方法其实是一样的。它不会拷贝样式,只是将选择器连接到继承的样式中。

它需要webpack,Browserify或者其他工具!

这和Sass需要将 .scss 文件编译成CSS文件,PostCSS需要将样式表处理成浏览器能够识别的样式其实是一样的。无论如何,都需要一个构建步骤。

我们究竟为什么要讨论这个东西?

其实,我甚至不确定CSS模块在未来到底会不会继续存在,不过,我确定这是一种编写样式的正确方式。试想,在拆分成许多细小组件的庞大站点中,却拥有一个臃肿的全局样式表,这肯定是不合适的。

CSS统一的名空间使得它既强大又脆弱。而CSS模块化或者未来延续这个思想的其他工具可以在支持样式复用的同时,避免命名冲突,这是一个双赢的选择。

如前面所说的,你需要有webpack或者Browserify来实现CSS模块化。

先从webpack版本的模块化开始。在 webpack.config.js 中,加上如下配置,使得webpack将CSS文件作为CSS模块来看待:

这时,它将把样式注入到页面中的``元素中。这可能不是我们想要的,使用 extract text plugin for webpack ,我们可以很方便的抽取出样式表:

对于webpack,要讲的就是这么多了。

我只在命令行中用过Browserify,所以我猜使用起来会更复杂一些。在 package.json 文件中,加入 npm script :

这条命令告诉Browserify运行 src/index.js ,返回 dist/index.js ,并且使用 css-modulesify 将样式表编译至 dist/main.css 。如果你想再加上 Autoprefixer ,那么命令可以写成这样:

如你所见,使用 --after 选项可以在编译完成样式表时候,继续对它进行处理。

从今天看来, CSS模块化 系统和生态确实有些原始了,从Browserify中的配置就能看出来。不过,我确信CSS模块化将变得更好,并且越来越多的人将意识到不管对小项目还是大项目来说,这都是一个很好的方法。

我认为CSS模块化背后的思想是正确的。当然,我不是说这个库就是最佳解决方案,但是,它确实包含了一些CSS应该采用的写法:模块化、作用域隔离、同时支持复用。

最后,我向大家推荐项目作者Glen Maddern的文章 this introduction to CSS Modules 。

一.文件命名规范

[b]样式文件命名[/b]

[quote]主要的 master.css

布局,版面 layout.css

专栏 columns.css

文字 font.css

打印样式 print.css

主题 themes.css [/quote]

[b]CSS ID 的命名[/b]

[quote]页头:header

登录条:loginbar

标志:logo

侧栏:sidebar

广告:banner

导航:nav

子导航:subnav

菜单:menu

子菜单:submenu

搜索:search

滚动:scroll

页面主体:main

内容:content

标签页:tab

文章列表:list

提示信息:msg

小技巧:tips

栏目标题:title

加入:joinus

指南:guild

服务:service

热点:hot

新闻:news

下载:download

注册:regsiter

状态:status

按钮:btn

投票:vote

合作伙伴:partner

友情链接:friendlink

页脚:footer

版权:copyright

外 套:wrap

主导航:mainnav

子导航:subnav

页 脚:footer

整个页面: content

页 眉:header

页 脚:footer

商 标:label

标 题:title

主导航:mainbav(globalnav)

顶导航:topnav

边导航:sidebar

左导航:leftsidebar

右导航:rightsidebar

旗 志:logo

标 语:banner

菜单内容1: menu1content

菜单容量: menucontainer

子菜单:submenu

边导航图标:sidebarIcon

注释: note

面包屑:breadcrumb(即页面所处位置导航提示)

容器: container

内容: content

搜索: search

登陆: Login

功能区:shop(如购物车,收银台)

当前的 current[/quote]

[b]网站常用中英文对照表[/b]

[quote]网站导航 Site Map

公司简介 Profile or Company Profile or Company

公司设备 Equipment Equipment

公司荣誉 Glories Glories

企业文化 Culture Culture

产品展示 Product Product

资质认证 Quality Certification

企业规模 Scale Scale

营销网络 Sales Network

组织机构 organization organization

合作加盟 Join In Cooperation

技术力量 Technology Technology

经理致辞 Manager`s oration

发展历程 Development History

工程案例 Engineering Projects

业务范围 Business Scope

分支机构 Branches

供求信息 Supply &Demand

经营理念 Operation Principle

产品销售 Sales Sales

联系我们 Contact Us Contact Us

信息发布 Information Information

返回首页 Homepage Homepage

产品定购 order order

分类浏览 Browse By Category

电子商务 E-business

公司实力 Strength Strength

版权所有 Copy Right

友情连结 Hot Link

应用领域 Application Fields

人力资源 Human Resource Hr

领导致辞 Leader`s oration

企业资质 Enterprise Qualification

行业新闻 Trade News

行业动态 Trends

客户留言 Customer Message

客户服务 Customer Service

新闻动态 News &Trends

公司名称 Company Name

销售热线 Sales Hot-Line

联系人 Contact Person

您的要求 Your Requirements

建设中 In Construction

证书 Certificate Certificate

地址 ADD Add

邮编 Postal Code Zipcode

电话 TEL Tel

传真 FAX Fax

产品名称 Product Name

产品说明 Description Description

价格 Price

品牌 Brand

规格 Specification

尺寸 Size

生产厂家 Manufacuturer Manufacturer

型号 Model

产品标号 Item No.

技术指标 Technique Data

产品描述 Description

产地 Production Place

销售信息 Sales Information

用途 Application

论坛 Forum

在线订购 On-line order

招商 Enterprise-establishing

招标 Bid Inviting

综述 General

业绩 Achievements

招聘 Join Us

求贤纳士 Join Us

大事 Great Event

动态 Trends

服务 Service

投资 Investment

行业 Industry

规划 Programming

环境 Environment

发送 Delivery

提交 Submit

重写 Reset

登录 Enter

注册 Login

中国企业网技术支持 Powered By Ce.Net.Cn

社区 Community

业务介绍 Business Introduction

在线调查 Online Inquiry Inquiry

下载中心 Download

会员登陆 Member Entrance

意见反馈 Feedback

常见问题 FAQ

中心概况 General Profile

教育培训 Education &Training

游乐园 Amusement Park

在线交流 Online Communication

专题报道 Special Report[/quote]

常用类的命名应尽量以常见英文单词为准,做到通俗易懂,并在适当的地方加以注释。对于二级类/ID命名,则采用组合书写的模式,后一个单词的首 字母应大写:诸如“搜索框”则应命名为“searchInput”、“搜索图标”命名这“searchIcon”、“搜索按钮”命名为 “searchBtn”……

一. 常规书写规范及方法

1. 选择DOCTYPE:

XHTML 1.0 提供了三种DTD声明可供选择:

过渡的(Transitional):要求非常宽松的DTD,它允许你继续使用HTML4.01的标识(但是要符合xhtml的写法)。完整代码如下:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>

严格的(Strict):要求严格的DTD,你不能使用任何表现层的标识和属性,例如<br>。完整代码如下:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd“>

框架的(Frameset):专门针对框架页面设计使用的DTD,如果你的页面中包含有框架,需要采用这种DTD。完整代码如下:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Frameset//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd“>

理想情况当然是严格的DTD,但对于我们大多数刚接触web标准的设计师来说,过渡的DTD(XHTML 1.0 Transitional)是目前理想选择(包括本站,使用的也是过渡型DTD)。因为这种DTD还允许我们使用表现层的标识、元素和属性,也比较容易通 过W3C的代码校验。

2. 指定语言及字符集:

为文档指定语言:

<html xmlns=”http://www.w3.org/1999/xhtml” lang=”en”>

为了被浏览器正确解释和通过W3C代码校验,所有的XHTML文档都必须声明它们所使用的编码语言;如:

常用的语言定义:

<meta http-equiv=”Content-Type” content=”text/htmlcharset=utf-8″ />

标准的XML文档语言定义:

<?xml version=”1.0″ encoding=” utf-8″?>

针对老版本的浏览器的语言定义:

<meta http-equiv=”Content-Language” content=” utf-8″ />

为提高字符集,建议采用“utf-8”。

3. 调用样式表:

外部样式表调用:

页面内嵌法:就是将样式表直接写在页面代码的head区。如:

<style type=”text/css”><!– body { background : white color : black } –></style>

外部调用法:将样式表写在一个独立的.css文件中,然后在页面head区用类似以下代码调用。

<link rel=”stylesheet” rev=”stylesheet” href=”css/style.css” type=”text/css” media=”all” />

在符合web标准的设计中,推荐使用外部调用法,可以不修改页面只修改.css文件而改变页面的样式。如果所有页面都调用同一个样式表文件,那么改一个样式表文件,可以改变所有文件的样式。

4、选用恰当的元素:

根据文档的结构来选择HTML元素,而不是根据HTML元素的样式来选择。例如,使用P元素来包含文字段落,而不是为了换行。如果在创建文档时找不到适当的元素,则可以考虑使用通用的div 或者是span;

避免过渡使用div和span。少量、适当的使用div和span元素可以使文档的结构更加清晰合理并且易于使用样式;

尽可能少地使用标签和结构嵌套,这样不但可以使文档结构清晰,同时也可以保持文件的小巧,在提高用户下载速度的同时,也易于浏览器对文档的解释及呈视;

5、派生选择器:

可以使用派生选择器给一个元素里的子元素定义样式,在简化命名的同时也使结构更加的清晰化,如:

.mainMenu ul li {background:url(images/bg.gif)}

6、辅助图片用背影图处理:

这里的”辅助图片”是指那些不是作为页面要表达的内容的一部分,而仅仅用于修饰、间隔、提醒的图片。将其做背影图处理,可以在不改动页面的情况下通过CSS样式来进行改动,如:

#logo {background:url(images/logo.jpg) #FEFEFE no-repeat right bottom}

7、结构与样式分离:

在页面里只写入文档的结构,而将样式写于css文件中,通过外部调用CSS样式表来实现结构与样式的分离。

8、文档的结构化书写:

页面CSS文档都应采用结构化的书写方式,逻辑清晰易于阅读。如:

<div id=”mainMenu”>

<ul>

<li><a href=”#” >首页</a></li>

<li><a href=”#” >介绍</a></li>

<li><a href=”#” >服务</a></li>

</ul>

</div>

#mainMenu {

width:100%

height:30px

background:url(images/mainMenu_bg.jpg) repeat-x

}

#mainMenu ul li {

float:left

line-height:30px

margin-right:1px

cursor:pointer

}

*******************************************************************************************

命名参考(来源网络)

常用的CSS命名规则:

头:header

内容:content/container

尾:footer

导航:nav

侧栏:sidebar

栏目:column

页面外围控制整体布局宽度:wrapper

左右中:left right center

命名全部使用小写字母,如果需要多个单词,单词间使用“-”分隔,比如user-list

常用代码结构:

div:主要用于布局,分割页面的结构

ul/ol:用于无序/有序列表

span:没有特殊的意义,可以用作排版的辅助,

例如

<li><span>(4.23)</span>天幻网六周年天幻网六周年天幻网六周年天幻网六</li>

然后在css中定义span为右浮动,实现了日期和标题分两侧显示的效果

h1-h6:标题

h1-h6 根据重要性依次递减

h1位最重要的标题

label:为了使你的表单更有亲和力而且还能辅助表单排版的好东西,

例如:

<label for="user-password">密 码</label>

<input type="password" name="password" id="user-password" />

fieldset &legend:fildset套在表单外,legend用于描述表单内容。

例如:<form>

<fieldset>

<legend>title</legend>

<label for="user-password">密 码</label>

<input type="password" name="password" id="user-password" />

</fieldset>

</form>

dl,dt,dd:当页面中出现第一行为类似标题/简述,然后下面为详细描述的内容时应该使用该标签,

例如<dl>

<dt>什么是CSS?</dt>

<dd>CSS就是一种叫做样式表(stylesheet)的技术。也有的人称之为层叠样式表(Cascading Stylesheet)。<dd>

<dt>什么是XHTML?</dt>

<dd>XHTML是一个基于XML的置标语言,看起来与HTML有些想像,只有一些小的但重要的区别。可以这样看,XHTML就是一个扮演 着类似HTML的角色的XML。 本质上说,XHTML是一个桥接(过渡)技术,结合了XML(有几分)的强大功能及HTML(大多数)的简单特性。</dd>

</dl>

C #content

S #subcol

M #maincol

X #xcol

这是纵向布局的XHTML结构,c-smx表示网页有三个纵栏, c-sm表示有两个纵栏, c-mx表示有两个纵栏其中一个是附属的, c-m表示一个纵栏。

其中在三纵栏的布局需要分为两层 第一层是#subcol与#main第二层是#main中的#maincol与#xcol。

自定义命名:

根据w3c网站上给出的,最好是用意义命名

比如:是重要的新闻高亮显示(像红色)

有两种

.red{color:red}

.important-news{color:red}

很显然第二种传达的意义更加明确,所以尽量不要用意义不明确的作为自己自定义的名字

CSS命名规范

DIV CSS名称 说明

网站公用相关

Container div #container 容器

Header or banner div #header 页头部分

Main or global navigation div #mainNav 主导航

Menu #menu 菜单

Sub Menu #submenu 子菜单

Left or right side columns #sidebarA, #sidebarB 左边栏或右边栏

Main div #main 页面主体

Content div #content 内容部分

The main content area #contentMain 主要内容区域

Footer div #footer 页脚部分

Tag #tag 标签

Message #msg #message 提示信息

Tips #tips 小技巧

Vote #vote 投票

Friend Link #friendlink 友情连接

Title #title 标题

Summary #summary 摘要

Sub-navigation list #subNav 二级导航

Search input #searchInput 搜索输入框

Search output #searchOutput 搜索输出和搜索结果相似

Search #search 搜索

Search results #searchResults 搜索结果

Copyright information #copyright 版权信息

brand #branding 商标

branding-logo #brandingLogo LOGO

Site information #siteinfo 网站信息

Copyright information etc. #siteinfoLegal 法律声明

Designer or other credits #siteinfoCredits 信誉

Join us #joinus 加入我们

Partnership opportunities #partner 合作伙伴

Services #service 服务

Regsiter #regsiter 注册

Status #status 状态

9、鼠标手势:

在XHTML标准中,hand只被IE识别,当需要将鼠标手势转换为“手形”时,则将“hand”换为“pointer”,即“cursor:pointer”

如果是准备学前端,建议你可以看下这篇文章!

2022 年最新 Web 前端学习路线图,我梳理了完整的细节知识点,企业项目开发解决方案所需技术栈,更适合自学 Web 前端开发的同学,路线清晰明确,少走弯路。

零基础学编程,从宏观到微观全面了解

专业、语言选择、行业介绍、技术发展变革 (opens new window)