作者: 阮一峰

1、

以前,网页开发有一个原则,叫做“关注点分离”(separation of concerns)。

它的意思是,各种技术只负责自己的领域,不要混合在一起,形成耦合。对于网页开发来说,主要是三种技术分离。

HTML 语言:负责网页的结构,又称语义层

CSS 语言:负责网页的样式,又称视觉层

JavaScript 语言:负责网页的逻辑和交互,又称逻辑层或交互层

简单说,就是一句话,不要写”行内样式”(inline style)和”行内脚本”(inline script)。比如,下面代码就很糟糕(查看完整代码)。

Hello World

2、

React 出现以后,这个原则不再适用了。因为,React 是组件结构,强制要求把 HTML、CSS、JavaScript 写在一起。

上面的例子使用 React 改写如下(查看完整代码)。

const style = {

'color': 'red',

'fontSize': '46px'

};

const clickHandler = () => alert('hi');

ReactDOM.render(

Hello, world!

,

document.getElementById('example')

);

上面代码在一个文件里面,封装了结构、样式和逻辑,完全违背了”关注点分离”的原则,很多人不适应。

但是,这有利于组件的隔离。每个组件包含了所有需要用到的代码,不依赖外部,组件之间没有耦合,很方便复用。所以,随着 React 的走红和组件模式深入人心,这种”关注点混合”的新写法逐渐成为主流。

3、

表面上,React 的写法是 HTML、CSS、JavaScript 混合在一起。但是,实际上不是。现在其实是用 JavaScript 在写 HTML 和 CSS。

React 在 JavaScript 里面实现了对 HTML 和 CSS 的封装,我们通过封装去操作 HTML 和 CSS。也就是说,网页的结构和样式都通过 JavaScript 操作。

4、

React 对 HTML 的封装是 JSX 语言 ,这个在各种 React 教程都有详细介绍,本文不再涉及了,下面来看 React 对 CSS 的封装。

React 对 CSS 封装非常简单,就是沿用了 DOM 的 style 属性对象,这个在前面已经看到过了。

const style = {

'color': 'red',

'fontSize': '46px'

};

上面代码中,CSS 的font-size属性要写成fontSize,这是 JavaScript 操作 CSS 属性的约定。

由于 CSS 的封装非常弱,导致了一系列的第三方库,用来加强 React 的 CSS 操作。它们统称为 CSS in JS,意思就是使用 JS 语言写 CSS。根据不完全统计,各种 CSS in JS 的库至少有47种。老实说,现在也看不出来,哪一个库会变成主流。

你可能会问,它们与”CSS 预处理器”(比如 Less 和 Sass,包括 PostCSS)有什么区别?回答是 CSS in JS 使用 JavaScript 的语法,是 JavaScript 脚本的一部分,不用从头学习一套专用的 API,也不会多一道编译步骤。

5、

上周,我看到一个新的 CSS in JS 库,叫做 polished.js。它将一些常用的 CSS 属性封装成函数,用起来非常方便,充分体现使用 JavaScript 语言写 CSS 的优势。

我觉得这个库很值得推荐,这篇文章的主要目的,就是想从这个库来看怎么使用 CSS in JS。

首先,加载 polished.js。

const polished = require('polished');

如果是浏览器,插入下面的脚本。

polished.js目前有50多个方法,比如clearfix方法用来清理浮动。

const styles = {

...polished.clearFix(),

};

上面代码中,clearFix就是一个普通的 JavaScript 函数,返回一个对象。

polished.clearFix()

// {

// &::after: {

// clear: "both",

// content: "",

// display: "table"

// }

// }

“展开运算符”(...)将clearFix返回的对象展开,便于与其他 CSS 属性混合。然后,将样式对象赋给 React 组件的style属性,这个组件就能清理浮动了。

ReactDOM.render(

Hello, React!

,

document.getElementById('example')

);

从这个例子,大家应该能够体会polished.js的用法。

6、

下面再看几个很有用的函数。

ellipsis将超过指定长度的文本,使用省略号替代(查看完整代码)。

const styles = {

...polished.ellipsis('200px')

}

// 返回值

// {

// 'display': 'inline-block',

// 'max-width': '250px',

// 'overflow': 'hidden',

// 'text-overflow': 'ellipsis',

// 'white-space': 'nowrap',

// 'word-wrap': 'normal'

// }

hideText用于隐藏文本,显示图片。

const styles = {

'background-image': 'url(logo.png)',

...polished.hideText(),

};

// 返回值

// {

'background-image': 'url(logo.png)',

'text-indent': '101%',

'overflow': 'hidden',

'white-space': 'nowrap',

}

hiDPI指定高分屏样式。

const styles = {

[polished.hiDPI(1.5)]: {

width: '200px',

}

};

// 返回值

//'@media only screen and (-webkit-min-device-pixel-ratio: 1.5),

// only screen and (min--moz-device-pixel-ratio: 1.5),

// only screen and (-o-min-device-pixel-ratio: 1.5/1),

// only screen and (min-resolution: 144dpi),

// only screen and (min-resolution: 1.5dppx)': {

// 'width': '200px',

//}

retinaImage为高分屏和低分屏设置不同的背景图。

const styles = {

...polished.retinaImage('my-img')

};

// 返回值

// backgroundImage: 'url(my-img.png)',

// '@media only screen and (-webkit-min-device-pixel-ratio: 1.3),

// only screen and (min--moz-device-pixel-ratio: 1.3),

// only screen and (-o-min-device-pixel-ratio: 1.3/1),

// only screen and (min-resolution: 144dpi),

// only screen and (min-resolution: 1.5dppx)': {

// backgroundImage: 'url(my-img_2x.png)',

// }

7、

polished.js提供的其他方法如下,详细用法请参考文档。

normalize():样式表初始化

placeholder():对 placeholder 伪元素设置样式

selection():对 selection 伪元素设置样式

darken():调节颜色深浅

lighten():调节颜色深浅

desaturate():降低颜色的饱和度

saturate():增加颜色的饱和度

opacify():调节透明度

complement():返回互补色

grayscale():将一个颜色转为灰度

rgb():指定红、绿、蓝三个值,返回一个颜色

rgba():指定红、绿、蓝和透明度四个值,返回一个颜色

hsl():指定色调、饱和度和亮度三个值,返回一个颜色

hsla():指定色调、饱和度、亮度和透明度三个值,返回一个颜色

mix():混合两种颜色

em():将像素转为 em

rem():将像素转为 rem

目前,polished.js只是1.0版,以后应该会有越来越多的方法。

8、

polished.js还有一个特色:所有函数默认都是柯里化的,因此可以进行函数组合运算,定制出自己想要的函数。

import { compose } from 'ramda';

import { lighten, desaturate } from 'polished';

const tone = compose(lighten(10), desaturate(10))

上面代码使用 Ramda 函数库完成组合运算。Ramda 的用法可以参考我写的教程。

python 阮一峰_阮一峰:前端框架 React 及 CSS in JS相关推荐

  1. 陈本峰:HTML5跨屏前端框架Amaze UI的开源之道

    编者按 \\ 对陈本峰的采访,源于技术圈内的一个饭局,虽然大家对他的云适配创业经历很感兴趣,但是他却在自我介绍中反复提到了"开源"和"Amaze UI",言谈举 ...

  2. 参考框架 系统 基准_带有基准的前端框架的真实比较(2018更新)

    参考框架 系统 基准 by Jacek Schae 由Jacek Schae 带有基准的前端框架的真实比较(2018更新) (A Real-World Comparison of Front-End ...

  3. Python自动化开发课堂笔记【Day13】 - 前端补充(HTML CSS)

    伪类 1. anchor伪类:专用于控制链接的显示效果 a:link(没有接触过的链接),用于定义了链接的常规状态.a:hover(鼠标放在链接上的状态),用于产生视觉效果.a:visited(访问过 ...

  4. 参考框架 系统 基准_带有基准的前端框架的实际比较

    参考框架 系统 基准 by Jacek Schae 由Jacek Schae 带有基准的前端框架的实际比较 (A Real-World Comparison of Front-End Framewor ...

  5. agilebpm脑图_设计开发平台前端框架介绍 | AgileBPM 敏捷工作流开发平台—开源免费-基于 Activiti 工作流引擎、Flowable...

    目前设计平台前端是独立部署的,引入了 Angular 和 Vue,您可以根据自己技术强项 选择使用 Angular 或者 Vue,他们引入的成本都很小. 比如我们团队使用 Angular 很多年了,依 ...

  6. jquery 替换括号里面内容_【推荐】前端框架 Bootstrap 5.0 alpha 发布,不再依赖 jQuery...

    来源:https://www.oschina.net/news/116540/bootstrap-5-0-alpha-released Bootstrap 团队发布了 Bootstrap 5 的 Al ...

  7. layui框架和vue哪个好_小颖的前端框架

    前端已经不再像以前一样就是简单的写写页面和调调样式而已,现在的前端越来越复杂,知识点越来越丰富. 要做WEB前端,就需要知道前端到底是什么,需要学习那些知识:前端至少要懂的三个部分:HTML,CSS, ...

  8. css和js优化_如何为更快的站点优化CSS和JS

    css和js优化 This article was sponsored by Aussie Hosting. Thank you for supporting the partners who mak ...

  9. 前端dashboard框架_后台管理系统,前端框架用什么最好?

    当你写项目的时候,如何快速的完成一个项目的搭建,这个时候就需要借助到一些模板了,前端开发的一个好处就是,各类UI模板都是相当的齐全的,直接拿来用就可以了,脱离了一行又一行垒代码的繁琐的工作,以下的开源 ...

最新文章

  1. 【UML建模】机房中的UML图
  2. win2003辅助域服务器相关几个错误日志的解决办法
  3. mysqldump定时备份数据库
  4. 算法------长度最小的子数组
  5. Dapper 多数据库优化
  6. STL_vector
  7. Zigbee在.Net Micro Framework系统中的应用
  8. java五子棋以当前空位为中心 取9个点_java 五子棋有点问题,哪位帮忙破一下、、...
  9. starUML--面向对象的设计过程
  10. spring mvc+junit
  11. 给nodejs应用的package.json添加Redis服务的依赖
  12. 中文python笔记_python 中文编码笔记
  13. 【ESSD技术解读-04】ESSD Auto PL规格,引领IO性能弹性新方向
  14. C/C++获取CPU相关信息(非WMI)
  15. 起点文学网ViewState解码分析后的结果研究
  16. 摆脱jquery,用自己的JS库实现ajax功能
  17. Mysql优化(出自官方文档) - 第六篇
  18. java多线程调度_Java多线程:生命周期,实现与调度
  19. CSS实现文字半透明显示在图片上方法
  20. 染布厂ERP、染厂ERP、漂染厂ERP、纺织印染ERP生产管理系统

热门文章

  1. 史上最简单易记的正则表达式学法,没有之一
  2. JAVA_KEYTOOL_生成秘钥_一蓑烟雨任平生
  3. RNG-KBQA: Generation Augmented Iterative Ranking forKnowledge Base Question Answering (ACL2022)
  4. 魅族MX4升级包版本过旧,请使用最新的升级包升级
  5. Win11 如何查看文件夹被哪个进程占用
  6. 实训程序:用户登陆注册,实现宠物的领养
  7. 高频电路布线在PCB设计中要注意的技巧
  8. UE4程序如何实时显示帧数
  9. Java版颈椎自动矫正图
  10. 织梦php页面中调用标签,织梦dede:php标签中调用其他普通标签和页面相关变量及全局配...