我们都会在代码中犯错。这是不可避免的!我知道如果我在办公桌上挂着一个“上次犯错至今的天数”牌子,一个大大的鸭蛋会一直悬挂在我头顶。也不一定是大错误。我笨拙的自己犯过各种小错误,从拼写错误到完整的 npm 模块目录,应有尽有。
哎哟喂。
这就是我非常喜欢 CSS 的原因之一:它非常宽容。如果它不理解拼写错误,它会继续向上查找级联,直到找到匹配项。没有那种一个字符错位就会破坏整个网站并毫不留情地吞噬所有东西的情况。但 CSS 错误出现时还是会让人尴尬的!
就像这个错误,我发现自己比我想承认的次数还要多地犯了它
.element {
display: flexbox; /* 🤦♂️ */
}
或者当我尝试设置渐变却没有使用 background
属性时
.gradient {
linear-gradient(45deg, rgb(50% 100% 90%), rgb(62% 85% 93%));
}
我讨厌键盘上 X 和 C 的距离如此之近,因为我无法计算自己有多少次在快速操作时将 px
误写为 pc
单位。
.element {
font-size: 16pc; /* I meant pixels! */
}
我经常遇到的另一个 CSS 错误,也是我知道许多其他人会犯的错误,因为我在博客文章的代码片段中经常看到它
// This is not a CSS comment.
.element {
/* This is a CSS comment. */
}
你有没有忘记在 CSS 变量周围使用 var()
?我当然犯过。
.element {
color: --primary-color;
}
说到 CSS 变量,给它们命名很难(就像其他一切一样),我经常使用一些我命名的变量的错误版本!
:root {
--color-primary: #FF5722;
--color-secondary: #3E2723;
}
/* Much later on... */
.element {
color: var(--primary-color); /* 🙃 */
}
是的,我确实曾经复制过一段 CSS 代码,结果却发现花括号阻碍了它的正常工作
.element::before {
content: “”; /* Should be "" */
}
而且,是的,我花了很多时间才意识到花括号就是罪魁祸首。
看到最后那个,让我想起我有时会忘记在使用 ::before
或 ::after
时设置 content
属性。这又让我想起我曾经忘记在尝试偏移元素或更改其 z-index
之前设置元素的 position
属性。真的,这些事情确实会发生!
说这些错误很难
你有没有读完一篇分享一些神奇技巧的博客文章后,感到一些冒名顶替综合征?我认为这在很大程度上是因为博客文章通常会掩盖实现这些神奇技巧背后的真正工作和失败。作为一名以阅读这类文章为生的人,我可以告诉你,很多文章,如果不是绝大多数,都要经过多轮编辑,才能剔除掉可能令人尴尬的错误并将其润色。
即使是那些超级棒的文章,也要在获得所有哇哦和啊哈之前经历失败。
任何应用程序、网站、演示或你遇到的任何东西都是如此。它们第一次就完美无缺的可能性微乎其微。
但如果我要对你坦诚相待,我经常会被实现某件事所经历的旅程(包括所有瑕疵)所吸引(和感兴趣)。这段旅程让我们得以一窥像前端开发人员一样思考的感觉。这是真正(也是最有价值)的学习发生的地方。
而这一切只是为了引出我真正想问的问题……
你最愚蠢的 CSS 错误是什么?
来吧,我们都知道你犯过一些!让我们从中学到东西!
我认为我犯的最大错误,也是我经常犯的错误,就是将“local”误写为变量作用域的代码。第二糟糕的错误是将代码从一个地方复制到另一个地方,而我没有意识到这些变量名不同或在我使用它们时未声明!
我总是忍不住打
我第一次这样做的时候,花了很多时间才弄明白为什么它不起作用。;(
没错!这很容易犯错。就像一个规则集在一个属性内部,而这个属性又在另一个规则集内部一样——很容易直接跳到括号里。
我经常被本能地使用英语所困扰。
没错,我们写的很多代码都是用西方英语,我把它当作理所当然了!
我犯过很多次这样的错误,以至于我不得不写下类似这样的代码
简单
* {
border-box: box-sizing;
}
Geoff,一些错误可以通过好的语法高亮显示器来发现。你主要使用哪个文本编辑器?
一致的类名和变量名确实很困难。有人知道在 CSS 中有哪些工具可以帮助解决这个问题吗?
大家请记住,W3C 的 CSS 验证器是一个非常有用的工具。
完全同意。我确实使用过代码检查器、高亮显示器和 Emmet,但我肯定有时不会使用它们。它们确实有很大区别。
特别是对于颜色,我一直使用 https://chir.ag/projects/name-that-color/#6195ED
你输入一个十六进制值,它会给你一个人类可理解的颜色名称,这样你就不会出现“浅蓝色”,“更浅的蓝色”,“主要蓝色”,“次要蓝色”…… 这样的情况。
我觉得大部分错误都可以也应该由代码检查器发现。
就我个人而言,自从我开始使用 tailwind 以来,我犯的语法错误明显减少了。
本着这种精神,使用某种样式作用域并在隔离环境中开发组件(例如使用 storybook)非常有帮助。这样,错误的影响范围会更窄,更容易发现。
不是
应该是
我本来想说我瞄准目标类别的父元素的第一个子元素的次数太多了。
我现在感觉被理解了!
我经常在快速打字时将
translate
、transition
和transform
混淆,导致我的样式表中出现这样的情况或者
我也会这样!
我经常把
margin
拼错。marign
或者magrin
。这就是我热爱 Emmet 快捷方式的原因。例如,我现在输入“m0”然后按 TAB 键,再也不会出现拼写错误了 :)
margarine: 0;
我不得不承认,我一直都在和“background”这个词作斗争,因为我写了数十行 CSS 代码才检查结果。你可能猜到了,浏览器无法理解“backgorund”的意思……
.a:before{content:''}
.b:after{
/* 使用除 content:'' 之外的所有调试规则 */
}
我绝对和你一样,也经常遇到 pc/px 的问题,还有注释的语法。
另外,我放弃了尝试记住 box(margin、padding、border、box-shadow 等)速记的语法;我永远记不住第一个值是从顶部开始还是从右侧开始,然后如果我想缩短它到 2 或 3 个值,我就彻底完蛋了!哈哈
您可以使用
TRouBLe
记忆法……右上角左下角提示:大多数这些错误可以通过对您的 CSS 进行 linting 来发现:https://stylelint.node.org.cn/
我也喜欢在我的编辑器中使用 Emmet。这样,我只需要输入
d:f
,它就会扩展到display: flex
,这将防止出现display: flexbox
错误。您甚至不必输入冒号。“
df
”就足够了我现在已经掌握了,但我一直想在
nowrap
中加连字符。15 年前我刚开始的时候,我总是会不小心搞错其中一个属性
我仍然试图在变换属性之间添加逗号
许多这些错误都是由于该语言的草率不一致造成的。
我尝试使用
url(var(--variable))
,但它不受支持。更糟糕的是,我在 React 元素的样式属性中使用了它,React 只是删除了该属性(也许是某种反 XSS 模式?)。花了我一个小时才弄明白发生了什么。我一直弄错的是
@font-face
语法。它很尴尬(src
和format
在同一个声明中),而且我经常拼错字体格式,例如,使用ttf
而不是truetype
。哦,还有在
backdrop
或transform
属性中添加逗号,例如而不是
天哪,在使用
@font-face
时,我总是需要打开一个参考,尤其是为了获得最广泛的浏览器支持。有太多文件类型和扩展名需要记住!好吧,忘记了 Safari 的具体情况。例如,将边框半径与轮廓混合(它不会使轮廓变圆)或 flexbox 中的图像(需要声明宽度和高度以避免拉伸)。
不记得
transform
和position:fixed
会创建一个新的堆叠上下文。我们可能可以专门写一篇关于堆叠上下文故障排除的文章。
知道我们这些“愚蠢”的错误并不孤单,真是太好了 :) 一旦您写好了,就需要很长时间才能发现错误所在。我使用 Nova(来自 Panic),它非常擅长发现无效代码,但有时我无法弄明白为什么它告诉我代码无效。
border-box: box-sizing;
li: {/* CSS here */}
display: flexbox;
全做过了
很久以前,出于我无法解释的原因,无论何时尝试定位元素,我的大脑都会卡住,并写下
position:relative;
top: left;
然后我会花几秒钟的时间思考为什么它没有用。幸运的是,这被未知药物治愈了
作为一个试图学习 CSS 的新手,对我以及像我一样的人来说,包含每个错误的正确版本会很有帮助
mth:child 和 margni
我写 CSS 已经很久了,但偶尔我还是会写这个,然后会困惑为什么它不起作用
display: absolute;
我经常会忘记
content:”;
在 ::before/::after 中(我会用一个冒号叛逆地拼写,因为虽然 CSS 不赞成这样做,但这让我 :P)。
我也发现自己写过
div:nth-child {}
上周不止一次。而且偶尔我会直接写
:nth-child {}
在“*”选择器中设置 font-size 属性是我早期网站上的一个巨大错误。嵌套标签会导致字体大小重置,
现在我在想,
var()
真的过分了吗?双减号表示法已经可以区分变量和值。所有这些var()
看起来只是污染表达式,尤其是在calc()
内部。为什么 W3C 会做出这样的决定?
在我意识到我决定早点结束一天后
总是将 nth-child 放置在父选择器上,而不是子选择器上……
例如 .parent:nth-child(2)
应该是 .child:nth-child(2)