这最近成为了一个热门话题。它在我最近参加的一些会议和聚会上被讨论过。我看到了关于它的幻灯片。我知道有些人根本没有在生产中使用任何 CSS。相当疯狂,对吧?
我认为我们可以在这里围着篝火坐下来,尽可能理性地谈论它,涵盖所有相关要点。
我们显然仍然需要样式
没有人说我们不需要样式。我们仍然需要对东西进行样式化,正在讨论的是我们如何以及在何处进行样式化。我刚参加了 BrooklynJS 的一个小组讨论,Jed Schmidt 说
CSS 最糟糕的地方是“层叠”和“样式表”
有什么人反对 CSS 吗?
这些是反对 CSS 的主要论点
- 一切都是全局的。 选择器与 DOM 中的所有内容匹配。您需要命名策略来对抗这种情况并保持效率(这些策略很难实施并且容易破坏)。
- CSS 会随着时间的推移而增长。 优秀的团队中的聪明人承认他们害怕自己的 CSS。您不能简单地删除东西,因为很难知道这样做是否绝对安全。因此,他们不会删除,他们只会添加。我看到了一张图表,它显示了五年内生产 CSS 的大小,尽管公司专注于性能,但大小却稳步增长。
- 您可以在编程语言中更动态地使用样式。 论点是这样的:“我们已经在用预处理器来增强 CSS 了,不如再进一步”。例如(如果您真的想让这个有争议性),您可以根据 User-Agent 字符串或模块的当前宽度来设置样式。
那么,CSS 的替代方案是什么?
替代方案是内联样式。因此,而不是
我们正在谈论
我还没有听说过有人争论说您应该将这些样式直接应用于您编写的 HTML。这个想法是您通过 JavaScript 将样式应用于元素。
React 推动了许多这样的想法
React 是一个 JavaScript 库,它帮助网站处理视图问题。它主要由 Facebook 开发,非常流行,并且正在获得动力。它拥有自己的会议,甚至发展成为一个用于构建原生应用程序的框架。
它的核心概念之一是“虚拟 DOM”。您直接在 JavaScript 中构建您打算使用的 HTML。乍一看似乎很奇怪,但这种 HTML 和 JavaScript 之间的耦合一直存在,它吸引人们从一开始就将它们一起编写。我最近引用了 Keith J Grant 的话,我再次引用了它
这种耦合是真实的,而且是不可避免的。我们必须将事件监听器绑定到页面上的元素。我们必须从 JavaScript 中更新页面上的元素。我们的代码必须与 DOM 元素进行双向实时交互。
… React 的口号是停止假装 DOM 和控制它的 JavaScript 是独立的关注点。
React 具有内置的管理内联样式的功能。他们称之为它们本来面目:内联样式。以下是一个基本示例
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的 React 的内联样式。
React 使用的虚拟 DOM 也很重要,因为它速度很快。DOM 操作通常被认为在 JavaScript 中很慢,因此通过 DOM 操作管理样式也会很慢。但 React 有魔法粉尘让操作速度变快,因此人们在使用 React 时无需担心速度问题。
Chris Nager 编写的另一个示例。
样式创作仍然是抽象的
CSS 是将样式从其他任何东西中抽象出来。实际上是您打开并处理以管理样式的文件。在迁移到基于 JavaScript 的内联样式设置时,您可能不会放弃它。您可能只是使用 style.js
而不是 style.css
。您仍然会编写键值对,并在构建过程中将文件合并在一起。
它会有所不同,但创作抽象仍然存在。
内联样式有什么好处?
层叠更少
CSS 令人恐惧的“全局”特性被削弱了。层叠被削减了。我认为您不能说层叠完全消失了,因为某些样式是继承的,因此样式仍然可以传递到子元素,这是一种层叠的定义。但是,这种开发样式的模块化特性可能会导致样式冲突更少。这边的一个模块以这种方式进行样式化,那边的一个模块以那种方式进行样式化——可能不会出现冲突。
所有 JavaScript
我感觉到,有些人就是喜欢并更愿意使用所有 JavaScript。您当然可以将 Node.js 的部分成功归功于这一事实。
动态样式
“状态”在很大程度上是 JavaScript 的关注点。如果您希望/需要样式根据网站上的动态条件(状态)更改,那么将与状态更改相关的样式处理与其他所有内容一起处理可能是有意义的。
在最近在 CSS Conf 上的一次演讲(幻灯片)中,Colin Megill 使用 Twitter 新推文输入文本区域为例,它是一个动态位置,可以更改其他元素的状态。

谁在实际做这件事?
我听说 Colin Megill 说他们正在“大型项目”中完全不使用 CSS,并且没有发现性能问题。如果我拿到链接,我会更新这里。我听说一个大型项目将在一个月内上线。
我知道 Jed Schmidt 在 优衣库移动版 上工作,你可以看到内联样式在那里起作用。

Jed 的更新:这个版本的网站完全使用 Sass,你看到的内联样式来自于 JavaScript 动画。
Christopher Chedeau 一直在谈论这个,他实际上是 Facebook 的工程师,所以也许 Facebook 也在使用这种方式?
这个概念可以与你知道的 CSS 结合吗?
即使你接受了内联样式的概念,它也能与一些(我必须说出来吗)普通的 CSS 和谐共处吗?页面布局是否适合作为内联样式?基础排版还是有必要全局设置吗?我不确定我们是否已经足够了解这个世界,能看到最佳实践的出现。
在上面 m.uniqlo.com 的示例中,他们也发布了一个 57k 的 CSS 文件,你也可以看到 DOM 中存在基于状态的类(例如 "is-open")。
很多人真的不喜欢这样。
令人惊讶的是!反对这种方法的人比支持的人更多。当我收集关于这个想法的意见时,我对 Lea Verou 说:“有些人真的很喜欢这个想法!”她回答说:
世界上总会有人喜欢吃粪便,但这并不意味着这是一个好主意。
让我们来讨论其他论点。
样式是 CSS 的作用。
这是一个“宗教”角度,可能不会让我们走得太远。
关注点分离是 CSS 的固有特性。
关注点分离是一个非常有用的概念,在构建像网站这样复杂的项目时,它可以使代码更清晰。当你编写 CSS 时,你会自动获得关注点分离:它只是一个用于样式的单独文件。
内联样式在特异性等级中处于最高级。
在 CSS 中保持低特异性意味着,当你确实需要依靠特异性来赢得一场样式战争时,你将拥有它作为工具。当你已经处于最高级时,你就没有这种回旋余地。
!important
声明仍然可以赢得一场针对内联样式的特定属性/值样式战争,但这是一个稍微不同的概念,也是一场更糟糕的战争。
一些简单状态在 CSS 中更容易实现。
如何在内联样式中实现 :hover/:focus/:active?你做不到。你只能模拟它们。那么媒体查询呢?
添加/删除类已经是处理状态变化的完美工具。
JavaScript 在元素上添加/删除/更改类方面非常擅长。而类是处理 CSS 状态的完美方式。
.is-open {
display: block;
}
此外,你可以更改父元素的状态(通过更改类),从而影响其中许多元素的状态。
.tweet-too-long {
.tweet-button {
opacity: 0.5;
}
.warning-message {
display: inline-block;
}
}
浏览器不是为了以这种方式处理样式而设计的。
例如,内联样式实际上是保存在 DOM 元素上的属性中的数据。DOM 权重是一个问题(它会导致浏览器速度变慢或崩溃)。这些样式信息不仅存储在 style 属性中,而且还以元素的 style 属性的形式在 DOM 中表示。这难道不是同一件事吗?还是说这有点像双重加权的样式?
在…之间是否存在速度差异?
var thing = document.getElementById("thing");
thing.style.width = "100px";
thing.style.height = "100px";
thing.style.backgroundColor = "red";
var thing2 = document.getElementById("thing-2");
thing2.setAttribute("style", "width: 100px; height: 100px; background-color: red;");
是否已经发现了跨浏览器最佳方法?如果这些方法流行起来,浏览器是否需要进化以不同的方式处理它们?
浏览器拥有 CSSOM 这样的概念。我们可以通过 JavaScript 以更智能的方式使用它,而不是使用内联样式?
CSS 的成功是因为它的简洁性。
CSS 很容易上手。很多人知道它。你可以雇用相关人员。它是可移植的。
一些“动态”样式问题可以通过普通的 CSS 解决。
- 有些演示包括测量宽度并从宽度中减去固定值。CSS 可以使用
calc()
完成此操作。 - 有些演示包括设置
font-size
或line-height
,这些值取决于浏览器宽度或高度。CSS 可以使用视窗单位完成此操作。在这种情况下使用 JavaScript 是过度设计。 - 有些演示在许多不同的元素上动态更改颜色。CSS 将能够使用原生变量完成此操作。
我们在 1996 年尝试过这个方法,当时它是一个糟糕的想法。
CSS 是可缓存的。
网络仍然是瓶颈。CSS 文件可以被缓存,这样网络就不再参与进来,速度非常快。
你仍然可以使用 React。
React 非常棒。以下是 David Khourshid 关于在 Sass 中为 React 组件编写样式的文章。Mark Dalgleish 不喜欢 CSS 的全局特性,并且正在开发将选择器本地化的概念。Glen Maddern 在 互操作 CSS 中对此进行了扩展。
难道现在没人关心渐进增强了吗?
这是一个更广泛的讨论,可能在这里不合适。因为网站(包括使用内联样式的基于 React 的网站)可以完全在服务器端渲染,这意味着它们可以在考虑渐进增强的基础上进行。虽然“可以”和“实际鼓励的”是不同的。
我做电子邮件。对我来说,这已经足够多的内联样式了。所以,不,谢谢。我会坚持使用 SCSS。
完全同意!
在 React 中,你实际上并不维护 HTML 中的 style 属性 - 它是由库的性质为你生成的。所以你仍然可以编写类似样式表的模块(在 JS 中)。
你实际上并没有将你的样式添加为内联样式,是吗? http://premailer.dialect.ca/
CSS 很容易。而且很快,就是这样。句号。
Javascript 不是。
Chris 需要将他的网站名称更改为“css.js tricks”吗?
我笑了。如果这是 Reddit,你会得到我的赞成票。
老实说,我之所以决定评论是因为这个问题。是的,Chris 会更改名称吗?
如果 CSS 在 HTML 中,页面文件大小会更大,下载时间更长……
如果浏览器禁用了 Javascript 该怎么办?
但是没有 CSS 文件需要下载,所以实际上它可能会加快页面速度,这取决于你重复样式的程度。
我一直都在想这个问题,我不知道为什么人们认为通过 JS 在页面中添加任何东西都是一个好主意。如果使用屏幕阅读器、NoScript 等的用户看不到你的网站,那么你就遇到了问题。
是的!但话说回来,整个事情也无法正常工作,对吧?
如果你使用的是使用 webview 的应用程序,在那里你知道 javascript 始终处于启用状态,并且此内容主要或完全离线使用存储的数据怎么办?
不,你不应该依赖 javascript 来渲染通过互联网加载的页面,但是今天 HTML + JS 用于比这多得多的用途。
如果禁用了 JavaScript,那么该用户的很多互联网内容就无法正常使用。在我看来,这是一个陈词滥调的论点。你上次关闭 JavaScript 是什么时候?
CSS 不在 HTML 中。它是在页面加载后通过 JavaScript 应用于 HTML 的。无论哪种方式,浏览器都必须下载样式。
@Kyle 我只会在关闭 JS 以确保我的网站对没有启用 JS 的用户正常工作时才会这样做。有几种不同类型的用户通常会禁用 JS
必须使用屏幕阅读器的残疾用户
认为禁用 JS 可以防止跟踪的隐私爱好者
我更关心残疾用户,而不是隐私爱好者,但网络需要无障碍。将所有内容通过 JS 放入网页中是无法访问的。
@Kyle @Zeke 你不必禁用 JS,它的缺失也会导致问题。几周前,我在家里的笔记本电脑上加载 hulu.com 时,我的连接断开了。Hulu 认为我禁用了 JavaScript,因为它没有加载。
是的,但如果他们看不到,那么它是什么样子并不重要。
为了回答你关于 JS 关闭的问题:你必须确保应用程序是同构 JS:然后对于每个页面请求,React 都将在 Node(服务器端)应用 CSS 样式。
@Zeke Y -
可能有人已经指出过这一点,但屏幕阅读器已经很长时间可以识别 javascript 了 - 所以我不相信很多残疾人仍然会关闭它。
为什么人们不谷歌一下这些东西……这基本上是我们的工作。
http://a11yproject.com/posts/myth-screen-readers-dont-use-javascript/
@RioBrewster 我不记得在哪里看到的,但我最近读到了一些东西,说大约 90% 的使用屏幕阅读器的用户没有启用 JS,即使他们可以使用 JS。
@Brad 关于
是的。但你忘了那些在关闭 JS 的情况下浏览的人
@Zeke Y
使用屏幕阅读器的用户不会关闭 JS。JS 的工作方式略有不同,在屏幕阅读器中,但同样,这并不意味着它被禁用了。所以请记住:JS 关闭/JS 禁用与使用屏幕阅读器的用户无关。这是一个很大的误解。
这里有一些数据
大约 98% 的所有使用屏幕阅读器的用户都启用了 JS。所以确保你的内容(包括你的 JS)是可访问的。
http://a11yproject.com/posts/myth-screen-readers-dont-use-javascript/
使用类似 Polymer 使用的方法 怎么样?你可以分别在不同的 CSS 文件中设置组件的样式,然后系统将它们添加到标题中,并具有组件的作用域。
我感谢你在这里保持中立的态度!
我期待着看到这些想法是如何发展的,但我目前肯定会继续使用“常规”CSS。
当我想到那些不懂 Javascript 的网页设计师时,我的右眼流下了眼泪。
他们失业了!问我怎么知道的。
Annie,Annie,Annie,我的笑声让我笑得喘不过气来。
这都是有趣的游戏,直到有人戳瞎了眼睛……每个“内联”样式变化的浏览器绘制/绘图怎么办?跨浏览器兼容性?当需要更改设计时,我是否需要重新部署整个应用程序?
感谢你对此事进行了一些阐述,Chris :)
所以,对于那些认为这是一个好主意的人,你们是如何处理媒体查询的?你们是像这样处理的吗?
(代码未经测试)
if (window.matchMedia(“(min-width: 400px)”).matches) {
/* 视窗宽度至少为 400 像素 */
} else {
/* 视窗宽度小于 400 像素 */
}
总结
返回一个新的 MediaQueryList 对象,表示指定媒体查询字符串的解析结果。
语法
mql = window.matchMedia(mediaQueryString)
其中 mediaQueryString 是一个字符串,表示要为其返回新的 MediaQueryList 对象的媒体查询。
请在此处了解更多信息 https://mdn.org.cn/en-US/docs/Web/API/Window/matchMedia
http://projects.formidablelabs.com/radium/
当我第一次看到React将HTML和JS结合在一起时,我认为这很疯狂,但在使用React后,它很有道理。我相信我们对将CSS结合在一起也会有同样的感受
我可能遗漏了什么,但维护和可扩展性怎么样?在我的项目中,如果我更改一个列表中元素的填充,我肯定希望所有列表都遵循
对此没有障碍。我认为误解是你编写了内联样式。你没有。你编写了对象而不是类,这些类是通过编程应用的。这不是问题。
这些人不明白自己在做什么……我不想成为一个刻薄的人(尽管我经常会给人这种印象),但这些人正在伤害他们的客户和优秀的的设计/前端开发人员;因为这只能被归类为完全的无知!
通过将CSS移到JS中,或者更糟糕的是HTML中,你将消除缓存CSS、重复使用类或将规则应用于多个选择器的任何潜在优势。在大型项目中,这种情况经常发生!
在HTML中使用一些CSS是可以的,也许你正在做原型设计,客户希望网站现在上线,所以它必须在这个糟糕的状态下发布;但你应该已经同意在下一个阶段将其移出DOM/JS。对于一个高流量的网站,它确实会对浪费的带宽总量产生连锁反应,并且在你将代码移动到其他关注区域时,你需要额外的工作来处理这个网站。
这不是非CSS,而是将CSS重新定位到一个没有意义的位置!将CSS放在JS中的论点可以通过更具体的选择器来克服,例如用于插件的选择器,如滑块、nice-scroll(在此处插入额外内容),以及核心主题或网站特定CSS的MVS(最小可行选择器)。
我们明白了,对于有些人来说,现在从Envato购买所有东西,然后当他们必须付钱给专业人士“修改东西,做他们想做的事情”时,就哭得像个孩子一样;但作为专业人士,我们的工作是指出,每一个决定都伴随着成本(技术债务),有时,最好不要修改一个15美元的插件,而是重新解决问题。
除了上面提到的内容,以及JS注入的明显问题;如果你没有JS,它们就会变成Foo-barred。即使他们有JS,JS文件现在也包含了表示代码,你必须查看另一个文件或多个文件,才能开发一个将CSS移入和移出JS的过程,或者接受一个可能不太了解JS的开发人员的CSS样式技能的限制;以及处理你必须进行逆向改造的额外代码所需的额外机器容量。
Chris,打这些人的脸(当然不要真的打),他们正在扼杀网络!作为一种替代方案,仅仅在JS中修改CSS类总是比直接注入CSS更好,遇到类冲突时,在SASS中将其扩展到一个重命名的类中,然后更新你的JS!
巨大地跳跃到“扼杀网络”,并且不想表现得刻薄,同时专门说刻薄的话……你提出的一些观点是有效的,而另一些观点至少看起来是来自对概念的误解。
CSS != 样式。向元素添加一个样式标签,并且该样式被继承到子元素,这不足以赋予它与CSS相同的含义。
膨胀你的带宽使用量是可能的,但在实际生产中,CSS本身就是造成这种情况的原因。例如,“遇到类冲突时,在SASS中将其扩展到一个重命名的类中,然后更新你的JS!”
将样式与DOM分离很棒,但这种分离必须是语言、位置、请求和生产周期吗?
关于缓存,javascript是缓存的,危机解除。
一个“可能不太了解JS的开发人员的CSS样式技能”等于一个“可能不太了解CSS的开发人员的CSS样式技能”,或者任何其他可能不太了解的人。我认为,与可能更有能力的人的技能相比,处理他们的技能更难,因为他们以我们不理解的方式让事情正常运行,而不是无法找到他们的错误在哪里。
我认为使用编程语言来将样式提供给DOM是一个展望。它在这里的实现方式可能不是最好的,但这个概念值得深思。我们已经使用了许多工具来尝试将这种功能塞进我们的CSS中。
我确实同意,这离我们想要为受众呈现完美交互的愿望还差得很远。此外,尝试在JS中复制CSS类并假设JS在运行,我认为我们正在增加一套新的复杂性。现在还不能发挥作用。
你错过了重点。零CSS > 缓存CSS。如果构建CSS的JS被缓存了,你就会得到同样的效果,甚至更好(更加动态)。
顺便说一下,对多个元素进行样式设置是完全可行的,并且比常规CSS更强大。它只是以不同的方式实现。你不用将规则应用于类/ID,而是创建对象并赋予这些对象属性。然后,这些对象属性被注入到与它们关联的任何DOM元素中。这真的很简单,并且提供了否则无法获得的许多功能(至少不方便),例如:在对象之间共享属性,以及创建复杂的条件。
注意:我和Chris一样,对这件事持观望态度。
模块化CSS已经可以通过SASS与有效的命名空间(SMACSS)相结合来实现,这有助于减少膨胀。跟踪项目中样式的使用位置有时仍然很困难。期待看到模块化加载的CSS在Web组件中(如上面提到的polymer)。
我记得你曾在与Nick Pettit一起做Shop Talk Show的播客时,一位听众问过,前端开发正在向JavaScript方面发展,我是否应该放弃HTML/CSS转而只使用JS?= 前端开发。只有你说了HTML/CSS是为了它们的功能而存在的,而且它们也在不断进步,没有必要仅仅因为你想成为一个“JS程序员”或其他什么,而把简单的事情复杂化。你现在为什么改变主意了?
我认为我们对CSS作为一门语言所面临的许多问题,已经通过Sass解决了。我认为全球化是一个巨大的问题,但在我们转向像Web组件这样的东西之前,我无法看到内联样式或JS会接管。我认为Web组件也会解决我们通过BEM定义事物时的hacky方式。老实说,内联样式很愚蠢。JS样式只是具有选择元素逻辑方式的内联样式。
错误。在运行时,Sass最终只能做CSS能够做的事情。
#Colin,这只是部分错误。
零CSS与构建过程一样重要,甚至比运行时更重要。
难点在于维护稳定、可靠、易于理解的样式,这与源代码(无论你使用的是什么语言/工具/库/方法)有关。
就其价值而言,我正在开发一个中等规模的React应用程序,我们使用内联样式和传统CSS的组合——我们有很多动态的SVG图表,几乎都是内联样式,但应用程序中更多“文档式”的部分则在样式表中。使用伪选择器和媒体查询的难度使纯内联样式变得不切实际,但我认为这些问题并非天生不可解决。
在样式表方面,CSS模块在解决意外样式冲突方面提供了很大的帮助。
我们在混合方法中遇到的最常见问题是,有很多地方我们希望在CSS样式和内联样式中都使用相同的变量,而我还没有找到一个好的解决方案。也许有一种方法可以创建一个包含品牌颜色等的JSON文件,将其渲染到SASS变量中,并导入到应用程序中?
请记住,最佳实践不是柏拉图式的理想,它们只是在特定时间点的最佳方法。“最佳实践”曾经涉及为Netscape和Internet Explorer创建不同的网站,而CSS曾经是一个新兴的技术,坦率地说,它是做实际工作的一种不切实际的方法。最佳实践从字体标签和表格布局改变到我们今天所处的世界,而且没有什么能说明我们现在不处于另一个改变的边缘。保持开放的心态。
为什么需要JSON来保存你的品牌颜色,当你可以直接在SASS中使用变量时?在我们的大型应用程序中,我们通常有一个品牌或变量文件,其中包含项目范围的变量。没有必要将这些内容放在外部数据文件中。
例如,我们在动态生成的图表中使用颜色尺度来创建热图。在某些地方,颜色用于 SVG 填充或描边;在其他地方,它们用于常规元素颜色或背景颜色。我们不能只为颜色尺度上的每种颜色创建一个单独的修饰符类,因为我们想要将颜色分配给不同的属性。我们可以使用 Sass 为颜色尺度上的每种颜色生成类,以满足每个组件对颜色的需求,但这会生成大量的 CSS。如果我们可以在生成图形时添加颜色,会更容易得多。
此外,仅使用 CSS 类进行样式设置仍然需要将您的 JS 与您的 CSS 耦合;您不是重复颜色值,而是重复类名。它增加了间接性,但没有有意义的抽象。
Chris,这里对双方原因进行了很好的分析。我文章中也错过了一些很好的观点。:)
我有幸参与过几个 React 应用的开发,其中页面几乎完全是由 React 组件树组成的。我的大多数样式都在 CommonJS 文件中定义,并使用 JSX
style={styles.whatever}
内联。将一个组件的所有内容放在一起非常方便,但是经典样式表中的简单 :psuedo 状态非常缺乏。最终我找到了一个折中的方案,即大多数交互式内容(包含大量状态)使用组件内联 CSS 处理,而“只读”内容(如通用布局和全局内容)则使用 SCSS 构建过程处理。
此外,Webpack 提供了一些方便的加载器,用于在 CommonJS 构建中直接包含 CSS(或要处理的 SCSS)。
虽然我还没有为生产环境开发过 React 项目,但我感觉我会得出相同的结论。我明白,将 CSS 与组件打包有很多很好的理由,但不能完全牺牲所有常见的 CSS 样式实践。
在我当前的项目中,我们还没有使用 Webpack,而是使用一个 Gulp 脚本,它执行了类似的功能。
我同意,将特定于组件的 UI 与组件打包在一起。这是一个非常棒的主意。这样你就不必为了获取一个组件的样式而加载整个 UI 库,例如 Bootstrap。但默认使用直接写在 JS 中的内联样式看起来像是一种权宜之计,在这个短视的过程中,大型项目所需的许多优秀的东西都丢失了。
很棒的文章,Chris。提到的观点比我过去在谈论 JS 全面统治表示层的趋势时所表达的要少得多狂热 。
应用开发人员和 CSS 总是意见不一致,哦对了,我记得 JSSS 太清楚了。
我和西雅图的一位 Facebook 开发人员谈论过这个话题,他把这种趋势称为“React.js 的激进派”。虽然这种开发方式和理念有很大的见解,我非常愿意接受,但在这个不成熟的框架中,没有任何证据表明我们需要把孩子和洗澡水一起倒掉。
哎呀,我们都相信 Rails 也会走向企业级规模……哎呦。
如果事情发展到这种地步,我将回到印刷设计行业。
我认为这反映了非常重要的东西。设计师在 Photoshop 和应用程序状态之间占据了一个位置。随着客户端应用程序越来越有状态,这个空间将会越来越小。
没错!程序员按照程序员的思维方式思考……会有一大堆被疏远的设计师!
在我看来,设计师应该做好设计师的事情,停止使用 Photoshop。当纯粹的 CSS 无法满足社区的需求时,组件和应用程序的样式化很久以前就成为了开发任务。
对于足够的线框细节,开发人员在为应用程序设置样式方面总是比设计师更快,并且可以确保标记和类在整个应用程序中保持一致。设计师不必关心应用程序中使用的命名空间和 CSS 约定,他们只需要关心它看起来怎么样。这样会容易得多,而且需要更少的来回沟通。
那么开发人员应该停止自称设计师!
我是一位从 90 年代初就开始学习代码的设计师。为什么?因为作为一名受过训练的设计师和艺术家,我被教导要理解我的材料和流程。就像理解印刷机的运作方式和油墨的重量,不同颜料的渗透和在底层绘画中的无用,或者 divs 和 CSS 如何使在 html 和 php 中的工作变得更容易一样,了解我们使用的工具是至关重要的。这是一个古老的艺术家术语,但我认为“对材料的忠实”应该适用于所有网络工作。无论如何,谷歌已经将设计师和程序员逼到了一个狭窄的角落,它不喜欢 javascript!
我很高兴这个话题被提出来讨论。无论你在话题的哪一边,都很难忽视 CSS 的缺点。希望像这样的讨论有助于改进这种语言。我认为响应式设计和在 JS 中管理元素状态的复杂性最终将成为这种技术的终结……但它确实解决了在我看来是 CSS 最大的弱点:作用域。
像 BEM 这样的约定可以帮助掩盖作用域问题,但它们很难强制执行,尤其是在经验不同的团队中。在我们获得 Web 组件(更具体地说,是 Shadow DOM)或一些希望能够快速获得关注的新技术之前,开发人员只能用不太理想的解决方案来解决 Web 支柱中的一个重大缺陷。
就我个人而言?我不觉得有什么问题。我认为对于 Web 应用,它可以成为一个非常有创意的解决方案,这些解决方案可能已经依赖于 JS,而不是普通的网站。但最终,这不是开发人员或 Web 期望的长期解决方案。
也许这就是答案!
http://dev.w3.org/csswg/css-scoping/#scope-atrule
使用规范的进步,CSS 作用域问题已得到彻底解决,这些规范构成了在 Web 上创建 Web 组件的能力。
如果你只有一把锤子,那么每个问题看起来都像钉子。
这正是我的想法。
使用合适的工具。学习编写更好的选择器(Marco 的 2 美分在他 10 美分的建议中)。对自己的代码负责。这一切背后的真正问题是,人们不愿放弃舒适的东西,而是试图扩展工具以包含新想法。对于所有已经存在的人来说,这就像争论 Photoshop 现在有太多与像素操作无关的功能,而 Illustrator 有太多与矢量绘图无关的功能。我们不必讨论其他 Adobe 应用,试图用尽可能少的工具实现一切的目标,实际上弊大于利。关于内联 css 的整个争论似乎是另一回事,但事实并非如此。让 javascript 做 javascript 的事,css 做 css 的事,html 做 html 的事。有很多工具可以检查正在使用的 css 和未使用的 css。有很多语法检查工具可用,等等,等等。我认为,我们更多“幕后”前端人员需要更多关于 UX/UI 的教育,而不是担心哪些工具将自动化我们的思维,减少我们的按键操作,或者我们应该使用四个空格还是四个制表符。没有改变的是内容的重要性以及用户在使用 Web 应用、访问网站、与自助机、博物馆展品等交互时的体验。除了手机上的 Web 应用和网站之外,还有很多其他的东西……问题是,人们似乎越来越关注如何构建东西,而不是将要体验什么。
说得很好。对于前端来说,UX 比 CSS 的位置更重要。此外,并非所有 HTML 和 CSS 开发人员都是足够全面的,能够像了解 JS 一样了解 JS。多年来,人们一直在争取将样式与功能分离,为什么我们要以糟糕的组织的名义再次将两者结合起来?
验证
品牌/联合品牌
可访问性
我经常看到一些开发者对标准一无所知,只是复制粘贴或照搬他们从别处看到的东西。如果有一个优秀的开发者,他们精通所有 Web 标准,能够确保所有代码的有效性,并且由他们创建初始的模式供其他人复制,那倒还好。但随着时间的推移,错误会开始潜入代码中,被复制和传播,导致更多错误,或者开发者会以不符合标准的方式组合组件,从而产生不符合标准的输出。通过将这些问题分开,你就可以更好地独立验证每个问题,以及在它们的不同变化中验证它们。
我不确定如何在 React 中管理品牌形象。我是否需要对按钮进行子类化,并为每个品牌按钮创建不同的子类,然后对应用程序中所有需要客户徽标或特定品牌颜色的组件做同样的事情?如果我有 1000 个客户,每个客户都想要一些细微的品牌差异,我宁愿使用 1000 个小型 CSS 文件,可以动态加载,而不是创建一个包含 1000 个应用程序组件库,这些库需要维护。因为我可以将这些 CSS 文件放到内容管理系统中,而我不确定是否可以对 React 组件或任何 JS 文件做同样的事情 - 这可能给了设计师/内容作者/品牌经理过多的控制权。
因此,我认为这种组合方法可能适用于小型专注的网站,这些网站的用户自定义功能非常有限。我认为这种方法的扩展性不好。例如,看看 Reactjs 诞生的 Facebook 的本质。它只有一个布局/品牌。它非常固定和僵化。用户可以过滤显示的内容,但不能过滤显示方式。因此,它始终是 3 列蓝色布局中的内容框。另一个方面是,对于 Facebook 来说,网站就是产品。因此,他们可以花很多钱来确保所有这些内容都定义良好。在其他公司,网站是通往真实产品或服务的网关,他们不会投入同等程度的细节或努力来确保它“正确”,最终他们会在后期的维护成本和客户的沮丧中付出代价。
这是我第一次发表评论,这篇文章引起了我的强烈共鸣,它迫使我从单纯的观察者转变为参与者。
如果他们需要 JS 来实现“样式”,我认为他们的设计有问题。如果他们将逻辑推演到最后,它应该回归到操作系统,所有其他系统都是如此。主题。
Android、Windows、Linux 等……都经历了这个过程,最终你需要能够从一个地方更改所有内容的外观和感觉。这难道不是 CSS 的最初意图吗?
人们把自己的应用程序搞得一团糟,并且多年来错误地管理自己的代码,这不是抛弃多年知识和经验的理由。
顺便说一句,我偶尔会使用内联样式,但在应用程序中只用于非常独特的用例,这些用例无关紧要或是一些边缘需求,或者在一般的 Web 设计中为了节省时间(例如,原型、对客户审查的实时网站进行调整等)。
答案:Web Components。
我靠着落后所有人一年,永远不在技术的前沿,看着浏览器发生变化,没有实现黑客方法(谁还记得星号黑客?),没有使用 polyfills(除非绝对必要),没有使用阴影直到它们得到支持(而不是使用一堆切片图像添加 4 个 div 容器)。
现在是这个。Shadow DOM、ECMAScript 6 模块、Web Components 将解决这些问题。
耐心点。这股疯狂的潮流,要小心。
我完全同意。我理解人们害怕删除未使用的 CSS,担心会影响其他东西,但那是因为很多时候人们写的 CSS 很糟糕。和世界上大多数事情一样,人们专注于尽快完成事情,而不是真正做好。
我们都努力将事物分离成内容、表现和行为。
现在是这个。接下来是什么,FONT 标签的回归?
再加上 Google 坚持认为我们一半的 CSS 现在应该分离出来并内联,我担心 Web 创作的未来将回到 15-20 年前的样子。
我怀疑这种方法的创始者像我们中的有些人一样在 90 年代使用过内联样式。这个想法对我来说听起来很糟糕。
我认为样式应该 bersifat deklaratif. 使用任何程序化方式进行样式设置会导致大量的错误修复工作,我认为 React 正在制造一个不存在的问题。
我现在不会改变世界,但人们真的应该付出额外的努力学习正确的 CSS 样式,而不是把问题归咎于它。
我确信 CSS 是一种需要进化的语言,但不是以这种方式。不是被 JavaScript 吞噬。
我不反对 JavaScript,实际上我非常喜欢它,但我也很喜欢 CSS,它们就像最好的朋友,几乎是恋人,每次部署新的网站或应用程序时,它们都会牵着手,为什么有人会想要破坏这种美好的关系呢。
最终,我们将把整个 html+css+copy 放到一个 js 文件中,然后需要为这个文件建立一个新的结构,你需要学习这些新东西,在某个时刻,有人会说“这太复杂了!”,然后我们将内容放到不同的 js 中,一个用于 css,一个用于 html,一个用于 copy,所有这些都是模块化和可移植的,就像以前一样,但更好,因为是 JavaScript,对吧?用 JavaScript 做所有事情就像……很酷。
JavaScript 很棒,React JS 真的很棒。我已经使用它将近一年了。但它永远不会取代 CSS。没有理由不使用样式表。只是要明智地使用它。我仅当我知道元素永远不会改变,或者只会通过 React 组件中的某些方法改变时,才使用 React 的样式对象。
首先 - 似曾相识。
其次 - 我在想,js 框架应该使用 grunt/gulp 或类似的模块将内联 css/js 与其组件分离,并在构建过程中创建文件。
推广开放标准怎么样?……Chris?……还有谁?……
你的酷乐酒回来了,React。
哦,忘了
https://www.pandastrike.com/posts/20150311-react-bad-idea
Web Components 可以解决这个问题。如果你等不及了,可以使用 Polymer。
JS;DR = 需要 JavaScript;没有读。
http://tantek.com/2015/069/t1/js-dr-javascript-required-dead
是的,我希望构建的页面仍然可以被认为是在没有 JS 的情况下渲染某些内容?
多年来,人们一直在告诉设计师,他们需要理解并编写逻辑的、最佳实践的 JS(同意);同样,开发人员理解并编写逻辑的、最佳实践的 CSS 难道不是一个好主意吗?
React 主要由 Facebook 开发 = 无需考虑 JS 或 CSS - 你有没有看过 FB 使用的标记?语义发生了什么?为什么应用程序在可访问性和渐进增强方面可以免责?
如果模块特定的规则是用 JS 编写的,并在发送到客户端之前在服务器端应用为类名,那么对于用户来说没有任何区别;但如果你使用这些方法在单个元素上注入内联样式,那就是疯狂。
对 CSS 感到困惑?阅读更多 Chris Coyier 的内容,或者访问 Harry Roberts 的网站 (http://csswizardry.com/)。批评 CSS 并不是什么新鲜事;人们多年来一直在抱怨它。同样,Douglas Crockford 写了“JavaScript:精华部分”,因为这门语言中的很多部分都很糟糕。
Web 开发的各个方面都有其优缺点;首先学习如何使用标准,然后学习工具和框架如何提供帮助。至少,要学习足够多的知识,以便在不知道足够多的知识时,可以向知道的人寻求帮助。
仅仅因为你可以做某件事,并不意味着你应该做。CSS 刚刚开始走向真正标准化的道路。也许有一天,浏览器甚至会在标准上达成一致。
Chris,我们真的需要一个 CSS-Tricks 评论投票系统。在这些类型的文章中,阅读最受欢迎的评论很有意思。
还有 Web Components 解决了你提到的所有问题。冲冲冲,Polymer https://www.polymer-project.org/1.0/
糟糕的框架会助长不良习惯,就像好的框架会助长良好的习惯一样。这是用错误的解决方案来解决一个真正的问题。Shadow DOM 和 CSS 范围更接近正确方向,尽管它们不向后兼容。
完全同意。我已经想出了一些方法来处理最小化全局污染和冲突。希望对这里其他人有用。
我一直在做的东西为当前的预处理器策略和未来的 Web 组件封装之间架起了一座桥梁。
显然,medium.com 的链接存在某种 iframe 嵌入机制。最后尝试。
语义重映射文章
嗨,克里斯,
我很惊讶你在这篇文章中没有提到 原子 CSS 或 ACSS,因为我认为它架起了“经典 CSS”和“CSS in JS”之间的桥梁。
例如,我认为它解决了你在开头列出的问题
一切都全局化
CSS 随着时间的推移而增长
你可以在编程语言中更动态地使用样式
你说另一种方式是内联样式,但“内联样式”也可以通过 class 属性来实现。它是这样的(伪代码)
<div class="padding-20px background-eee margin-0 marginBottom-20px">
而不是这样
<div style="padding: 20px; background: #eee; margin: 0 0 20px 0;">
与“通过
@style
实现的内联样式”不同,值可以被丑化,因此与“通过@style
实现的内联样式”相比,它具有更小的占位符。此外,关联的样式表被**缓存**,它**无法**像你给出的 m.uniqlo.com 示例 (57k
) 那样变得那么大,同时仍然允许“DOM 中基于状态的类”。很多人不喜欢 ACSS,但这主要是因为它的语法,因为它似乎避免了你列出的关于“通过
@style
进行样式化”的陷阱。样式化是 CSS 的作用
原子 CSS **就是** CSS
内联样式在特异性谱的顶端
原子 CSS 依赖于简单的类,因此具有低特异性 (
0,0,1,0
) - (原子 CSS 与内联样式有什么不同?).一些简单状态在 CSS 中更容易实现
原子 CSS **就是** CSS(参见伪类)
添加/删除类已经是状态变化的完美工具
是的!
浏览器不是为以这种方式处理样式而设计的
是的!
一些“动态”样式问题可以用常规 CSS 解决
是的!
CSS 是可缓存的
是的!
你仍然可以使用 React
是的!
难道没有人再关心渐进增强吗?
依赖于内联样式 (
@style
) 的文档可以“完全在服务器端渲染”,但这意味着将所有内联样式发送到网络,这相当“昂贵”(而且这些样式都没有被缓存)。我没有列出“关注点的分离是 CSS 的固有特性”,因为我相信对于那些以与我们几年前不同的方式编写文档的人来说,这是一个无关紧要的观点。
我的 0.02 美分
如果我考虑我目前的工作,继承工作怎么办?Sass / Less / 等的优点是继承或模块化开发。我对 React 不太了解,但它看起来不像维护代码长期来说更容易。OOCSS、BEM 已经是维护 CSS 的好方法(恕我直言)——> 也许更多的(无聊的)约定比在 JS 中做所有事情要好。
这让我很困惑,没有 CSS,有些人说将来没有 JavaScript http://techcrunch.com/2015/06/17/google-microsoft-mozilla-and-others-team-up-to-launch-webassembly-a-new-binary-format-for-the-web/,那怎么办?
恕我直言,这是错误的问题。
最常被回避的问题是“什么应该取代 CSS”。
(style=”~” 仍然是 CSS,仅仅将 CSS 放在模块中并不能解决任何问题,完全解耦设计与解耦部件代码不同)
CSS 在 21 年前是一个好的设计,但它实际上并没有为未来扩展。恕我直言 ;-) CSS 已经过时且糟糕,我们不断向其中添加更多功能,使其更像 SVG,SVG 远优于 CSS,但出于某种原因被故意设计成不完整。如果我不得不猜测,我会说因为大公司有应用要出售(字里行间的意思)……但这无关紧要。
为什么我们对这种级联的、限制性的、不真实语言如此安于现状,它在 21 年后才引入变量。
如果我们继续 5 年不寻求摆脱可怕的盒模型的解决方案,我们怎么能说我们认真对待网页设计呢?(弹性盒模型不是解决方案)
为什么我们不谈论这个问题?
最后说明:(我认为我们需要停止将渐进增强与服务器端渲染联系在一起,它们完全无关)
也许我会显得有点强硬……但如果你害怕 CSS 的全局特性,或者害怕管理代码以避免破坏东西,那么你可能没有写好 CSS。特别是在如今我们拥有 SASS 和 Grunt(或任何其他你喜欢的预处理器/任务管理器)来帮助我们编写模块化 CSS 并轻松编译它们的情况下。
也许我遗漏了什么,但对我来说,放弃整个 CSS 结构并用非可重用的声明替换它,这些声明是通过 JS 应用的,这太激进了……
在 React(或 JavaScript)中,它们是可重用的。把它想象成 Sass 混合,它们有一个单一的源代码点,代码可以在任何地方注入,并且可以注入任意次数。
人们对 DRY 代码的真正含义感到困惑。编译后的结果是否 DRY 并不重要,重要的是你的源代码点,所以就像一个混合一样,你的 JS 样式对象有一个单一的源代码点。
这永远无法取代 CSS,我喜欢编写模块化 CSS。但是 React 中的 CSS 在我们想要用只在该组件内生效的样式封装组件时非常有用。这意味着特定组件可以在整个项目中甚至不同项目中共享,而无需担心出现问题。
内联样式不好的争论源于它们不是由 JavaScript 创建的,并且没有单一的源代码点,维护带有大量内联样式的模板是一场噩梦。React 不是这样。特异性方面存在一些问题,在这些情况下不要用 React 来处理这些样式。
-它应该在需要时谨慎使用,而不是作为 CSS 的替代品。
打印样式怎么办?
当你打印页面时,浏览器获取的是内联样式,而不是专门的 CSS!
哈哈,我以前在预处理是“大事件”的时候就谈过这个
当时没有人听我的 :D
但我真的很喜欢这个想法,我认为它会开启许多新的可能性。样式甚至可以被更压缩地发送到客户端
我很喜欢这个!
我非常喜欢内联样式的方法。ReactJS 确实是一种激进的改变,但它是针对 CSS 模块化问题的真正答案。它是一个真正有效且可以立即使用的答案。
当然,最佳实践 CSS 可以是模块化的,但仍然让人沮丧的是,一个组件的代码分散在(通常是)3 个不同的文件中:HTML 模板、CSS 和 JavaScript。
样式由应用程序状态驱动。操作、错误、验证等。应用程序状态位于 JavaScript 中。耦合是真实的!
我仍然使用样式表,但仅用于真正“全局”的内容,例如宽布局和字体。我觉得这种方法效率很高。:)
工程师们又一次为一个“无问题”创建了一个复杂的解决方案。
“优秀的团队中的聪明人承认他们害怕自己的 CSS。”
令我惊讶的是,那些创建如此复杂解决方法的工程师不明白 CSS 自上而下的简单性质。
SASS + SMACSS = 正确的方法。
^ 全部赞同。
赞同。
因此,反对 CSS 的所有观点都是无效的,它们仅仅反映了不良实践,这不是借口。
一切都全局化。
使用命名空间很容易解决,我甚至不知道为什么人们会对此感到困扰。
CSS 随着时间的推移而增长。
是的,如果产品增长,所有代码都会发生这种情况,你是否将 JavaScript 内联到 DOM 中,因为你无法弄清楚如何处理多个 .js 文件?我不这么认为。使用 LESS 或 SCSS 的基本方法可以解决这个问题(当然,它们不是原生 CSS 的一部分,但我严重怀疑你的 JS 流程也是原生的)。
你可以在编程语言中更动态地使用样式。
你想要表达的意思是你可以通过构建自己的实现来以某些方式使用 CSS,来确定何时应用 CSS,同时也会失去其他功能,因为 JavaScript 无法针对 CSS 的所有功能(使用 ::after 和 ::before 时祝你好运)。
我同意……我真的想看完这篇文章,但没有一个观点真正说明我们“不需要 CSS”。我可以大发雷霆,也可以大放厥词(相信我,读这篇文章的时候我已经开始很多次了),但问题的答案是“是的,我们仍然需要 CSS。显而易见。”
有时我读到关于这类问题的文章,我唯一的想法是:这些真的是问题吗?
我完全理解应用程序开发人员很难使用与应用程序框架不兼容的技术。但这并不意味着该技术有缺陷。实际上,这意味着它不适合某些思维方式。
我不想成为那些因为事物不同就将其驳斥的人,但这个想法听起来太疯狂了。
我同意,CSS 可能像文章开头描述的那样存在各种问题,但大多数问题只存在于编写代码不当的情况下。
用一堆新的问题取代一个“问题”。
问题不在于 CSS,而在于许多开发人员对它的理解和使用方式。让 HTML 定义结构,CSS 定义展示,JavaScript 定义交互。不要对 Atwood 定律太过教条。例如,焦点指示器、悬停、活动状态可以通过使用 CSS 伪类轻松实现,并且可以在监听相应事件时通过 JavaScript 应用内联样式。
我同意全局 CSS 有其缺点,但它也有其用途。在我们拥有原生组件生态系统(没有 React/Polymer)之前,全局 CSS 试图在整个应用程序中强制执行统一的外观。
Sass 本质上是 CSS 的编程语言。JavaScript 作为一种替代方案是一个显而易见的选择,尽管我们应该首先尝试开发一个 JavaScript 到 CSS 的编译器。
人们必须面对现实,他们希望能够测试他们的代码以确保正确性,而 CSS 目前还无法做到这一点,它将不断发展直到实现这一点。
我尊重许多在这里质疑 CSS 的开发人员,但我也在这场辩论中看到了许多对 CSS 的误解。
CSS 越来越复杂 [1] 是一方面,它促使人们使用框架和库;但我们的理解和(后期)优化 CSS [2] 的记录非常糟糕。看看即使 (!) 经过预处理器等处理,大多数样式表仍然有多么 WET。那是基本的 CSS,很少有人能正确使用它。
这场辩论往往缺乏对关注点分离的重要性理解。这又是另一段糟糕的记录:我们倾向于重做而不是迭代。当我们抛弃之前构建的所有内容时,我们并不关心如何优化、改进、构建它,我们只关心如何快速(并且不干净地)工作,而不是“宗教式”的分离是如何如此有用。(想想 web 开发的愿景 [3])。
还有更多内容,是的,但这场辩论很奇怪,现在在这里找不到启迪。
[1] http://meiert.com/en/blog/20150518/fing-up-standards/
[2] http://meiert.com/en/blog/20141009/css-dry-and-optimization/
[3] http://meiert.com/en/blog/20150513/vision-of-web-dev/
对于那些不理解(或不想理解)CSS 的人来说,CSS 就是他们的选择。我能想到一些我在职业生涯中遇到的开发人员,他们会非常喜欢它。
不,谢谢,我会坚持使用 CSS。
不要把 CSS 变成一项编程任务。
作为一名拥有 19 年专业网页设计/开发经验的人,我认为这是绝对最好的答案。说得好!
对我来说,CSS 有两个问题,而且这两个问题都与它的全局性质无关。
第一个问题是它实际上不是一个标准,因为所有浏览器都以不同的方式读取代码。令人沮丧的是,开发时间本可以用来构建更好的用户体验,却浪费在确保跨平台兼容性上(尤其是对于像 IE8-10 这样的旧浏览器)。你应该能够编写一次代码,使其在任何地方都能正常运行。旧浏览器应该自动下载渲染页面所需的代码。
第二个问题是 CSS 的发展速度缓慢,并且其优先级完全错误。例如,它已经存在了 1996 年,但我们仍然没有一种好的、标准化的方式来布局整个页面(例如,页眉、页脚、列)。CSS 网格将改变这一点,但奇怪的是,我们在布局网格之前获得了圆角。还有多种方式来实现常见的 UI 模式,例如菜单、手风琴和滑动面板。这些常见的 UI 元素应该都内置到 CSS 中,并且用一行代码渲染(例如 ul {ui: sliding-menu;})。
如果 CSS 不存在这两个问题,我相信它不会受到如此多的批评。
Web 组件提供了一种解决方案,但我认为它们要到很长时间后才能真正投入使用。
将 CSS 以内联形式输出非常混乱,难以维护,并且不推荐这样做。我在网页设计/开发领域工作了 20 多年,见识了不少,这种方式将在未来造成更多问题。我认为 CSS/SCSS 已经发展到了难以维护的地步。也许应该简化 CSS,但是,在所有浏览器都统一之前,我认为这种情况不会很快发生。
我个人认为这种 React 风格的开发非常适合 Web 应用程序,但非常不适合网页。而且,这两者的界线越来越模糊。当构建 Web 应用程序时,你会设计浏览器本身没有的逻辑和功能,并且所有工作都以 JavaScript 为中心,那么 React 是一个自然的选择。
然而,当你处理网页时,Keith Grant 的引言(以及一些评论者的回应)就显得荒谬了。叫我老派也罢,但任何网页都不应该需要 JavaScript。JavaScript 用于添加一些便利功能,简化交互,以及构建滑稽的直升机。如果你的页面在浏览器默认行为的范围内没有最基本的功能,那么你的工作还没有完成。
看起来我们在渐进增强、关注点分离、简单标记的战争中败下阵来。我们是否应该回到用表格设计布局的时代?
对我来说,这听起来更像是寻找一种万能的超级语言。我记得“你只需要 Java”的论点,然后出现了 applet、swing 和 awt,然后是 flex 和 air,再然后是 dart 和 go。我记得开发人员告诉我切换到 GWT,因为它会为你生成所有内容,你不再需要编写 JS。我们可以承认 CSS 确实有一些缺点,甚至 HTML 也有,并且找到一些解决方案,这些解决方案并不意味着完全抛弃这些概念,或者将它们埋藏在层层抽象中,这些抽象需要人们付出大量的认知负荷来追踪。React 和 JS 渲染样式无法解决许多问题,因此无法成为超级语言。但这并不意味着没有宝贵的收获。这意味着我们需要开始列出一些场景,并讨论如何在代码中解决它们,以及如何重塑标准以更好地适应。
Web 组件在这种情况下该如何融入?
很有趣,但我还是会坚持使用 CSS。另外,请纠正你的“it’s”和“its”,写错了。有些地方读起来很费劲!
所以 React 的开发者们说,JavaScript 比 CSS 差一些?
我不这么认为。
作为一名每隔四年左右就需要重新设计网站的人,我会将我的展示部分分开,谢谢。
等 Zeldman 听到这件事吧。
Chris 写了一篇好文章,很难说明人们为什么要朝着这个方向发展,以及最终提出的改变会是什么样子,但这篇文章很好地概括了这些问题。主要动机是更好地限定样式,并且它与 Web 组件密切相关。
Web 组件背后的理念是,你应该能够复用 HTML、CSS 和 JavaScript 的组合,而不会影响应用程序的其余部分。代码的邻近性在这里很重要,与同一个组件行为和状态相关的 HTML/CSS 和 JavaScript 应该尽可能地靠近在一起,因为这样更易于理解,更安全地进行更改,等等。
你最后关于渐进增强的说明
它仍然很重要,我们的工具会发展到我们可以轻松地做出正确选择的地步(从服务器发送 HTML,即使是对于富 Web 应用程序)。
对渐进增强的最大打击是,人们在没有 JavaScript 的情况下就放弃了应用程序。
“当你的 JavaScript 正在下载时,所有用户都禁用了 JavaScript”
这真是我最近读到的最荒谬的胡说八道。在编写网页代码近 20 年后,看到同样的陈词滥调在流传,我感到相当悲哀。但同时我也心存感激。那些用内联样式编码并试图用 JavaScript 替换 CSS 的“肉袋”们,可能会确保我在接下来的 10 年里继续拥有职业生涯,并可能为许多意识到他们应该在招聘人才时更加挑剔的客户带来快乐。
问题的关键是:如果你“不理解”CSS 或者无法编写 CSS 甚至不愿编写 CSS,那就让专业人士来做吧。
这太荒谬了。
这完全说不通。我们遇到的所有 CSS 问题,实际上都被 SASS 和 LESS 解决。React 的组件化允许任何人为每个组件使用专门的 SCSS 文件。天啊,我甚至会自己编写工具来生成它。
如果你有一个名为 Post 的 React 组件,你的 Grunt 或 Gulp 进程可以识别它。如果它是一个单一元素,它将在你的 SASS 文件中创建 #Post。如果它包含其他元素,它将在 #Post 定义中创建这些 CSS 元素。
如果有多个帖子,它将更改你的 SASS 文件,使其显示 #Posts > .Post 或类似的东西。在帖子中添加一个元素:你将在你的 SASS 文件中获得一个新的、令人愉悦的有序添加。删除或重命名一个元素?它将对你的 SASS 文件执行相同的操作。
然后,像 SCSS 和其他优化任务这样的东西可以从最终输出中删除不必要的 CSS。在优先考虑一些 CSS 文件而不是其他文件的情况下,你可以设置你的组件,使其具有 CSS 输出优先级或排序。
任何方法都比内联 CSS 好。天啊,那真是个糟糕的想法。接下来是什么?难道我们不再使用语义化,而是回到 div 汤?还有“哎呀,大多数布局都像表格一样。我们直接使用表格吧!”
这似乎是我听到过的最愚蠢的论点。不必费时费力地指出那么多理由。
听起来像是许多讨厌 CSS 的开发者,试图让这个想法听起来不错。简单来说,它行不通。
目前(2015 年年中),必须绝对归结为“你能保证最终用户可以使用 JavaScript 吗?”
如果你无法保证这一点,那么你应该构建确保所有数据都可以在没有 JavaScript 的情况下可用。
这几乎就像开发者不再关心 Web 标准一样。我们所有人为了统一 Web 并使其对每个人都可访问而努力的那些 Web 标准。
页面速度和代码维护怎么样,分离绝对更好!!!
虽然我喜欢 React 和内联样式的强大功能,但我认为它很脏。
此外,必须先学习 JavaScript 才能完全享受它。
你应该考虑的另一件事是 SEO 方面。克里斯提到了浏览器必须审查我们如何呈现内容,如果我们采用内联样式,但我们也必须担心搜索引擎如何阅读我们的“新”内容。
我现在还不准备使用内联样式。
同意!我简直不敢相信还没有人提到 JavaScript 的不可搜索性。老实说,我只能在不到 1% 的工作中使用这种技术。
我来自 C++ 游戏开发背景,我知道创建高度动态、样式良好的用户界面有多么困难。当我开始从事 Web 开发时,我惊喜地发现使用 CSS(现在是 Sass)创建复杂视觉效果有多么容易,以至于我考虑过使用 HTML 和 CSS 来渲染游戏界面。通过代码创建高度定制的视觉效果是一项非常困难的任务。
现在,这个想法可能非常适合高度模块化的应用程序风格网站。那种你可以直接用 Bootstrap 构建,根本不需要考虑 CSS 的网站。
但是,一旦你开始涉及到一些网站(而不是 Web 应用程序!)的深度创意、高度复杂的视觉效果,这个想法就完全失效了。
CSS 的一些感知问题并不一定是问题。
大多数人喜欢他们在网站上看到很多一致的样式。通常情况下,你想要相同的配色方案,一小部分(通常是 1 个,很少超过 2 或 3 个)标题、链接、按钮等的字体样式以及它们的不同状态。如果你需要更多,那么你需要考虑命名约定等等。
CSS 会随着时间的推移而增长。你能给我看看没有这种情况的代码吗?
人们在没有预处理器的情况下编写非常复杂的 CSS,使用它们并不是强制性的。如果你确实使用它们,你的大部分输入和输出本质上仍然是 CSS。大多数编写 CSS 的人都会了解相当多的 jQuery 来执行添加内联样式的必要任务,你知道吗,它仍然主要是 CSS,只是带了一些包装器,它会为你处理所有跨浏览器兼容性问题。如果你水平不错,你可以编写使其在禁用 JavaScript 的浏览器中“足够好地”工作,而这些浏览器仍然存在。
我恰好会编写不错的 JavaScript 代码,我编写 JavaScript 代码的时间比我学习 jQuery 的时间还长。如果你有一个 Web 应用程序,其中有数百万个不同样式的元素执行不同的操作并不断更改样式,我能理解为什么这种方法很吸引人。将“x 发生”的所有代码都放在同一个地方,这很不错:如果你正在编写游戏,并且一组漂亮的球会闪烁并消失,作为游戏开发者,你通常希望所有代码都放在那里,而不是抽象到一个包含球体外观的不同文件中。当然,如果你使用 MVC 模型编写代码,你就会采用不同的方法。但是,如果你正在为 CSS-Tricks 编写样式,你可能没有游戏中会消失的球体,对吧?
除非你的 Web 应用程序是全屏的,否则它可能仍然从 CSS 中获益,因为 CSS 可以用于周围的元素,除非你出于宗教原因必须不使用它们。
这并不是要让 CSS 消失。这也不是要手动编写内联样式。本质上,它实际上只是提出了一种选择获得样式的元素的替代方法。这对于一小部分项目来说是一个好主意。
我们已经就特定关注点的分离达成一致,但这并不意味着沿着不同关注点进行分离没有优点。如果我的应用程序中有一个组件,该组件具有明确定义的 HTML/CSS/JavaScript 代码,那么将所有这些代码放在一个地方将非常棒。
至于将 CSS 变成“编程”的担忧,CSS 结构松散的事实使某种工程纪律在大型项目中变得至关重要。这就是我们拥有 OOCSS、BEM、SMACSS、SUIT、InuitCSS、预处理器等等的原因。如果你只是在没有太多功能的小型网站上工作,CSS 非常简单。除此之外,它可能非常具有挑战性。
将 JavaScript 用于所有内容并非建议的最佳实践。但是,如果你正在为一个不受标准化工具支持的新想法制作原型,这将是一个很好的方法。也许下一个 Web 样式语言将会以这种方式被发现。
也许你应该看看 GSS - https://gridstylesheets.org。不过,我仍然更喜欢 CSS。
内联样式不支持伪元素 (
::before
,::after
)。伪选择器和媒体查询也是如此,但上面已经提到了它们。此外,我无法理解这种全 JS 方法如何不影响性能。DOM 必须在每次 DOM 变化时不断解析 CSS,而样式表只解析一次。在 ReactJS 的虚拟 DOM 承受很大压力(1000 多个元素)的情况下,让 DOM 也解析 CSS 肯定会影响性能。
但是,这如何与谷歌控制网站设计的做法相协调?谷歌会惩罚 JavaScript 的使用和内联样式。此外,内联样式还会导致模板更新出现问题。
当有人问我是否可以将所有样式写成内联样式时
所以,我们当然需要 CSS!
这条评论是在新的投票调查的背景下进行的。
我的第一反应是选择“不,这是一个愚蠢的想法”。我们在分离内容、表现和行为方面已经走了很长一段路...放弃它将是一件憾事。
但是,我最终选择了“它有点让我反感,但我试图对此持开放态度”,因为我知道我会对那些过于主观的文章感到恼火。
我不会说我对这件事持开放态度,因为我认为这是一个非常糟糕的想法,但我愿意承认,我们可能还不知道最好的做法。
我喜欢你这种持开放的态度,从不同的角度考虑这个问题。在过去几年中,技术变化使得后端开发人员也能参与前端开发,但是,在整个技术栈中,CSS 都是一个至关重要的组件,它无法编程,也无法测试,这种不确定性令人沮丧。
我认为,目标是获得最后一块拼图,让 CSS(或者它将变成什么)变得可靠、可编程和可测试。在实现这一点之前,这类帖子将继续出现。
FYI,这是 Christopher Chedeau(Facebook 的工程师)的后续演讲。它解决了一些问题,比如媒体查询、伪状态等等。React:CSS in JS - React 法国会议
所以,呃,他是在说明为什么我们不应该使用内联样式,对吧?
幻灯片中的示例
:hover
::after
……真的吗?有些示例是我见过的最大倒退。
我喜欢 SASS,因为它可以让你做很多纯 CSS 做不到的事情,但我讨厌这种语言本身,SassScript/Ruby 等对我来说简直是糟糕透顶,我一直希望有人创造一个使用 JS 作为脚本语言的 CSS 预处理器。
事实证明,答案可能一直都是使用 Javascript。我看到了这个想法的问题,但我会密切关注它,看看它是否会流行起来。
所以……CSS 是容错的。
Javascript 不是!
当然,它会被那些讨厌处理设计代码的开发人员采用,但我认为它不是未来。
这篇文章超前于时代。谢谢你,但我太爱我的 CSS 了,无法与它分离。而且,SASS fTw :)
Chris,你在逗我们玩吗?感觉你可能是在逗我们玩。
我工作中有人告诉我,他支持在 CSS 中使用 ID,因为“愚蠢的年轻开发者”将来会继承项目,并用自己的样式覆盖他的样式……好吧,抱怨就一直持续下去。
我完全赞成必要的改变,但我不会开始内联样式(说真的,WTF),无论它如何包装,就像我不会写更多强调的代码(使用 # 或 !important)一样,仅仅因为一些糟糕的开发人员将来可能继承我的代码并把它搞砸了。
此外,设计师应该“学习 JS”这个想法需要消亡。他们是设计师,而不是开发人员。仅仅因为我可以基于数学开发一个网站,并不意味着我是一个设计师。设计远不止网格系统和黄金比例。开发人员创造了互联网;设计师让它变得美丽(不仅美观,而且易于使用)。当然,我承认,这可能过于简单化了。
但说真的,Chris,你在逗我们玩吗?因为感觉有点像这样。
使用样式表进行样式设计是其目的。使用 Javascript 进行脚本编写是其目的。为什么要尝试将样式纯粹地放到脚本中?我个人不明白将 CSS 扩展到模块化时的任何问题,而且谁又能说同样的问题不会出现在这个 Javascript 解决方案中。
此外,在这个有争议的 Javascript 解决方案中,我们是否考虑了我们为了样式化东西而需要学习的越来越多的框架?如果样式被添加到某个特定项目中,如果你更改了框架,你需要调整你的样式吗?或者更可能的是,如果你在多个项目中工作,每个项目都实现了不同的框架。
我们是否仅仅是过度复杂化了样式化这个简单的任务。我同意上面的一条评论,这是针对当前问题的错误解决方案。现实的解决方案可能是具有样式选择器的更加了解 DOM。
问题的一部分似乎是缺乏 HTTP 2.0 支持。为什么 CSS 会随着时间的推移而增长?因为我们将所有内容都放到一个压缩和合并的文件中。
为什么我们要这样做?因为我们试图限制发送到服务器的请求。如果我们可以向服务器发送五十个并行的 css 请求,我们就可以缩减一次性提供 css 的数量。
此外,应该提到,当涉及到 React 和虚拟 DOM 时,这种神奇的童话思维完全是胡说八道。Reddit 试图将其应用于他们的移动网站,结果加载图像花了 47 秒。
https://github.com/reddit/reddit-mobile/issues/247
引用 Addy Osmani 的话:“简而言之:'DOM 速度慢,虚拟 DOM 速度快' 的说法介于误导和错误之间。在页面加载期间进行任何形式的扩展性 Javascript 工作都会让你付出代价,而 JS 大小仍然很重要。”
React 使 Javascript 膨胀,这将降低性能。
你真的读过那个审计吗?
他们试图通过 React 在移动设备上交付一个 1.1MB 的压缩 JS 内核,其中包含未渲染的 SVG 图形,而不是正确使用它。React 在许多网站上都很好,包括 Instagram、Facebook、Netflix、Dropbox 等,但似乎他们的部署由于对 Flux 和 React 使用的单方面设计模式的误解而失败了。我现在也在大约 10-15 个网站中使用它,而且可能永远不会回到其他开发方式。
简而言之:如果你错误地使用工具,你将得到混合的结果。
这里发生了几件事
教设计师/排版人员函数式编程比教程序员设计/排版要容易得多。(我知道这是真的,因为我就是这样开始的,而且我在过去 20 年中一次又一次地看到了这一点。)
我认为 CSS 最好的地方是级联。但它很强大,所以你必须真正了解自己在做什么,而不是试图走捷径。这意味着你需要拥有一个开发方法和一个代码组织感,在你的 CSS 宇宙中,每个人都知道并理解。无论你是使用预处理器来实现这种方法,还是手工编写代码,这都是无关紧要的。重要的是方法和代码组织。重要的是坚持它……实际上,这似乎变成了某些团队坚持敏捷编程方法概念的方式……
如果你在级联概念的基础上构建方法并组织代码,而不是试图对抗级联或逃避级联,那么最终你会得到一个易于维护/更改/添加的 CSS 集,它可能需要来自 Javascript 的偶尔状态帮助。
用 Javascript 或 React 来替换我们现在所知的 CSS,实际上是在试图把洗澡水和孩子一起倒掉。
你的里程数将根据参与的硬核函数式程序员数量、未参与的设计师数量以及你组织的整体动态而有所不同。
在你尝试之前,你不会知道你真正失去了什么。我最近有幸在我们的应用程序中尝试了 React 内联样式/react-style,我不得不说这个概念离令人愉快的现实还很远。
在每一步上都隐式地复制粘贴,对生成的代码透明度低,“问题”是 DOM 中的自然继承,以及伪元素的缺乏……应用悬停和/或任何其他状态的条件通常会使组件样式属性变成多行难以阅读的无稽之谈。从最后一个子 ul 中的最后一个子 li 中排除边框?悬停父元素以更改子元素的设计?你将要循环很多次,你将要跨组件属性发送很多状态,你将要再次以艰难的方式体验简单性。
在这个阶段的 CSS in JS 中,我只建议将其用于较小的独立组件,因为 CSS 的表达能力没有得到正确或完全的替代。向前迈进了一步,后退了两步。如果这种情况发生变化,我准备迎接第二轮。
也许这只是一些默契的知识,但 react、ember、angular 等……都给我一种类似 Flash 的感觉。我真的很兴奋在 2006 年学习它,但我希望我花在其他任何事情上的努力都要多一些。
我认为程序员迷失了方向;为什么?因为当来自 Facebook、Google 或其他任何大型科技公司的某人提出了一些新东西时,每个人都应该加入并追随最新的东西。正如很多评论者所说,如果!这就是问题所在,我们为访问网站的观众而构建,而不是为了看看谁的代码最牛。简单性是关键,这是生活中任何事物的首要规则。
我举几个例子,如果
No-script 被激活了?
不懂 JS 的程序员接手你的工作?
不要误会我的意思,我喜欢 JS,但它需要在正确的时间和正确的地方使用。而不是因为一个新的库正在被吹捧。
太棒了!
哈哈,真爱 Lea。
我不得不完全同意她的评论。你不可能比她更简洁有效地表达这一点。
就像这样:真正优秀的 CSS 前端人员是非程序员。他们来自设计背景。这种情况永远不会改变。如果前端视觉质量是一个话题,总需要一个简单的上下文,在那里可以应用样式,而无需过多地与开发环境、依赖项和协作等方面打交道。
并不是说真正优秀的 CSS 前端人员总是不会编程。我们很多人为了用函数返回值等方法来补充 CSS 值,而学习了编程。正如我之前所说,教一个 CSS 设计人员编程比教一个用函数式语言编程的人设计/排版要容易得多。
我的经验是,函数式编程人员经常对无法在 CSS 中编写函数感到沮丧。加上继承规则和层叠样式表,以及程序员不考虑类似于原子设计这样的东西来驱动他们试图产生的主要功能,最终导致程序员感到沮丧,他们往往将 CSS 交回给那些有耐心处理层叠规则的人。顺便说一句 - 我认为 Luke W. 的原子设计是迄今为止我见过的最接近层叠样式表的方法论。
Jean,我和你一样…我会编写 jQuery 代码,我了解基本的 OOP,我会使用 vagrant、symfony、预编译器、函数、mixin、敏捷流程等等。但我仍然不会把自己归类为“程序员”,因为我知道并且遇到了很多在这一行工作了 14 年的“真正的”程序员。问题是,硬核的后端人员在一个下午就能学会 CSS/LESS/SASS,然后他们就认为自己对外观和感觉或设计原则了如指掌。事实并非如此 :) 我目前指导了一个由两位非常聪明的程序员为一家大型瑞士银行完成的非常大的项目。这个项目完全陷入停滞。他们以大量的非常智能和复杂的 LESS mixin 为例,所有东西都完全过度结构化和过度工程化,以至于他们实际上完全失去了概览。基本上 - 它在理论上很棒并且可以扩展,但人类已经无法处理它了 :)
顺便说一句:该项目是围绕 Brad Frost 的原子设计和 patternlab 构建的 - 遗憾地说,对于一个如此规模的项目来说,它完全没有奏效。我相信这是一个很棒的概念,但关于如何构建东西,存在着无休止的讨论。另一个原因是该项目陷入了停滞。我被聘用为 Bootstrap/前端专家。他们希望我提出一些神奇的编码技巧来解决他们的问题,但我实际上在该项目中提供的帮助是大量实用主义。
@André - 任何方法论的有效性都取决于其应用方式以及使用它的人的内部运作机制。
是的。有些程序员可以编写优美、富有创意的代码。除了他们自己,没有人能读懂它。至少在没有花 6 周时间研究代码以弄清楚他们到底做了什么之前。
这就是需要实用主义和最佳实践的地方。方法论需要围绕你深入到兔子洞的程度以及编写代码的规则,以便在你之后开发人员至少能够维护代码,并且能够按照相同的规则编写新代码。
实用主义最重要的部分是帮助人们理解,过度工程或过度构建解决方案从长远来看不会对任何人有帮助。
我关注 CSS 替代方案 -GSS、PostCSS— 的主要原因是我认为 CSS 仍然感觉有缺陷。很多东西过于复杂(居中内容,你好?),感觉这仅仅是出于历史原因。我基本上会对从头开始重写的 CSS 感到满意,但我不会介意那些 CSS 替代方案似乎提供的灵活性。
内联样式,在 JavaScript 中编写样式,通过添加 HTML 元素来从 js 中更改 DOM?分离关注点的概念怎么了?
我能理解在大型应用程序中使用“React”方式来处理 CSS 会很有用,但我也不理解在内联编写 CSS 会导致的混乱...这感觉很不妥!