大家公司里面写前端样式都是咋写的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhonj
V2EX    前端开发

大家公司里面写前端样式都是咋写的?

  •  
  •   zhonj 2023-07-04 09:49:48 +08:00 7517 次点击
    这是一个创建于 906 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 全写 style 里面(估计没人这么写)
    2. class 里面就一个(class="my-container") 具体样式写在 style 文件里
    3. 使用 tailwindcss 原子类,全部写 class 里面 ( class="flex flex-col ....")
    4. 使用 tailwindcss 原子类,class 里面写一个 具体使用 apply 卸载 style 里面 ( class=my-container" .my-container{@apply flex flex-col ....})

    本人刚写前端没多久,没学过 style 直接用的 taildcss 之前写过安卓,习惯用 3 方式,tailwind 无法实现才用 4 。但是公司内其他的老前端都喜欢用 2 ,又有些人喜欢用 4 ,我不是很理解,样式分出来了要改的时候非常麻烦啊,找样式找不到得用代码得开两个页面去找,配合显示页面的地方要看 3 个地方。大家有啥宝贵的经验可以分享分享

    61 条回复    2023-07-08 19:00:05 +08:00
    daliusu
        1
    daliusu  
       2023-07-04 09:51:39 +08:00   1
    css-in-js 保平安,再也没有了这么多问题
    QUC062IzY3M1Y6dg
        2
    QUC062IzY3M1Y6dg  
       2023-07-04 09:56:31 +08:00
    3.4 更适合统一化的 ui 吧,像我们公司,网页都是定制化的,用原子化基本满足不了,一个项目能拆几十个 css 文件,基本都是千行往上
    LandCruiser
        3
    LandCruiser  
       2023-07-04 09:56:58 +08:00   2
    1:tailwind 不适用于所有场景。
    2:你会 tailwind 不代表别人会 tailwind ,增加了学习成本但收益不大,不解决痛点难点。但是大家都会 CSS 。
    3:CSS 原子类这种写法在远古时代就有了,但没有大规模流行开来,只是部分应用。
    NoManPlay
        4
    NoManPlay  
       2023-07-04 10:04:34 +08:00   2
    目前用 React +scss+CSS Modules

    1.将 scss 文件作为 styles 变量引入 import styles from "xxx.module.scss"
    2.然后在 react 中作为 className 使用 className={styles.xxx}
    这样会在编译后自动为 className 加上混淆,防止了样式污染
    Leviathann
        5
    Leviathann  
       2023-07-04 10:08:10 +08:00
    原来是 2
    后来写了一个新的小项目体验了 tailwind ,被我强行写了一堆仿 tailwind 的原子类模拟成 3

    没什么学习成本,收益很大,大多数常见的样式都能复用
    CHTuring
        6
    CHTuring  
       2023-07-04 10:09:24 +08:00
    @LandCruiser
    1 、同意
    2 、说反了,tailwind 的学习成本很小,但是收益很大
    3 、CSS 原子类这种写法远古时代就有,其实也有流行开,参考 bootstrap
    ztc
        7
    ztc  
       2023-07-04 10:21:49 +08:00
    相比 tailwind, 我觉得 Unocss 更好用, 可以这样写
    ```html
    <div
    border="t-3 solid rounded-lg"
    p="x-6 y-4"
    bg="white dark:gray-800"
    hover="scale-105 cursor-pointer"
    shadow-2xl
    relative
    max-w-xl
    transition
    />
    ```

    个人感觉比在 style 里写样式,效率是要更高的,而且看起来很清晰
    tool2d
        8
    tool2d  
       2023-07-04 10:46:44 +08:00
    我就是全写在 style 里面,但是因为 style 的原生语法又臭又长,我自己写了一个缩写转换。

    举个例子,我会这样写<div css="flex my-10 mx-auto w-full h-full">,解析 dom 时,会动态展开 w-full 为 weight:100%, flex 为 display:flex;
    momo2278
        9
    momo2278  
       2023-07-04 10:53:01 +08:00
    tailwind 有啥学习成本
    zhonj
        10
    zhonj  
    OP
       2023-07-04 10:58:13 +08:00
    @ztc 新项目我也用的 unocss 但是唯一的缺点是这样写没提示啊,得硬敲
    zhonj
        11
    zhonj  
    OP
       2023-07-04 11:00:27 +08:00
    @CHTuring 确实是简单,我新手 5 分钟就上手原子类 css , 1 天基本就熟了。对新手确实是友好的比 style 简单很多,但是坏处是碰到复杂的样式还是得学习 style
    zhonj
        12
    zhonj  
    OP
       2023-07-04 11:03:09 +08:00
    @shuxhan 你们拆了 10 几个 css 文件,如果要修改,找起来不头大么?先看页面定位,然后看 html ,再看 css 。我们公司同事用 4 写的,我改起来人都是麻的
    zhonj
        13
    zhonj  
    OP
       2023-07-04 11:06:28 +08:00
    @daliusu 这玩意调试应该也不简单吧,浏览器调试找到哪里的东西,然后一层一层翻组件
    QUC062IzY3M1Y6dg
        14
    QUC062IzY3M1Y6dg  
       2023-07-04 11:07:10 +08:00
    @zhonj #12 根据,页面>功能拆分,命名也比较规范,修改起来难度不大,主要是量太多
    zhonj
        15
    zhonj  
    OP
       2023-07-04 11:08:36 +08:00
    感谢大家的回复,这么看下来前端是真的杂啊。各种各样的方式方法,目前还是没找到写样式最舒服的方式
    zhonj
        16
    zhonj  
    OP
       2023-07-04 11:10:49 +08:00
    @shuxhan #14 公司多个人协作有强命名规范确实能解决很大的问题
    Perry
        17
    Perry  
       2023-07-04 11:14:01 +08:00 via iPhone
    公司有比较好的 design system 的,估计一句 style 都不用写(除了设计师想出来的一些更复杂应用场景比较特殊的 components ),直接用现成的 react components 。
    wbwm
        18
    wbwm  
       2023-07-04 11:19:24 +08:00
    @tool2d #8 你这不就是 tailwind 吗?
    ljsh093
        19
    ljsh093  
       2023-07-04 11:19:42 +08:00
    @daliusu #1 不会有性能问题吗
    ljsh093
        20
    ljsh093  
       2023-07-04 11:20:39 +08:00
    @tool2d #8 你这个 css 改成 class 不是更好吗
    xiaoqidev
        21
    xiaoqidev  
       2023-07-04 11:21:05 +08:00
    @zhonj #10 UnoCSS 有 VSCode 扩展支持提示,也兼容 Tailwind 写法
    crysislinux
        22
    crysislinux  
       2023-07-04 11:23:30 +08:00 via Android
    tailwind 自己写还好。改别人写的就大大的不好了。
    Hanser002
        23
    Hanser002  
       2023-07-04 11:25:49 +08:00
    tailwindcss + emotion
    leonfong
        24
    leonfong  
       2023-07-04 11:27:45 +08:00
    自己写项目 偏向 3 ,团队协作用 4 ,感觉 4 就是兼具了整合了 23
    MMDeJeVS3GtMVLeu
        25
    MMDeJeVS3GtMVLeu  
       2023-07-04 13:32:40 +08:00
    之前一个同事用了 tailwindcss ,UI 设计的花哨点,样式代码比标签长
    我去改样式,p-8 、f12 都是什么鬼,还要一个个的去看

    没有成熟的设计规范,tailwindcss 请自己玩玩就好
    94
        26
    94  
       2023-07-04 13:36:32 +08:00   1
    觉得 tailwindcss 会造成 className 过长的可以试试看 [DaisyUI]( https://daisyui.com/) 这种 UI 库,会清爽很多。
    MMDeJeVS3GtMVLeu
        27
    MMDeJeVS3GtMVLeu  
       2023-07-04 13:38:22 +08:00
    我不理解用 taildcss 是赶时髦还是怎么的,这种代码真的好吗?

    ```
    <div
    v-for="(group, idx) in schema"
    :key="idx"
    class="min-h-[70px] relative"
    >
    <div
    :class="setOuterClass(idx)"
    @click="() => {
    active = idx
    }">
    <div :class="setInnerClass(idx)">
    <div>{{ idx + 1 }}</div>
    </div>
    </div>
    <div class="absolute text-[12px] left-[50%] top-[32px] min-w-[70px] translate-x-[-35px] text-center" :style="{ color: active >= idx ? '#3F7AFF' : '#CBCBCB'}">{{ group.label }}</div>
    </div>
    ```
    MMDeJeVS3GtMVLeu
        span class="no">28
    MMDeJeVS3GtMVLeu  
       2023-07-04 13:41:36 +08:00
    ```js
    // 头部导航栏样式
    setInnerClass(idx) {
    const isBefore = idx < this.active
    const isCurrent = idx === this.active
    const isAfter = idx > this.active
    const beforeClassInner =
    'min-w-[22px] max-w-[22px] w-[22px] h-[22px] bg-[#ffffff] text-[#3F7AFF] text-center text-[12px] font-semibold leading-[18px] rounded-full border-[2px] border-[#C8D7F9]'
    const currentClassInner =
    'min-w-[22px] max-w-[22px] w-[22px] h-[22px] bg-[#3F7AFF] text-[#fff] text-center text-[12px] font-semibold leading-[18px] rounded-full border-[2px] border-[#124FDA]'
    const afterClassInner =
    'min-w-[22px] max-w-[22px] w-[22px] h-[22px] bg-[#ECECEC] text-[#CBCBCB] text-center text-[12px] font-semibold leading-[18px] rounded-full border-[2px] border-[#ECECEC]'
    return (isBefore && beforeClassInner) || (isCurrent && currentClassInner) || (isAfter && afterClassInner)
    },
    setOuterClass(idx) {
    const isBefore = idx < this.active
    const isCurrent = idx === this.active
    const isAfter = idx > this.active
    const beforeClassWarp = 'z-[2] max-w-[26px] relative rounded-full border-[2px] border-[#C8D7F9]'
    const currentClassWarp = 'z-[2] max-w-[26px] relative rounded-full border-[2px] border-[#C8D7F9]'
    const afterClassWarp = 'z-[2] max-w-[26px] relative rounded-full border-[2px] border-[#ECECEC] custom-linear-box-shadow'
    return (isBefore && beforeClassWarp) || (isCurrent && currentClassWarp) || (isAfter && afterClassWarp)
    },
    ```
    SolidZORO
        29
    SolidZORO  
       2023-07-04 13:43:02 +08:00 via iPhone
    @NoManPlay 同意这点,css modules 就很好了。

    我个人只用 css modules ,当然是在 less/sass 里面用。

    这样任何人看了也不会有学习成本,鼠标点击 styles.xxx 还能直达样式。


    原生 css 没有任何 dsl 和语法糖还是非常好的,喜欢写原生 css 。

    用 bs/tw 的这部分群体我很久之前就观察过了,就是不会 css ,或者觉得 css 难写不好 css 的用户是主要群体。当然不排除一部分 css ,大佬也爱用。

    css-in-js 是我最不待见的,每家为了实现原生 css 的一些 fn ,用尽了各种 dsl 和语法糖,导致学习成本很高而且还跑在 runtime ,对性能有影响,最近新出号称下一代 zero runtime 的 panda 用起来其实也很别扭。

    当然 CIJ 并不少一无是处,在我看来最大的好处就是可以做到 css 和 js 可以复用变量,也就是 css vars 直接写成 const 。以及可以做 scope 隔离,一个 app 可以做多个 scope 的多套 theme ,这些点都挺好的,除此之外我没感觉到其他优势。
    SniperXu
        30
    SniperXu  
       2023-07-04 13:45:12 +08:00
    试试 unocss ?最近用的离不开了
    R1hu6Hs2sSN8pkVX
        31
    R1hu6Hs2sSN8pkVX  
       2023-07-04 14:15:26 +08:00
    @CHTuring 收益大哪了,那一长串的 class 写完之后大家都不写 bem 类名了恶心死了
    R1hu6Hs2sSN8pkVX
        32
    R1hu6Hs2sSN8pkVX  
       2023-07-04 14:19:03 +08:00   1
    @CHTuring 还有美其名曰什么可以大幅压缩 css 的大小其实是偷换概念你的包大小全放在 js 的类名中了
    zhonj
        33
    zhonj  
    OP
       2023-07-04 14:23:32 +08:00
    @whatFoxSay #31 class 丢一个类名当你要维护的时候你得开三个页面,一个浏览器定位,一个 html 定位节点,一个 style 定位样式,找起来没有使用 windcss 或者 unocss 方便,而且 bem 类名这玩意取名字真是很佛系的,一个团队 10 个人有 10 种取名方式。
    MMDeJeVS3GtMVLeu
        34
    MMDeJeVS3GtMVLeu  
       2023-07-04 14:35:24 +08:00
    @zhonj 为什么会有去维护一个类名的需求,写 vue scoped ,写 react 就 css module ,我写样式除了 @include text-ellipsis;这样的仅有的几个代码,几乎不复用

    定位要么一眼就观察到了,要么 cmd+f

    还有一个很重要的点,类似于蓝湖这样的工具已经能生成很多样式代码,拷贝+简单的修改就可以活,效率和心智负担比 tailwindcss 之类的玩意强太多了
    wdking
        35
    wdking  
       2023-07-04 14:40:26 +08:00
    啥都用过 总结:windicss
    zhouyg
        36
    zhouyg  
       2023-07-04 14:41:49 +08:00
    总之,最后是 tailwind
    CHTuring
        37
    CHTuring  
       2023-07-04 15:15:42 +08:00
    @whatFoxSay 你说的对,不过有个东西叫 apply
    CHTuring
        38
    CHTuring  
       2023-07-04 15:16:21 +08:00
    @whatFoxSay 你说的对,但不是只有 css in js ,还有 .css
    ztc
        39
    ztc  
       2023-07-04 15:29:54 +08:00
    @zhonj 对,就是省了起名字的问题了,类名多了 起名字还得纠结半天...
    murmur
        40
    murmur  
       2023-07-04 15:33:00 +08:00
    less 、class 自己写,都是直接封装成组件
    sadyx
        41
    sadyx  
       2023-07-04 16:00:13 +08:00
    2
    magewu1223ll
        42
    magewu1223ll  
       2023-07-04 16:39:52 +08:00
    react cssModule
    karott7
        43
    karott7  
       2023-07-04 17:03:09 +08:00
    直接用 tailwindcss 就好,公司项目永远都会和 tailwindcss 的默认定义有区别,可以和 UI 商量然后自己自定义样式配置,或者直接用 p-[100px] 这样的自定义值(个人会直接用这种方式,公司项目要的是出活快)。
    我不在乎 css 样式文件大小或者其他什么优势,主要就是写起来快,顾名思义,不用切换文件,不用思考类名
    snarkprayer
        44
    snarkprayer  
       2023-07-04 17:05:01 +08:00
    3
    4 这种情况多数都封装进组件了
    IvanLi127
        45
    IvanLi127  
       2023-07-04 18:19:31 +08:00 via Android
    用 3 的样子写 css-in-js 。macro.tw, twind

    用了很多方案,最后感觉这样可靠,省事。
    zhonj
        46
    zhonj  
    OP
       2023-07-04 20:14:13 +08:00
    @justyeh #34 蓝湖这种自动生成 copy 一时爽,换个人来看来改就是火葬场。我们公司之前人写的 uniapp 小程序代码就是蓝湖 copy 的,我看的头皮发麻,太难改了,而且 uniapp 用微信开发者工具本来就卡,我 i9 都没用,后面直接一口气全部重写掉了
    zhonj
        47
    zhonj  
    OP
       2023-07-04 20:23:56 +08:00
    @SolidZORO 大佬问下哈 styles.xxx 你们是如何取名字的啊,而且 css 和页面分开了不觉得改起来麻烦么。我就是感觉 class="xxx" 然后.xxx{} 这样取名字太麻烦了,加上我写过安卓 ios flutter 都是类似 unocss 的方式,我的理解可能是 html 和 css 理应在一起而不应分开了增加维护成本。刚写前端不久的小白的想法
    zhonj
        48
    zhonj  
    OP
       2023-07-04 20:25:40 +08:00
    @zhonj #47 所以我才有次贴提问,问问各位 10 年老前端都是咋看待这玩意的
    maxssy
        49
    maxssy  
       2023-07-04 20:33:25 +08:00
    antd 默认样式 + 全写 style, 之前也试过 less 和 css-in-js, 但是大多是内部项目也就无所谓了
    SolidZORO
        50
    SolidZORO  
       2023-07-04 21:39:34 +08:00 via iPhone
    @zhonj 就直接命名,没有什么魔法,比如 :

    ```
    s.comp-wrapper
    s.info
    s.info-title
    s.info-title-icon
    s.info-title-label
    s.thumb
    s.thumb-img
    ```


    类似这样吧。要抱起来用 -wrapper 里面有隔离用一下 -inner 之类的。我觉得很自然。

    而且,我个人不用 s.xxx 命名,用 s['xxx'],目的是不写驼峰,保持和 css 名字对应。这样找代码和 replace 都方便很多。
    Pastsong
        51
    Pastsong  
       2023-07-04 21:50:03 +08:00
    我 React 通常是写 scss + css module ,但我累了不想起类名的时候就去写 styled-component
    anguiao
        52
    anguiao  
       2023-07-04 22:14:44 +08:00
    Tailwind 确实很容易把 class 写得很长。但是写多了之后就会意识到,一些样式是不需要显式指定的,默认值就可以满足需求。
    善于利用默认值,可以少些很多不必要的样式。就算有时候不用 Tailwind 了,我也发觉到自己以前写了很多不必要的代码。
    Danswerme
        53
    Danswerme  
       2023-07-04 22:37:00 +08:00
    @SolidZORO 请教一下,鼠标点击 styles.xxx 直达样式你用的是哪个插件呢? 我在 VSCode 里用了插件之后点击 styles.xxx 虽然可以正常跳转到 scss 文件里,但是不能正确定位到对应类名。
    SolidZORO
        54
    SolidZORO  
       2023-07-04 23:50:47 +08:00
    @Danswerme 我不常用 VSC ,用的是 IDEA ,装了这个 https://plugins.jetbrains.com/plugin/9275-react-css-modules 我觉得只要是个 css modules 插件都能做到这件事情吧?
    8zU02dFZkHXS6230
        55
    8zU02dFZkHXS6230  
       2023-07-05 09:00:58 +08:00
    前端需要纠结的,过阵子你会发现它并不在这里面。除非有要求,哪个对当前项目方便就怎么来,但是最好统一
    yusf
        56
    yusf  
       2023-07-05 09:23:14 +08:00
    tailwindcss + style
    weixiangzhe
        57
    weixiangzhe  
       2023-07-05 09:49:07 +08:00
    布局用 unocss/tailwindcss , 其他的写 class ,其他的大都是有 ui 老师传设计稿到 蓝湖 figma 之类的,直接 copy 就好了,写 tailwindcss 更累了
    zhonj
        58
    zhonj  
    OP
       2023-07-05 09:58:15 +08:00
    @weixiangzhe 混着来,写是块了,但是改起来就头疼了
    weixiangzhe
        59
    weixiangzhe  
       2023-07-05 10:37:20 +08:00
    @zhonj 所以我是限制自己都是布局时用用
    MMDeJeVS3GtMVLeu
        60
    MMDeJeVS3GtMVLeu  
       2023-07-05 15:14:32 +08:00
    @zhonj 不是无脑 copy ,会选择性的删除一些用不到的属性,经常用到的是 fontSzie 、color 、border 、background ,真的很方便
    vlgs
        61
    vlgs  
       2023-07-08 19:00:05 +08:00
    公司用 styled component 。自己使用 tailwindcss ,推荐一个库 https://ui.shadcn.com/ 可以理解一下 tailwind radix 怎么制作 headless component 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4276 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 10:04 PVG 18:04 LAX 02:04 JFK 05:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86