@
pengtdyd CSS 非常非常难。
知乎有个问答里,对 CSS 的难度做过分析,首要问题就是 CSS 是不正交的,你改变了 A ,会奇怪的影响到 B 。即它存在大量的隐式条件和输入,导致你在推导结果的过程中,在大脑里必须得预加载条件输入方案,而且这个方案数量并不低。大约有十几种组合,这些组合是你要背的。绝大部分传统程序员,是习惯以逐行代码推导来进行思维过程的,天生不适应这种非正交系统。
其次就是 CSS 的调试工具至今没有得到足够的改善,要知道 CSS 调试的目的往往是为了解决“这个该死的盒子为啥在这里?”或者“那个该死的样式为啥就不起效”之类的问题,然而目前的浏览器调试工具,只能提供当前盒子受影响的条件参数,但是很多时候,影响这个盒子样式的原因,在十万八千里之外的另外一个盒子身上(这又是该死的非正交问题)。这和编程调试器在大多数能很方便把问题定位在一个非常小区域的上下文之上,很方便的找到问题,完全不是一个级别的。恕我直言,CSS 调试工具目前的能力非常落后。这种落后在于 CSS 系统里任何一个盒子的样式是受到诸多不在这个盒子上的,其它盒子的参数影响,最后被浏览器推导出来的,然而浏览器的 CSS 调试工具却不具备逆向推导的能力。这导致很多时候非常难以发现问题在哪里,于是我们会看到很多自称学会 CSS 的人,他们也改不了别人的 CSS 源码,他们解决问题最常见的一招就是:按自己的习惯完全重新写一遍。
所以从上面你也看到,很多自认为学会了 CSS 的人,其实并没有学会 CSS ,它们只是熟练的 CSS 搬砖工而已,判断这个人是否真的掌握了 CSS ,要看它能不能对一个已经存在的,且比较复杂页面的 CSS 代码进行推导和修改,即能能准确的分析中的某个盒子的样式到底是如何被影响的,然而通过那十几种组合,快速的研究出改哪里会生效。而现实中却往往是:md 搞不懂为啥,重写一遍!
所以 CSS 真的是很难,不过这个难是相对程序员说的,因为 CSS 是另外一种思维,它最初被设计出来是为了排版系统准备的,也许在排版领域,这东西设计的很好。但是换到程序员,这种从一开始就是培养逐行推理思路的领域,天生就不匹配。所以,学不会就学不会吧,像我至今就不敢说自己学会了 CSS ,虽然我有时候甚至可以用 CSS 问住搞前端的同学,但是我自己是很清楚的,我不会 CSS