CSS 思考 ☞『CSS in JS』 or 『JS in CSS』 ?

简介: 本瓜所在的项目组技术栈主要是 Vue2,平常又疏于 CSS 探究,对 JSX 里融合写 CSS 这种全面组件化的写法了解不多。

前面写了一篇: CSS in JS = JSS , 这个库你知道吗? - 掘金


在评论里有人说:

image.png


同时还发了一个沸点:


你听说过 JSS 吗?在 JS 中写 CSS,感觉有点奇葩。 - 沸点 - 掘金

image.png

大家都很有才,视野很开阔~~


本瓜所在的项目组技术栈主要是 Vue2,平常又疏于 CSS 探究,对 JSX 里融合写 CSS 这种全面组件化的写法了解不多。


我现在是意识到了,这种写法其实早就有了,可参见阮一峰的这篇:CSS Modules 用法教程 - 阮一峰的网络日志


简而言之,代码组织形式类似如下,从 A 到 B 的过程:


// *.scss
.item {
  display: flex;
}


  • A
// Simply import
import './foo.scss';
const App = () => (
  <div className="item">
    {item}
  </div>
)


  • B
// import as a js module 
import styles from './foo.scss';
const App = () => (
  <div className={styles.item}>
    {item}
  </div>
)


编译出来的结果也不一样:

  • A
<!-- Normal SCSS -->
<div class="item">foo bar</div>


  • B
<!-- SCSS with Class Module will have 
     hash values suffixed to the class name -->
<div class="item-35ada5">foo bar</div>


CSS in JS ,将样式也整合在模板组件里面,确实就像有人所说的:“分久必合、合久必分”。


JS in CSS



后来又了解到:


除了 CSS in JS,还有一种方向是 JS in CSS;尤雨溪在 Vue3.2 提出,目的是:让我们可以在 css 中使用 js 变量。SFC style CSS variable injection (new edition) by yyx990803 · Pull Request #231 · vuejs/rfcs


CSS in JS 是把 CSS 写在 JSX 模板中;

JS in CSS 是把 JS 变量写入 CSS 中;


想想我们在  Vue2 中,想动态控制样式,我们通常这样:

<template>
    <h1 :style="{opacity: opacity}">Vue</h1>
</template>
<script>
export default {
    data () {
        return { opacity: 0 }
    },
    mounted () {
        setInterval(() => {
            this.opacity >= 1 && (this.opacity = 0)
            this.opacity += 0.2
        }, 300)
    }
}
</script>
<style>
h1 {
    color: rgb(65,184,131);
}
</style>


在 Vue3.2 中:

<template>
    <h1>Vue</h1>
</template>
<script>
export default {
    data () {
        return { opacity: 0 }
    },
    mounted () {
        setInterval(() => {
            this.opacity >= 1 && (this.opacity = 0)
            this.opacity += 0.2
        }, 300)
    }
}
</script>
<style> 
h1 {
    color: rgb(65,184,131);
    opacity: v-bind(opacity);
}
</style>


这个要借助 vite 编译:

npm init vite-app vars
npm i
npm run dev

image.png

然后就可以看到效果了

image.png


再补充一个颜色选择器的例子


<template>
  <div class="Example">
    <div class="area">
      <div class="form">
        <label>Select Color (SCSS)</label>
        <input type="color" v-model="themeColors.bgColor" />
      </div>
      <div class="preview">
        <span>{{ themeColors.bgColor }}</span>
        <div class="customColor"></div>
      </div>
    </div>
  </div>
</template>
<script>
import { ref } from "vue";
export default {
   setup() {
    const themeColors = ref({
      bgColor: ''
    })
    return {
      themeColors
    };
  },
};
</script>
<style lang="scss">
.Example {
  $customColor: v-bind('themeColors.bgColor');
  .customColor {
    background: $customColor;
    width: 100px;
    height: 50px;
  }
}
</style>

来源


小结



不管是 CSS in JS 还是 JS in CSS,总之都想整合 JS 和 CSS 的能力,梳理一个新的模板规范。


后面还会怎么变?拭目以待。

image.png



相关文章
|
8天前
|
JavaScript 前端开发 iOS开发
js实用方法记录-动态加载css/js
js实用方法记录-动态加载css/js
16 0
|
16天前
|
JSON JavaScript 前端开发
js是什么、html、css
js是什么、html、css
|
22天前
|
人工智能 前端开发 JavaScript
【前端设计】HTML+CSS+JavaScript基本特性
【前端设计】HTML+CSS+JavaScript基本特性
JS+CSS随机点名详细介绍复制可用(可自己添加人名)
JS+CSS随机点名详细介绍复制可用(可自己添加人名)
|
1月前
|
前端开发 JavaScript
从0到1:用HTML、CSS和JavaScript构建一个简单的待办事项列表
从0到1:用HTML、CSS和JavaScript构建一个简单的待办事项列表
26 0
|
1月前
|
前端开发 JavaScript UED
前端开发的魔法:CSS动画与JavaScript的完美结合
本文将探讨如何利用CSS动画和JavaScript的结合,为前端页面增添生动的效果。我们将通过实例展示如何使用这两种技术为网页元素创建吸引人的动画效果,并讨论它们的优缺点和适用场景。
29 0
|
1月前
|
缓存 自然语言处理 前端开发
JS/CSS体积减少了67%,我们是如何做到的?
JS/CSS体积减少了67%,我们是如何做到的?
18 1
|
1月前
|
JavaScript 前端开发
编程笔记 html5&css&js 079 JavaScript 循环语句
编程笔记 html5&css&js 079 JavaScript 循环语句
|
1月前
|
JavaScript 前端开发 开发者
编程笔记 html5&css&js 078 JavaScript 条件判断语句
条件判断语句是首先要接触的语句。通过条件判断来执行不同的代码块。
|
1月前
|
JavaScript 前端开发 编译器
编程笔记 html5&css&js 077 Javascript 关键字
编程笔记 html5&css&js 077 Javascript 关键字