2021.02.26
2314
Css in Js
各种技术只负责自己的领域,不要混合在一起,形成耦合。对于网页开发来说,主要是三种技术分离。
并且大家会说,尽量不要写"行内样式"(inline style)和"行内脚本"(inline script)。
React 是组件结构,强制要求把 HTML、CSS、JavaScript 写在一起。这个传统的“关注点分离”的思想,完全是背道而驰。但是,这有利于组件的隔离。每个组件包含了所有需要用到的代码,不依赖外部,组件之间没有耦合,很方便复用。所以,随着 React 的走红和组件模式深入人心,这种"关注点混合"的新写法逐渐成为主流。
表面上,React 的写法是 HTML、CSS、JavaScript 混合在一起。但是,实际上不是。现在其实是用 JavaScript 在写 HTML 和 CSS。
React 在 JavaScript 里面实现了对 HTML 和 CSS 的封装,我们通过封装去操作 HTML 和 CSS。也就是说,网页的结构和样式都通过 JavaScript 操作。
React 对 CSS 封装非常简单,就是沿用了 DOM 的 style 属性对象。用JS来写CSS,这就是Css in Js,他是Js脚本的一部分。
const style = { 'color': 'red', 'fontSize': '14px' }; const clickHandler = () => alert('hello stone'); ReactDOM.render(Hello, world!
, document.getElementById('root') ); 复制代码
CSS-in-JS的实现方法上区分大体分为两种:唯一CSS选择器和内联样式(Unique Selector VS Inline Styles)。接下来我们会分别看一下对应于这两种实现方式的两个比较有代表性的实现:styled-components和radium。
动态生成CSS选择器,并把对应的CSS样式通过style标签的形式插入到head标签里面。动态生成的CSS选择器会有一小段哈希值来保证全局唯一性来避免样式发生冲突。
// 查看https://www.cssinjsplayground.com/ import React from 'react'; import styled from 'styled-components'; import Form from './form'; import Header from './header'; const Container = styled.main` display: flex; flex-direction: column; min-height: 100%; width: 100%; background-color: #f6f9fc; `; const Stripe = styled.div` height: 10vh; overflow: hidden; transform: skewY(-8deg); transform-origin: 0; background: linear-gradient(-150deg, rgba(255, 255, 255, 0) 40%, #ddecf7 70%); `; export default function Login() { return (