CSS 为什么这么难学?

2023-05-16

最近半年,我一直都没在知乎上遇到好的前端问题,而这个问题,问到我心坎上了。

在过去一年的教学过程中,不断有学生尝试理性地理解 CSS,都以失败告终。

我告诉他们 CSS 是没有逻辑可言的!他们不信。

这个问答,能很好阐释我的理解。以下是我的回答。

短答案:因为 CSS 不正交。

长答案:

我先来解释一下什么是正交。

你调过显示器的「亮度」、「色调」和「饱和度」吧。

  • 「亮度」就是明暗程度,值越大,屏幕越亮。
  • 「色调」就是颜色,你通过调色调,可以把红色调成绿色。
  • 「饱和度」就是鲜艳程度,值越大越鲜艳。

「正交」就是,你调节这三者中的一个时,不影响其他两个效果。

  • 你调节「亮度」的时候「色调」和「饱和度」不会变化。
  • 你调节「色调」的时候「亮度」和「饱和度」不会变化。
  • 你调节「饱和度」的时候「亮度」和「色调」不会变化。

「正交」看起来应该是理所当然的,对吧。

想象一下「不正交」的情况:你调节「亮度」的时候,「色调」和「饱和度」会跟着无规律的变化。如果是这样,你会调得想死,因为你很难调到你想要的效果。

而 CSS,就是「不正交」的。

我以 width 对 margin-left 的影响为例,假设有如下代码:

.parent 里面的 .child 宽度为 300px,现在我给他添加一个 margin-left: -10px,会发现

整个 .child 左移 10 像素

好的,于是我们知道 margin-left: -10px 会让元素整体左移。

真的是这样吗?

这个时候把 width 去掉重新做实验,这是在添加 margin-left 之前:

这是在添加 margin-left 之后:

我们发现 margin-left: -10px 并没有让整个元素左移,只是让左边缘左移了,右边缘并没有动。

现在来总结一下:

  1. 如果指定了 width,那么 margin-left: 10px 会使元素整体左移
  2. 如果没有指定 width,那么 margin-left: 10px 只会使做边缘左移(也就是宽度扩大)

看到这里,你就会觉得 CSS 特别不正交:

  1. 为什么 width 的存在与否会影响 margin-left 的作用?
  2. 有没有 width 之外的其他属性也会影响 margin-left 的作用?恐怕你无法得知。

这就是不正交的恐怖之处,你只有把所有属性与 margin-left 一起用一下,才能得知 margin-left 的真正规律。

这还只是两个属性的影响,你能想象三个属性互相影响的情况吗?

我再举第二个例子,大家都知道 position: fixed 是相对于视口(viewport)定位的。

但是这个「真理」会受另一个元素的影响……对,我知道你很震惊……

先看正常情况:

网页右边是一个 iframe,红色的 .fixed 元素相对于 iframe 视口左上角定位,与我们预期一致。

接下来我在 .box 上面加一个 CSS3 中的属性,就会改变你的认知:

父容器加了 transform 之后,fixed 定位的元素居然相对于父容器定位。

天知道以后 CSS 会不会加更多元素来影响我已经认为是真理的事情?

这就是「不正交」的恶心之处。

我再举一个例子,大家都知道给固定宽度的 div 加 margin: 0 auto 可以让它水平居中,很多人就问,那为什么 margin: auto 0(注意 auto 和 0 的位置反过来了)不能做到垂直居中呢?

其实是可以的:

但是必须是在当前元素有 position: absolute; top: 0; bottom:0; 的情况下才能垂直居中。这就很「不正交」了。

怎么学习「不正交」的东西?

只有一个办法:试。

你试的组合情况越多,就越能了解各种奇怪的现象。

别无他法。

目前 CSS 常用的属性就按 50 个算吧,两种属性组合一共有 50 * 49 / 2 = 1225 种情况,三种属性组合一共有 50 * 49 * 48 / 6 = 19600 种情况。这还没有算上父子元素的互相影响的情况。

少年,你有生之年,慢慢试吧。

目前我们知道

  1. 不同属性的组合会有不同的效果;
  2. 新的属性会影响你已经学会的知识;
  3. 这些规律,毫无逻辑可言,你只能试出来。 这,就是 CSS 难学的原因。

以我的经验,越是理性的人,越难理解 CSS;越是感性的人,越容易理解 CSS。

这就是为什么大部分后端程序员能学会 JS,却学不会 CSS——他们太理性了。

你想用学编程的思路来学 CSS?放弃吧!

你需要用学画画的思路来学习 CSS——每天不停地画画,一个鸡蛋用不同的方式画一千遍,就成了。

所以我在课上说过一句话:

CSS 不是科学,CSS 是艺术。

P.S. 「正交」概念我是从《Unix编程艺术》学到的,少逛社区多读书吧。关注【饥人谷前端】——一个有爱的前端交流社区。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSS 为什么这么难学? 的相关文章

随机推荐

  • GPS数据读取与处理

    GPS数据读取与处理 GPS模块简介 SiRF芯片在2004年发布的最新的第三代芯片SiRFstar III xff08 GSW 3 0 3 1 xff09 xff0c 使得民用GPS芯片在性能方面登上了一个顶峰 xff0c 灵敏度比以前的
  • 想自己造无人机吗?Intel推出基于 Linux x86的自助无人机开发板

    英特尔开发论坛会议消息 xff1a 英特尔手里不乏新的和升级的硬件工具包 xff0c 从无人机自助套件到各种大气的物联网包不等 xff0c 工程玩家利用这些无人机硬件可以自己组装无人机 Aero组装套件是一个最好玩的包 xff0c 即日起接
  • 回眸--从高考到程序猿

    杨过等待了小龙女16年 xff0c 终成眷属 xff0c 从此郎情妾意双双在浪迹天涯 而参加高考后也奋斗了16年 xff0c 梦中却总是想起回眸后那流泪的脸 19年前 xff0c 我们那里流行的不是高考 xff0c 而是中考 xff0c 因
  • istanbul —— JavaScript 代码覆盖率检查工具

    istanbul 是一个 JavaScript 的代码覆盖率检查工具 https yqfile alicdn com e6425e746f3af8cef9c3e64dde6ff2f9a336929d png 34 gt 文章转载自 开源中国
  • vscode怎么修改颜色主题里的某种颜色

    我习惯用深色主题 齿轮 gt 颜色主题 gt monokai是我的菜 比较精神 又不刺眼 但是这个主题的注释的颜色太浅了 几乎和背景重合 注释很重要 能体现和记录自己的代码思路 所有 改变一下comment的颜色很重要 在vscode图标右
  • 双系统linux安装分区详解,win10环境下安装Ubantu双系统(详解图解)

    1 准备工作 xff1a 先去ubantu官网 https www ubuntu com download 去下载ubantu镜像 根据自己的实际情况选择32位的或者64位的 xff0c 现在的电脑大部分已经都是4g内存了 xff0c 我推
  • Ubuntu - 硬盘分区、格式化、自动挂载配置

    Ubuntu系统的硬盘空间不够用了 xff0c 需要增加新的硬盘扩容 将硬盘分区 格式化 自动挂载配置的整个过程记下来 xff0c 备忘 运行环境 Enviroment Ubuntu 10 10 一 硬盘分区 Hard disk add n
  • linux下安装F-prot杀毒软件

    一 f xff0d prot的安装 1 首先我们要创建一个带有超级权限的用户 sudo passwa root 2 su 切换用户 3 下载F prot http www f prot com download home user down
  • 使用Github自动构建Docker

    原文链接 xff1a http yangbingdong com 2017 docker automated build by github 一开始玩Docker总是用别人的镜像确实很爽歪歪 But xff0c 如果要定制个性化的Image
  • 常用 API 函数(6): 菜单函数

    AppendMenu在指定的菜单里添加一个菜单项CheckMenuItem复选或撤消复选指定的菜单条目CheckMenuRadioItem指定一个菜单条目被复选成 34 单选 34 项目CreateMenu创建新菜单CreatePopupM
  • 视觉slam闭环检测之-DBoW2 -视觉词袋构建

    视觉slam闭环检测之 DBoW2 视觉词袋构建 利用 BoVW 表示图像 xff0c 将图像进行结构化描述 BoVW思想是将图像特征整合成视觉单词 xff0c 将图像特征空间转化成离散的视觉字典 将新的图像特征映射到视觉字典中最近邻视觉字
  • Boosting算法简介

    一 Boosting算法的发展历史 Boosting算法是一种把若干个分类器整合为一个分类器的方法 xff0c 在boosting算法产生之前 xff0c 还出现过两种比较重要的将多个分类器整合为一个分类器的方法 xff0c 即boostr
  • 关于嵌入式的学习和职业发展

    最近我的工作太忙了 身边朋友问我如何学习嵌入式 xff0c 在这个行业健康的发展 我一直未能做一个系统的回答 这里我想写篇文章 xff0c 彻底的回答这个问题 嵌入式 xff0c 这是个术语 在我看来 xff0c 嵌入式系统是 xff1a
  • Docker Hub + Github 自动化构建docker镜像

    自动创建 xff08 Automated Builds xff09 功能对于需要经常升级镜像内程序来说 xff0c 十分方便 有时候 xff0c 用户创建了镜像 xff0c 安装了某个软件 xff0c 如果软件发布新版本则需要手动更新镜像
  • ubuntu下旋转屏幕

    2019独角兽企业重金招聘Python工程师标准 gt gt gt ubuntu下把屏幕竖起来的方法很简单 xff1a xrandr o left 向左旋转90度 xrandr o right 向右旋转90度 xrandr o invert
  • Java 如何实现线程间通信

    正常情况下 xff0c 每个子线程完成各自的任务就可以结束了 不过有的时候 xff0c 我们希望多个线程协同工作来完成某个任务 xff0c 这时就涉及到了线程间通信了 本文涉及到的知识点 xff1a thread join object w
  • rtmp拉流测试工具

    http www cutv com demo live test swf 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 微信PC客户端无法发送图片,怎么解决?

    今天登陆电脑的微信客户端 xff0c 无法发送截图图片 xff0c 该怎么办 xff1f 解决方法 1 在任务栏找到程序 xff0c 右键找到设置 2 找到通用设置下的清除聊天记录 3 重启Pc微信客户端就可以 PS 本人测试过 xff0c
  • sql server 索引总结一

    一 存储结构 在SQL Server中 xff0c 有许多不同的可用排列规则选项 二进制 xff1a 按字符的数字表示形式排序 ASCII码中 xff0c 用数字32表示空格 xff0c 用68表示字母 34 D 34 因为所有内容都表示为
  • CSS 为什么这么难学?

    最近半年 xff0c 我一直都没在知乎上遇到好的前端问题 xff0c 而这个问题 xff0c 问到我心坎上了 在过去一年的教学过程中 xff0c 不断有学生尝试理性地理解 CSS xff0c 都以失败告终 我告诉他们 CSS 是没有逻辑可言