大佬们,你们前端 css 这个东西效率问题怎么说
我个人平时的命名规范是学习 elementui 的命名规范,可能学的不完善,尽量在学习 打个比方: .main .main-info .main-info_mini …
像 scss lass 这种 效率问题可以提高多少
我个人平时的命名规范是学习 elementui 的命名规范,可能学的不完善,尽量在学习 打个比方: .main .main-info .main-info_mini …
像 scss lass 这种 效率问题可以提高多少
用 Tailwind 效率提升 500%. 因为写代码的最高境界就是几乎不写代码.
如果倾向 CSS in JS 还有个 Twin, 跟 Tailwind 一样的.
这个东西看起来有点 low, 感觉十年前就很多类似的做法, 但大多都不好用. 但 Tailwind 实际上很好用, 和其他类似的方案都很微妙的, 魔鬼都在细节里.
—
用 Styled 类似的方式或者其他 CSS-in-JS 效率提升 50%.
因为写 CSS class 再在 HTML 用 class 本质上是一个 correlation 的过程, 但是现在都已经组件化了, 等于这种 correlation 的工作翻倍了, 在组件原地定义就消灭了这种工作. 而还比较鼓励你设计好组件.
缺点是和已有大量用选择器的项目放在一起的时候会互相打架, 用起来比较尴尬.
—
此外 BEM 还行, 效率不会提升因为比较繁琐, 但是正确应用可以避免很多坑.
类似 SASS 的预处理器的问题就是很多项目用了 SASS 嵌套会特别爽, 然后人们就会无脑嵌套. 最后发现不仅优先级很乱且没法覆盖, 而且你在嵌套的过程中其实已经重复了一遍 HTML 的嵌套逻辑, 那么当你移动 HTML 的结构的时候所有的样式都会失效.
相比之下 BEM 刻意总维持 2 层结构, 既解决了命名空间的问题, 又解决
感觉 SASS 之类唯一比较有价值的是类似 mixin 的功能, 这样可以把样式拆小复用. 纯 CSS 没有 @apply 的情况拆小就要在 HTML 上无限重复, 改动的时候很容易漏.
tailwind 到底是比上面这个优势在哪
最多是比如规定我一个网站只能用 12 、14 、16 号字体,能拦住别人用 13 、15 、17 的,但是你拦不住别人在 btn-sm 里用 16 号字的
反正我是看不懂 我觉得确实可能都用最好
tailwind 颗粒度非常细,初次学习成本很大,过了这个阶段还是很不错的。
我自己选择的是沿用 tailwind 的思路,以 oocss 的方式去写,颗粒度会大一些,但是学习成本低一些。
less sass 最早是解决 css 无法设定变量、函数的问题,新的 css3 已经原生实现不少功能了,但我还是习惯 sass,毕竟组里的人都习惯它了,也没什么坏处。
总的来说,方案很多,要根据自身团队的情况选择一个平衡的方案。
<div class=”flex flex-col”>
<div class=”-my-2 overflow-x-auto sm:-mx-6 lg:-mx-8″>
<div class=”py-2 align-middle inline-block min-w-full sm:px-6 lg:px-8″>
<div class=”shadow overflow-hidden border-b border-gray-200 sm:rounded-lg”>
<table class=”min-w-full divide-y divide-gray-200″>
<thead class=”bg-gray-50″>
<tr>
<th scope=”col” class=”px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider”>
Name
</th>
然后现在来了个新需求, 需要 把组件 C1 放在 父组件 C2 , 需求是在 C2 里面的 C1 里的按钮需要表现出 蓝色背景 + 红色边框 ,
那么问题来了, 如何在不动 C1 和 按钮的源代码的情况下, 实现这个需求 ?
大概就是 开发者 d1 在第一天开发好了 C1 和 按钮
那么第二天 开发者 d2 在复用 C1 的同时 (而且也不修改 C1 的情况下), 让里面的按钮显示出不同的样式 ?
tailwind 之于 CSS,等于 GTK# 之于 GTK,完全是 porting 过去的。是激进做法。激进的意思就是时刻处于被淘汰边缘,而且一旦维护团队放弃维护它,它会是无人接手的那种
github.com/troxler/awesome-css-frameworks 这里把 Tailwind 放在 Specialized 就是这个意思
另外一个办法是不改源码只能组件靠 JS 搞一个 Lambda 进去当 prop 拼类名. 但是这样做并不好. 你也可以试想把问题从 CSS 换成 JS, 不修改源码, 怎么让组件支持新功能? 你还是可以传 Lambda 进去, 但是绝大部分时候你不用每个组件都写得这么灵活, 不然代码就没法读了.
—
如果你横向看一下这些解决方案, 就会发现越现代的 CSS 方案越不好实现你说的这种需求. 比如 Styled 是基于组件的, 虽然也不能覆盖但是至少还能用选择器. 到了 Tailwind 就更不好覆盖了. 这是因为开发和设计都在逐渐推行组件化和 atomic 设计. 有了这些基础才能真正高效的开发.
回到说的问题, 如果你想有不同的行为和样式, 应该重新思考组件怎么设计和组合.
> 但 css 这种技术根本不需要 wrapper
CSS 很多东西是比较底层的, 有没有 wrapper 效率会差 N 倍, 我 Tailwind 写一会够别人吭哧一上午的.
> 要用就用 General Purpose 的东西
CSS 也不是 General purpose 的, 很多东西 CSS 根本写不出来, 还得 JS 实现. 因为这个就不用 CSS 就很怪了.
至于你说的第二个方案, 通过 prop 拼类名 (那么就得修改 按钮组件,让它支持通过 props 传入 class), 这个还是违反了我想说的完全不去修改任何已有的代码的情况了 …
大概就是,总的来说,有个组件开发好了 (这个时候并不知道 会被用到其他 20 个场景下, 样式完全不一样 , 有的甚至布局都变了) , 那么开发这 20 场景下的开发人员,不修改 这个组件,通过外部修改样式的唯一方案,我实践过的就只有类似 BEM 的 方案了 , Tailwind 看了几次, 还是感觉没法复用 (不是 css 没法复用, 是用 Tailwind css 写的组件没法复用 , 要不就要到处通过 props 传 class) ,做一些特定修改 .
如果有 Tailwind 这个方面的实践相关的, 可以推荐一下
[scss,less,postcss]
进化版 css,可以搞变量、加函数,最主要的是写 css 时可以嵌套了,直接就降维解决了 BEM 要解决的问题。
但是注意千万不要用 css 嵌套写法拼接 class 去写 BEM,别人接手代码去修改时简直就是灾难!
[tailwindcss 及其他原子类]
这东西应该是混合上述两个使用的,不应该单独拿出来用,而且十分不建议用原子类写具体样式
个人倾向于跟布局大方向有关的使用原子类,比如常见的左右浮动和清除浮动「 fl,fr,clearfix 」,比如 flex 布局,我将 flex 布局整个抽成原子类在使用「 https://github.com/KarnaughK/FastFlex 」
其他类似于长宽、padding/margin 、文字样式、以及绝对布局相关等、颜色阴影边框等等,都是写在 css 里,这样的好处是 html 具有一定的可读性,单看 class 就能知道这个布局是横着还是竖着,是居中还是靠左,css 里只需要关注具体的样式,每一个 class 只对应精确的元素的样式,减少与其他元素的样式关联
外部能修改, 其实就跟动态作用域一样, 像 JS 的 this 和 shell 的变量都是那种动态作用域. 但是一个正规的语言都是文法作用域, 定义的时候定死而不是动态靠外部覆盖, 不然软件的行为没法预测, 很难维护.
仅当写比较诡异项目需要改来改去的才会 selector. 这样其实挺好的, 关键是主动出击, 和 designer 反复交流搞出来一套规则, 不能想哪出是哪出.