让我们开门见山:编写优秀的 CSS 代码是件十分痛苦的事情。很多开发人员都不想做 CSS 开发。你让我干什么都行,但是 CSS 还是算了吧。

在我创建应用的时候,从来都无法从 CSS 中享受到乐趣。但是你也躲不过去,是不是?我是说,我们全神贯注于用户体验,但是如今设计也是不容忽视的部分。

项目刚开始的时候,一切都很美好。你有一些 CSS 选择器,诸如 .title、input、#app 等等,非常简单。但是随着应用逐渐变大,CSS 也越来越糟。你对 CSS 选择器感到困惑。你会发现自己写了一些 div#app .list li.item a 之类的东西。然后你一遍又一遍地写相同的代码。最后你把所有代码都扔到文件末尾,因为你根本不在乎,CSS 烂透了。结果你得到了 500 行根本无法维护的 CSS 代码。


我本人经常和 CSS 苦苦纠缠。

今天目的是:让你写出更好的 CSS。我想让你回顾一下旧项目,然后想一想:天啊,我怎么会写这样的东西?但是,你可能会想:好,你说的很对,但是 CSS 框架呢?CSS 框架就是为了帮助我们写出更好的 CSS 代码,不是吗?

当然,但是 CSS 框架也有一些缺点:

它经常会使用平淡无奇的设计。

CSS 框架使得定制很困难,更不用说超越框架了。

在使用之前,你必须先学习如何使用它们。

既然你关注了这篇文章,那么你一定有自己的原因,对不对?好了,废话不多说,让我们开始学习如何写出更好地 CSS 代码。

注意:这篇文章不是关于如何设计漂亮的应用。本文是关于如何写出便于维护的 CSS 代码以及如何组织代码。

1、SCSS

将在下面例子中使用 SCSS。SCSS 是一个 CSS 的预处理器。从根本上来说,它是一个 CSS 的超集:它增加了一些很酷的功能,例如变量,嵌套,导入和混入(mixins)等。

下面介绍一些我们即将使用的功能。

变量

你可以在 SCSS 中使用变量。主要的好处在于可重用性。我们假设你的应用有一组颜色。主色是蓝色。

那么你处处都用到了蓝色:按钮的 background-color(背景色),标题和链接的 color(颜色)。蓝色无处不在。

突然有一天,你不喜欢蓝色,开始喜欢绿色。

如果没有变量:你需要修改所有包含蓝色设置的代码。

如果使用了变量:你只需要修改这个变量。
嵌套

你可以在 SCSS 中使用嵌套。那么如下代码:

可以写成:

可读性更好了,是不是?你可以利用嵌套在更短时间内写出复杂的选择器。

分块与导入

从可维护性和可读性的角度来说,你无法将所有代码都保存在一个大文件中。在实验或构建小型应用时,这种做法尚且可行,但是到了专业的级别……想都不要想。很幸运的是,有了 SCSS 后,我们依然可以继续沿用这种做法。

你可以通过使用前下划线给文件命名,来创建分块的文件:animations.scss, base.scss,_variables.scss 等。

至于导入,你可以使用 @import 指令。例如,你可以这么做:

哈哈!你可能想,你在这里犯了一个错误!应该是 _animations.scss,而不是 animations;)

非也。如果你使用这种命名方式,聪明的 SCSS 知道你指的是分块文件。

关于变量、嵌套、分块和导入,我们需要了解的就这么多。SCSS 还有很多其他功能:比如混入、继承和其他指令(@for,@if,等等),在此不做一一介绍了。

我记不清曾经多少次在CSS类中使用包揽一切的名字了。比如:·.button·、·.page-1·、·.page-2·、·.custom-input·。

我们常常不知道如何命名。然而命名很重要。假如你正在构建某个应用,并且由于某种原因不得不将其搁置数月,那该怎么办?还有更糟的,假如有人想把项目拿回去,该怎么办?如果你的 CSS 代码没有恰当的命名,那么乍一看上去很难明白你在说什么。

BEM 可以帮助我们解决这个问题。BEM 是一种命名约定,是英文 Block Element Modifier(块元素修饰符)的缩写。

这种方法可以使我们的代码结构化,并提高模块化和可重用性。现在让我们说一说什么是块、元素和修饰符。

你可以把块视为组件。还记得你小时候玩过乐高积木吗?让我们回忆一下小时候。

如果需要建造一个简单的房子,你会怎么做?你需要一个窗户,一个屋顶,一扇门和一些墙壁。这些就是我们的块。它们有着本身的意义。

命名:块名:.block

示例:.card、.form、.post、.user-navigation

元素

接下来,你应该如何用你的乐高积木建造一个窗口呢?可能有些积木看起来像框架,如果你把四个这样的积木组装起来,就会得到一个漂亮的窗户。这些就是我们的元素。它们是块的一部分,它们对于建块必不可少。但是,在块外面的时候,它们便无用武之地。

命名:块名+ __ +元素名:.block__element

示例:.post__author、.post__date、.post__text

修饰符

现在窗户已经建好了,但是你可能想要一个绿色或一个小窗户。这些我们称之为修饰符。它们是块或元素上的标志,它们用于改变行为,外观等等。

命名:块名称或元素名称+ – +修饰符名称:.block__element–修饰符,.块–修饰符

示例:.post–important,.post__btn–disabled

注意事项

在使用 BEM 的时候,你可以用且只能用类来命名。不能用 ID,不能用标签。只能用类。

块和元素可以嵌入其他块和元素,但是它们必须是完全独立的。请记住:独立。所以如果你想将把一个按钮放在标题下的话,就不要在按钮上加边距,否则按钮就会与标题绑定。请改用工具类。

是的,你的 HTML 文件会超负荷,但是不用担心,与 BEM 带来的好处相比,这只是个小小的缺点。

示例

以下是一个练习。你可以去你最喜欢或最常用的网站,然后想想看哪些是块、元素和修饰符。

例如,以下是我想象中的 Google 商店:

Google 商店

现在该你了。认真想想哪些地方可以改进。与往常一样,你必须自己搜索、实验和构件,以便更好地满足你的需求。

融会贯通

下面的示例演示了 BEM 的功能。

BEM 的功能

写一个博文组件

博文组件

写多个按钮

3、组织 CSS 文件:7-1模式

你还跟得上节奏吗?很好!现在让我们来介绍如何组织 CSS 文件。这个部分可以真正帮助你提高工作效率,并帮助你立刻找到需要修改的 CSS 代码。

为此,让我们了解一下 7-1 模式。你可能会想,我从未听过这种模式。相信我,这很简单。你必须遵守以下两条规则:

将所有内容分别写入7个不同的文件夹中。

将它们全部导入位于根级别的 main.scss 文件中。仅此而已。
7 个文件夹:

base:你可以将所有的样板代码放入该文件夹中。对于这里的样板,我指的是:每次开始一个新项目时,你需要写的所有CSS代码。例如:排版规则、动画、工具程序(对于工具程序,我指的是margin-right-large、text-center、…等类)等等。

components:这里指组件。这个文件夹包含所有用于构建页面的组件,例如按钮、表单、滑块、弹出窗口等等。

layout:页面不同部分用到的布局,也就是说:页眉、页脚、导航、分区、你自己的网格等等。

pages:页面。有的页面可能有特定的样式,与通常的处理方式不同。那么你可以将它放入该文件夹。

themes:主题。如果你的应用中有不同的主题(黑暗模式、管理员等等),那么可以将它们放入该文件夹。

abstracts:抽象。你可以将所有函数和变量与混入(mixin)放在这里。简而言之,就是你所有的帮手。

vendors:外部资源。应用或项目怎么可能没有外部的库呢?你可以将所有不依赖于你的文件都放入该文件夹。例如,你可以放入Font Awesome文件、Bootstrap和其他类似的东西。
主文件

你需要将以上所有内容导入到该文件中。

我知道你觉得以上内容有点太多,一时难以接受。这个架构适合于大型项目,而非小项目。下面我们介绍一种更适合小项目的做法。

首先,你不需要 vendors 文件夹。可以将所有外部 CSS 代码放在头部的link标签内。接下来,如果你的应用只有一个主题的话,可以省略 themes 文件夹。最后,你可能不会有大量页面特定的风格,所以也 pages 也没必要。好了,现在只剩下 4 个文件夹了。

然后,你有两个选择:

你可以按照7-1模式组织CSS代码,那么你需要留下abstracts、components、layout 和 base 文件夹。

你想将所有的分块文件和 mail.css 放在一个大文件夹内,那么你会得到如下结构:

你可以随便选。

你可能会想:你说服了我!但是我该如何使用呢?我是说,哪些不支持scss文件的浏览器该怎么办呢?说的好!这是我们的最后一步,我们现在就来学习如何将SCSS编译为CSS。
4. 从 SCSS 到 CSS

首先,你需要 Node.js 和 NPM(或 Yarn)。

我们将使用一个名为 node-sass 的包,它可以让我们将 .scss 文件编译为 .css 文件。

它的 CLI(命令行界面)相当容易使用:

它有多个选择,但我们只使用其中两个:

-w:监视目录或文件。这意味着node-sasswaits在时刻监督你的代码是否发生改动,一旦出现发生,它就会自动编译成CSS。这在开发时非常有用。

–output-style:CSS文件的输出内容。它的值可以是:嵌套、展开、紧凑、压缩。我们将使用它来构建你的CSS文件。

如果你是一个好奇心很重的人(我希望如此,因为开发人员应该好奇!)那么,请点击这里查看 完整的文档。

现在我们知道需要用哪些工具。其余的工作更简单。只需按以下步骤操作:

创建项目:mkdirmy-app && cd my-app

初始化:npm init

添加node-sass库:npm install node-sass --save-dev

创建文件夹,index.html和main.scss文件:

将这些脚本加入到package.json文件中:

将包含编译好的 CSS 文件的连接加入到 index.html 文件的 head 标签内:

然后就可以了,你准备好了!你可以在编程的时候运行npm run watch,并在浏览器中打开index.html文件。如果你想缩小CSS,只需运行npm run build。
5. 补充

添加实时重新加载

你可能希望添加实时重新加载以提高工作效率,而无需手动重新加载本地index.html文件。

你可以按照以下简单的步骤操作:

安装live-server软件包:npm install -g live-server。注意:它是一个全局包。

将npm-run-all添加到项目依赖项中:npm install npm-run-all --save-dev:有了它我们就可以同时运行多个脚本。

将这些脚本添加到package.json:

{
...
"scripts": {
"start": "npm-run-all --parallel liveserver watch",
"liveserver": "live-server",
"watch": "node-sass sass/main.scss css/style.css -w",
},
...
}

现在如果你运行 npm run start,就可以立即看到代码的变更。

添加自动前缀

我们设置好了开发工具,太棒了!现在,让我们来谈谈构建工具,特别是:自动前缀(Autoprefixer)。

它是一个工具(尤其是postcss插件),它可以解析CSS,并利用这些值(https://caniuse.com/)将提供商的前缀加入到CSS规则中。

实际上,在构建网站时,你可能会使用一些并非所有浏览器都完全支持的新功能。因此,提供商方案可以提供对这些功能的支持。以下是一个示例:

-webkit-animation-name: myAnimation;
-moz-animation-name: myAnimation;
-ms-animation-name: myAnimation;

你可能会想,这写起来太乏味了。这就是为什么我们需要自动前缀来帮助我们的CSS代码获得浏览器的兼容,而不用增加额外的复杂性。

那么我们如何用更聪明地构建CSS呢?

将所有的SCSS文件编译成一个主CSS文件。

使用自动前缀为CSS文件添加前缀。

压缩CSS文件

还有最后几步,请坚持看下去,马上就结束了。

添加两个依赖项,postcss-cli和autoprefixer:npm install autoprefixer postcss-cli --save-dev

修改build脚本,并将这些脚本添加到 `package.json:

{
...
"scripts": {
"start": "npm-run-all --parallel liveserver watch",
"liveserver": "live-server",
"watch": "node-sass sass/main.scss css/style.css -w",
"compile": "node-sass sass/main.scss css/style.css",
"prefix": "postcss css/style.css --use autoprefixer -o css/style.css",
"compress": "node-sass css/style.css css/style.css --output-style compressed",
"build": "npm-run-all compile prefix compress"
...
}

现在当你运行 npm run build 时,可以生成经过压缩的 CSS 代码,并且添加了提供商前缀!太棒了是不是吗?但是你知道更酷的是什么吗?这里为你设置了一个代码仓库,以帮助你迅速开始:)

如果你想知道我是如何在项目中应用这些技术的,请点击这里查看 代码仓库 和 结果。希望你能通过这些例子更深入理解。现在,你可以准备开始编写具有可维护性、模块化和可重用性的 CSS 代码了。
点此链接:最后送福利了,自己是从事了五年的前端工程师,整理了一份最全面前端学习资料,里面概括应用网站开发,css,html,JavaScript,jQuery,Ajax,node,angular等。等多个知识点高级进阶干货的相关视频资料,等你来拿

大佬教你如何写出更好的CSS,分享web前端资料相关推荐

  1. python代码怎么写出色_如何写出更具有Python风格的代码,五分钟教会你!

    我们都喜欢 Python,因为它让编程和理解变的更为简单.但是一不小心,我们就会忽略规则,以非 Pythonic 方式编写一堆垃圾代码,从而浪费 Python 这个出色的语言赋予我们的优雅.Pytho ...

  2. 程序员如何写出更好的代码

    Martin Thompson是Java Champion称号获得者,同时也是一名高性能计算科学家.他说,为了写出更好的代码,程序员需要运用基本设计原则,阅读已有代码.在QCon London 201 ...

  3. 你应该知道的7个写出更好的 Java 代码的技巧

    来源:SpringForAll社区 查看这些技巧和窍门可以帮助你写出更好的 Java 代码. 是的,你可以按照以下7个技巧和窍门编写出简短.整洁的 Java 代码.他们中的一些可能会让你感到惊讶,但是 ...

  4. python写出的程序如何给别人使用-涨姿势!这些小技巧让小白也可以写出更优雅的Python代码!...

    原标题:涨姿势!这些小技巧让小白也可以写出更优雅的Python代码! 一.前言 我前两天回答了两个Python相关的问题,收到了很多赞,从答案被收藏的情况来看,确实对不少人都很有帮助,所以我也很开心. ...

  5. 9个JavaScript小技巧:写出更简洁,高效代码

    JavaScript一直在变化进步着,这儿列举了一些小技巧帮你在2019年写出更简洁,高效的可拓展的代码.下面共列举了9个讲究使用的小技巧来帮助你成为更好的开发者. 1. async / await ...

  6. 【整洁之道】如何写出更整洁的代码(上)

    如何写出更整洁的代码 代码整洁之道不是银弹,不会立竿见影的带来收益. 没有任何犀利的武功招式,只有一些我个人异常推崇的代码整洁之道的内功心法.它不会直接有效的提高你写代码的能力与速度,但是对于程序员的 ...

  7. larvel php restful_Laravel教你简单写出专业的RestfulAPI

    下面由Laravel教程栏目给大家介绍Laravel写出专业的RestfulAPI的方法,希望对需要的朋友有所帮助! Laravel教你简单写出专业的URL 引言 在我们连接了数据库,并且使用迁移功能 ...

  8. 如何在 ASP.NET Core 中写出更干净的 Controller

    你可以遵循一些最佳实践来写出更干净的 Controller,一般我们称这种方法写出来的 Controller 为瘦Controller,瘦 Controller 的好处在于拥有更少的代码,更加单一的职 ...

  9. 如何写出更好的代码(文末有福利)

    女主宣言 我们在过去的几期推送里已经给大家介绍了笔者根据多年研发经验总结出来的编码规范和 git 等实用工具的运用场景,今天咱们就来继续聊聊项目开发过程的诸多方法论.本文最先发布于 7rule,转载已 ...

最新文章

  1. Netflix混沌工程手册Part 2:混沌工程原则
  2. 成都python数据分析师职业技能_数据分析师需要什么技能,数据分析行业都有什么职业?...
  3. SmartPDA图片
  4. 解决在待办任务菜单中都会抛出异常,由于definitionId=undefined导致的问题
  5. LAMP默认安装路径
  6. 如何使用@vue/cli 3.0在npm上创建,发布和使用你自己的Vue.js组件库
  7. 从字符串或16进制数得到UIColor
  8. prune研究记录(二)
  9. Unity MRTK语音输入
  10. android app 缓存目录在哪里找,Android App的文件缓存目录
  11. 哪款运动蓝牙耳机好用、运动型蓝牙耳机推荐
  12. 阿里云香港服务器被打流量攻击怎么办
  13. 《鱿鱼游戏》我怕了,还是整点阳间的游戏吧,Python版“碰糖”来袭—你能过几关?
  14. ABAP 中历史库存
  15. vscode插件(个人正在用的)
  16. 基于深度强化学习的组合优化方法在工业应用中的实践
  17. 中国人工智能学会公布首批会士名单,共计53名产业领军人物当选
  18. 云ERP有什么优势?功能有哪些?
  19. 2022年,谁在推动产业数字化进入“奇点”时刻?
  20. mysql表的增删改select 和 where

热门文章

  1. 简述导线平差计算的五个步骤_RTK技术导线测量和全站仪导线测量有什么区别?...
  2. 年龄是计数还是计量_电子皮带秤是静态称重还是动态称重?
  3. mysql c#开发库_c# 开发+MySql数据库
  4. Apache与Tomcat的区别
  5. 解决设备行业尾款回收问题-深思精锐5时钟锁
  6. PS VR发售临近,索尼的VR影视内容也不远了
  7. freeswitch订阅会议相关通知
  8. Java 实现图片合成
  9. angularjs--resource
  10. 《ELK Stack权威指南(第2版)》一3.5 Windows系统日志