当前位置: 首页 > 编程日记 > 正文

CSS哲学伪命题

标题党。这篇文章断断续续的修改过好几次,也没有满意,本来是想总结一下我这些零散的 CSS 知识结构,可能由于知识体系不全面,总是没能把知识点串联成一个通顺的内容。贴出来权当大家一起讨论下“前世今生”。文章后续可能会不定时更新。

CSS 作为 Web 的基础部分,极其容易上手。但是 CSS 并不算的上是一门编程语言,在语言能力上略显薄弱,往往导致整体的维护性变差。但是这并没有使得大家停止对 CSS 的探索,从命名规范,目录架构,预处理器(如SASS),后处理器(PostCSS),模块化等等的方向上,努力把 CSS 变得更好。

关于自我历程

其实我自己并没有系统的学习过 CSS(虽然我现在也不知道如何系统的学习),看了几个视频,扫了下中文版的 API,然后就开始了切图生涯,很多的知识点也都是后来一些零散的博客中了解到的。这过程中,的的确确踩过不少的坑,有的填了,有的继续祸害着项目里其它的同学。也导致我在很长的时段时间里都是走在一个混乱无序的 CSS 书写当中。

最早遇到的大概的是命名的问题了吧,因为本身积累的词汇量就少,动不动就没单词可用了。那个时候好像也就是网上列出一大堆像menusiderbar之类的“命名大全”来模仿。再到后来接触到了 Bootstrap 这种比较系统的框架(里面有好多可以值得借鉴的地方),而后又看到一些按类别划分文件,再配有特有的前缀的管理方式(那个时候还并不知道 SMACSS 的名词),还有一些原子化,把功能和样式分离等等的。在 SASS 兴起的时候其实挺兴奋的,因为终于感觉有了点编程的能力,当然了,对变量,嵌套,mixins等等的使用,很大程度上提高了编程效率。在后来同事的分享中,又了解了 BEM 的命名方式(初看很乱,了解后有一种豁然开然的感觉,细细回想起来,也就是大家约定一套共用的命名规范)。以及通过 PostCSS 去实现 CSS 中一些自动处理的任务。在 React/ES6/Webpack 出现后,使得很大一部分程度上,CSS 写在 JS 中的方式也开始在特定的场合中频频出现。

以上,通通出现过我的项目中,在项目切换维护的时候,那感觉,心如刀割。并不是说上面涉及到的知识点有对错的问题,只是在一个团队中,如果没有一些统一的架构和约定,往往到项目的后期会变得越来越不稳定。这不禁又让我想起了 CSS 的学习曲线(像PHP?又来黑了),样式大家都能写,能愉快的维护,又是另一个层次了。

个人觉得 CSS 中有两个比较重要的点,语义化可维护性,而最终都是为了提高开发的效率。

语义化很大一部分程度上是为了阅读需要,简易明了。建议团队内还是要尽量的保持风格一致。其它的,可以看一下CSS语义思维的内容,这里不展开讲了。

可维护性真的是一个很虚的概念,但是涉及到了多方面的各个点。比如,该怎么保持项目的简单性,灵活性,而同时又有足够的扩展能力?又比如如何抽取模块,是以功能划分还是以样式结构?如何重用样式?如何防止样式被覆盖,避免冗余代码等等。

除了一次性的单页面这种外,一般项目类型的,都建议在开始的时候就搭好底层,统一一下整体风格与使用习惯,保持良好组织结构,命名规范,不然越往后面,可能会遇到更大的问题。

比如,对文件做一个层次划分

  • 基础框架(reset,iconfont,栅格)

  • 通用模块(原子,统一规范的模块)

  • 页面样式(继承通用模块)

采用类似 BEM/SUIT 等等的命名方式等等。

现有的技术选择

其实我们在平时应该或多或少的接触过一些 SASS, Compass, BEM, SMACSS, OOCSS 的概念与设计模式。当然并没有一种解决方案是绝对的,合适当前的项目就可以了。

BEM

用于解决项目命名规则问题。BEM 通过已block(块)element(元素)modifier(修饰符) 的概念,使用连接符串联父级块作为前缀,来实现功能模块命名的唯一性。有兴趣的同学可以看一下 BEM的进化史。发现一句话并不太好表述清楚,想要具体了解的同学可以移步官网。

BEM 这种唯一性以及元素间的平级展开,往往在稍微复杂一点的项目里,就会把名字命名的很长很长。目前也有很多是在 BEM 的基础上衍生出来的一些方式(如 SUIT)。

OOCSS (Object Oriented CSS)

面向对象 CSS。是一种已面向对象的维护方式去管理组织 CSS 代码。其哲学理念是模块化,功能单一性,关注点分离。

OOCSS 中有两个重要的原则

  • 结构和外观分离。样式尽量独立,和 DOM 无关

  • 容器和内容分离。CSS 只关注内容

OOCSSSASS 结合是一个不错的选择,充分强大。

SMACSS(Scalable and Modular Architecture for CSS)

可扩展和模块化 CSS。
把 CSS 样式划分为若干个不同类别的文件,如基础,布局,模块,主题等等。在加上一些特有前缀的组合。

ACSS (Atomic CSS)

原子化 CSS。遵循关注点分离原则。

CSS 模块化

随着 React 的迅速引爆,其它关于 CSS 的另一种使用方式也在兴起。将样式在 JS 中定义。借助 require/import 而解决了 CSS 中的命名空间的问题,使得单文件变得简单清晰。而通过组合,也可以实现快速的重复利用。甚至有些 CSS 可以单独与组件去绑定。

以及其它的一些方式。上述的方式,是比较让我眼前一亮的感觉。

未来走向

待补充...

扩展阅读

  • CSS模块(中文翻译版)

  • CSS 规范和最佳实践

  • BEM 进化史

  • 如何理解 CSS 类名语义化

  • CSS 分层

相关文章:

Linux TCP/IP协议栈笔记

数据包的接收作者:kendoKernel:2.6.12一、从网卡说起这并非是一个网卡驱动分析的专门文档,只是对网卡处理数据包的流程进行一个重点的分析。这里以Intel的e100驱动为例进行分析。大多数网卡都是一个PCI设备,PCI设备都包含了一个标…

技术大佬的肺腑之言:“不要为了 AI 而 AI”! | 刷新 CTO

扫描上方二维码直达精彩回顾整理 | 伍杏玲出品 | CSDN(ID:CSDNnews)据 CSDN 最新数据统计显示,在 CSDN 3000万的注册开发者中,689 万开发者有阅读、撰写与研究 AI 技术的行为,聚焦 AI 学习及应用的开发者人…

Silverlight中使用CompositionInitializer宿主MEF

MEF可以在传统应用程序中使用(包括桌面的Winform、控制台程序和Web的ASP.NET),也可以在RIA的Silverlight中使用。在Silverlight中只是宿主的方式有所不同,实际上在Silverlight中也可以像传统应用程序中是方式去宿主,ME…

Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误

这篇是计算机类的优质预售推荐>>>>《Verilog与SystemVerilog编程陷阱:怎样避免101个常犯的编码错误》 编辑推荐 纠错式学习,从“陷阱”中学习编程,加深对语言本身的理解。逆向式学习,从错误中学习避免错误的方法。让读…

Linux网卡驱动程序编写

Linux网卡驱动程序编写 [摘自 LinuxAID] 工作需要写了我们公司一块网卡的Linux驱动程序。经历一个从无到有的过程,深感技术交流的重要。Linux作为挑战微软垄断的强有力武器,日益受到大家的喜爱。真希望她能在中国迅速成长。把程序文档贴出来&#xff0…

旷视提双边分支网络BBN:攻坚长尾分布的现实世界任务 | CVPR 2020 Oral

作者 | 旷视研究院出品 | AI科技大本营(ID:rgznai100)导读:本文是旷视 CVPR 2020 论文系列解读文章,也是 CVPR 2020 Oral展示论文之一,它揭示了再平衡方法解决长尾问题的本质及不足:虽然增强了分类器性能&a…

kissy core

http://code.google.com/p/kissy/转载于:https://www.cnblogs.com/pinnasky/archive/2010/07/07/1772646.html

VIM多窗口编辑

vim提供多窗口编辑的功能,可以简化复合的编辑任务。vim的多窗口并不是说在终端上启动多个vim实例。启动多窗口编辑 vim的多窗口是动态的,可以开始编辑时就打开多窗口,也可以工作时随时增加新窗口,或者删除一个窗口。$ …

从Nginx绑定80端口学套接字编程

《UNIX网络编程(卷1):套接字联网API(第3版)》 ngx_connection.c ngx_int_t ngx_open_listening_sockets(ngx_cycle_t *cycle) {int reuseaddr;ngx_uint_t i, tries, failed;ngx_err_t err;ngx_log_t *log;ngx_socket_t …

中国无人机“老炮儿”回忆录

整理 | 夕颜采访嘉宾 | 刘宾,通飞航空总工程师、飞行教员来源 | CSDN(ID:CSDNnews)今天的采访嘉宾有些与众不同,在我的印象中,这是一位不原意用“中国式”讲话与人沟通的人,因为费劲,也只有在回…

一些常用DOS命令

1. gpedit.msc-----组策略2. sndrec32-------录音机3. Nslookup-------IP地址侦测器4. explorer-------打开资源管理器5. logoff---------注销命令6. tsshutdn-------60秒倒计时关机命令7. lusrmgr.msc----本机用户和组8. services.msc---本地服务设置9. oobe/msoobe /a----检查…

linux文本编辑nano

2019独角兽企业重金招聘Python工程师标准>>> Nano命令指南 今天在输命令时,无意中输入了nano,对这个命令不太熟悉,结果不知道如何才能退出,保存,赶快查了一下资料,原来是这样的啊。打开文件与新…

write的奥秘

在Linux下我们在使用设备的时候,都会用到write这个函数,通过这个函数我们可以象使 用文件那样向设备传送数据。可是为什么用户使用write函数就可以把数据写到设备里面 去,这个过程到底是怎么实现的呢? 这个奥秘就在于设备驱动…

常用的键盘命令

Alt空格C 关闭窗口 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />Alt空格N 最小化当前窗口 Alt空格R 恢复最小化窗口 Alt空格X 最大化当前窗口 Alt空格M 移动窗口 Alt空格S 改变窗口大小 AltTab 两个程序交换 Alt255 QQ号中输…

京东智能内容创作算法的演进与实践:基于关键词自动生成摘要

来源 | 京东智联云开发者导读&#xff1a;京东商城背后的 AI 技术能力揭秘&#xff1a; 基于关键词自动生成摘要过去几十年间&#xff0c;人类的计算能力获得了巨大提升&#xff1b;随着数据不断积累&#xff0c;算法日益先进&#xff0c;我们已经步入了人工智能时代。确实&…

【基础复习】二:预处理、const与sizeof

赋值语句 1.i的值为&#xff1f; #include <iostream> using namespace std; int i 1; int main() {int i i; } 解析&#xff1a; 此时main函数内的i是优先考虑局部变量&#xff0c;除非使用作用域符号&#xff0c;否则是和外面值为1的i是无关的。 其次&#xff0c;使用…

使用多线程还是用IO复用select/epoll? epoll 或者 kqueue 的原理是什么?

原作者&#xff1a;蓝形参 原文&#xff1a;http://www.zhihu.com/question/20114168/answer/14024115 使用多线程还是用IO复用select/epoll? 多线程模型适用于处理短连接&#xff0c;且连接的打开关闭非常频繁的情形&#xff0c;但不适合处理长连接。多线程模型默认情况下…

使用大batch优化深度学习:训练BERT仅需76分钟 | ICLR 2020

作者 | Yang You, Jing Li等译者 | 刘畅在海量数据集上训练大型深度神经网络&#xff0c;是非常具有挑战性的。最近&#xff0c;有许多研究均使用大batch随机优化方法来解决此问题。在该研究领域中&#xff0c;目前最杰出的算法是LARS&#xff0c;它通过采用分层自适应学习率&a…

华为AR28-11路由器配置

公司使用华为AR28-11路由器&#xff0c;宽带接入。现使用2M光纤接入&#xff0c;地址&#xff1a;124.117.254.* 255.255.255.252.公司电脑使用192.168.1.0 255.255.255.0 网段地址参考配置#version 5.20, Release 1205P02, Basic#sysname H3C#domain default enable system#vl…

PHPExcel使用-使用PHPExcel导出文件-导出MySQL数据

现在数据库里面有一组数据&#xff0c;我们将它按照不同的难度进行分sheet. 首先我们需要写一个mysql的配置文件- db.config.php(utf-8编码) : <?php $dbconfig array( host > 127.0.0.1, username > root, password > , database > xxx, charset &…

C语言清空输入缓冲区的N种方法对比

C语言中有几个基本输入函数&#xff1a; //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 char *fgets(char * restrict s, int n, FILE * restrict stream); char *gets(char *s);//可能导致溢出&#xff0c;用fgets代替之…

低耗时、高精度,微软提基于半监督学习的神经网络结构搜索算法

作者 | 罗人千、谭旭、王蕊、秦涛、陈恩红、刘铁岩 来源 | 微软研究院AI头条&#xff08;ID:MSRAsia&#xff09;编者按&#xff1a;近年来&#xff0c;神经网络结构搜索&#xff08;Neural Architecture Search, NAS&#xff09;取得了较大的突破&#xff0c;但仍然面临搜索耗…

《虚拟化与云计算》读书感(三)数据中心的概述

看了《虚拟化与云计算》的第一章第一节‘数据中心的概述’。在我读这一节开始&#xff0c;我看到这个题目的时候总是联想到类似谷歌数据中心一类的东西&#xff0c;多个硬盘或者服务器的堆叠。然后整来几个集装箱把这些堆叠的服务器塞进去&#xff0c;然后供用户使用。然而自从…

golang笔记——struct

1、定义一个结构体 type User struct {userid intusername stringpassword string } 2、初始化一个结构体 有两种情况&#xff0c;一是得到结构体的对象&#xff0c;一是得到结构的对象指针&#xff0c;分别有三种方式&#xff1a; //第1种方式&#xff0c;先声明对象&#x…

posix_memalign

翻译的<Linux system programming> 第八章 二 ;《Linux System Programming》中文版 对齐 数据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系。一个变量的地址是它大小的倍数的时候&#xff0c;这就叫做自然对齐(naturally aligned)。例如&…

ubuntu 10.04 安装eclipse及其中文语言包

1.安装eclipsesudo apt-get install eclipse2.暗自中文语言包点 击下载中文语言包&#xff08;http://www.eclipse.org/downloads/download.php?file /technology/babel/babel_language_packs/BabelLanguagePack-eclipse- zh_3.5.0.v20091121043401.zip&urlhttp://d2u376u…

世界顶级赛事百万座位如何做到票务限时匹配?

作者 | 阿里文娱技术专家 展恒出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;背景麦座&#xff0c;是大麦旗下的票务系统。去年&#xff0c;我们承接了 2019 年国际篮联篮球世界杯&#xff08;2019FBWC&#xff09;&#xff0c; 核心目标是完成三种套票的运营及售卖…

[转](不理想)Ubuntu下更改主显示器

参考链接&#xff1a;http://www.cnblogs.com/feng_013/archive/2012/03/05/2380111.html 查看显示器信息&#xff1a; fdmfdm-OptiPlex-780:~$ xrandr 设置主显示器 fdmfdm-OptiPlex-780:~$ xrandr --output HDMI1 --auto --primary 设置副显示器在主显示器右边 fdmfdm-OptiPl…

Nginx源码分析--数据对齐posix_memalign和memalign函数

posix_memalign函数() /* * 背景&#xff1a; * 1&#xff09;POSIX 1003.1d * 2&#xff09;POSIX 标明了通过malloc( ), calloc( ), 和 realloc( ) 返回的地址对于 * 任何的C类型来说都是对齐的 * 功能&#xff1a;由posix_memalign分配的内存空间&…

不要一辈子靠技术生存

今天看了一篇文章,感受挺深的,人的一生不能一辈子靠技术生存,尽管你的技术能力很强.(文章转载出处忘记,有哪位朋友知道的提醒一下)一、 在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇&#xff0c;你千万更不要认为哪些从事 市场开发&#xff0c;跑腿的人&am…