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 为什么这么难学? 的相关文章

  • 如何更改 Material UI 版本 5 自动完成中的选项字体大小?

    我想更改下拉项目的字体大小 我尝试了不同的方法来改变字体大小 如下所示 如何更改 Material UI 自动完成字体大小 https stackoverflow com questions 62492939 how do i change
  • Chrome DevTools:计算样式与 css 规则不同?

    当我在 CSS 文件中定义 4px 时 我的 DOM 元素的 border top width 怎么可能是 0px 当我使用 Chrome DevTools 检查元素时 我发现计算的样式告诉 0px 而最上面的 css 规则是 4px 而且
  • 如何使用 Cypress 定位没有 id 属性的嵌套输入?

    我正在为 React 项目编写 Cypress 测试 我需要能够瞄准
  • jQuery animate() 和 CSS calc()

    我尝试设置CSScalc 使用 jQuery 动画 例如 element animate height calc 100 30px 500 我注意到calc 不支持 jQuery 动画 我希望有一种方法可以做到这一点 我不想要类似的方法 替
  • jquery覆盖加载栏div

    所以我有一个数据表 并且我正在使用 ajax 获取数据 当检索数据时 表中的数据消失并出现一个小的加载圆圈 我希望数据保留 我知道如何做到这一点 并且加载圆圈出现在表格的中心 不一定是垂直的 至少是水平的 以及稍微透明的背景阻挡稍微超出表格
  • 当鼠标悬停在链接上时,如何在链接旁边创建弹出框?

    这是我想要实现的 我的网页上显示了两个超链接 a href http foo com foo a a href http bar com bar a 我还有两个对 div 链接的描述 div foo means foo div div ba
  • 导航栏折叠在 Bootstrap 中不起作用

    Bhanu pratap 解决了这个问题 在这个问题的末尾检查一下 我一直在遵循旧的路线来构建导航栏折叠 三明治 问题是课程中的页面顶部似乎有一个黑条 并且缩小页面时会出现导航栏 对我来说 我只需在左侧找到一个按钮 另外 当我缩小页面时 我
  • 如何仅使用CSS设置某个角的边框半径

    如上所示 我可以只给顶部部分而不给底部提供半径 或者有时给底部而不是顶部提供半径吗 有没有办法只给一个角提供边界半径 Like border radius top left top right bottom right bottom lef
  • 使用本机 JavaScript 获取过渡中的 CSS 值

    这个问题之前被问过 但答案使用了 jQuery here https stackoverflow com q 8920934 3186555 因此 我将调整问题以专门询问native解决方案 to 最小化依赖关系 假设您有一个 div 然后
  • 将 Div 放置在另一个 DIV 下方

    我有两个 DIV 元素 其中之一具有绝对位置 主 DIV 的左下角 第二个 DIV 是隐藏的 只有单击链接才能显示 我需要第二个出现在第一个下方 但由于第一个 div 的位置是绝对的 第二个 div 出现在第一个 div 之上 HTML 代
  • javascript:window.print() 打印 2 页,而我有 1 页

    我有一个简单的 HTML 文档 其中仅包含图像标签 我想在文档加载后打印图像 我的代码 img src form1 jpg alt form1 style margin 0 auto display block 它可以工作 但问题是它打印图
  • 理解 z-index:该元素如何出现在其父级同级元素的前面?

    为什么当我删除时红色 div 位于绿色 div 前面z index from wrapperRed 感觉像z index是沿着链条向上继承的 如果我改变z index将绿色 div 更改为 6 即使删除第一句中描述的行后 它仍保留在红色 d
  • html 电子邮件内的背景图像 css - Gmail 不支持

    我想向我的用户发送如下所示的带有背景图像 css 的 html 正文电子邮件 div style width 500px height 1000px background color black background image none
  • 浮动图像周围具有最小列宽的流动文本

    我想要一种方法来防止流动文本列变得太窄 例如 在一列 HTML 文本中 有一个图像浮动到左侧 正如预期的那样 文本沿着图像周围的列的右侧向下流动 但是 如果图像几乎与列一样宽 则文本最终会非常窄 在这种情况下 我希望文本简单地not流过图像
  • 如何在其他div id的悬停中使用div显示块

    如何打开div悬停时标记href tag 这是我在悬停 href 标签上显示 div 标签的代码 Services is id of href tag Services is id of div tag Service hover Serv
  • 滚动时的 CSS 背景模糊

    我有固定的背景图像 滚动时我希望图像变得模糊 我知道如何在 css 中进行模糊 但在特定的滚动位置进行 这是一个例子 https medium com good music f160ba9e6c52 https medium com goo
  • 合并 2 个大型 CSS 文件的有效方法

    我正在寻找一个可以合并 2 个大型 CSS 文件的工具 到目前为止我尝试过的所有方法 例如CSSMerge 都没有成功 其中一些只是随机删除属性 其他人则因 webkit 和 moz 等非标准属性而窒息 并给我错误 我还需要保留每条规则大小
  • 使用 CSS 的响应式图像

    我发现调整图像大小以使其具有响应能力很棘手 我正在开发一个 php 应用程序来自动将网站转换为响应式版本 我有点被图像困住了 我已经成功地为网站上的每个图像添加了一个包装类 并且可以很好地调整图像的大小 我的问题在于自然小于窗口的图像 例如
  • 使用javascript动态更新css内容

    需要将 css 更新为动态值 我不确定最好的方法是什么 div style zoom 1 div 缩放级别将根据窗口大小调整触发 应用程序将相应缩放 我将此应用程序加载到 cordova 中并让它在 iPAD 中运行 然后我意识到需要使用
  • Webpack 4:如何使用 LESS 获取 CSS 源映射?

    多年来我一直在尝试让 CSS 源映射在 webpack 中工作 但没有成功 我不确定链条中哪里出了问题 我希望有人能指出我正确的方向 这是发生的事情 行号是错误的 实际上文件名也是错误的 main less只是包含一堆 import也就是说

随机推荐

  • 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 是没有逻辑可言