在styled-components的样式声明中做px到rem的自动转换

2023-11-11

原文地址
最近在尝试使用styled-components来做React下的样式开发,这样可以利用js语言的灵活来增强css的能力。

在用styled-components处理px到rem的转换时,有点问题了。styled-components自己本着基础库的原则,是没有附加复杂的配置,所以一开始想的是自己写一个函数来做单位换算:

function r(pxValue) {
    const ratio = 20; // 根据项目配置比例的方式自行设定
    pxValue = parseInt(pxValue);

    return pxValue / ratio + 'rem';
}

然后在写样式的时候这样写

// 保留了px的单位而不是传递数字,使得代码具有可读性,方便维护

let AvatarImage = styled(Image)`
    width: ${r('132px')}; 
    height: ${r('132px')};
`;

这样满足了基本需求。

不过作为喜欢偷懒喜欢折腾的程序员,总觉得这样写很啰嗦,所以想着能不能也跟styled-components那样使用标签模版的功能

所以也就有了第二版的function r:

function r(pxValue) {
    const ratio = 20; // 根据项目配置比例的方式自行设定

    // 针对template literals
    if (Array.isArray(pxValue)) {
        pxValue = pxValue[0];
    }

    pxValue = parseInt(pxValue);

    return pxValue / ratio + 'rem';
}

在样式书写上,就可以这样写了:

let AvatarImage = styled(Image)`
    width: ${r`132px`};
    height: ${r`132px`};
`;

少写了两个括号,看着也清晰多了。

不过还是不太满意,因为样式里面如果数值一多,写起来还是有点费事。

既然能够实现单个单位的换算,那用正则表达式匹配所有样式字符串里面的px值,再替换为rem值,再把计算的结果返回给styled-components不就可以了。

想法是好的,不过在读取解析已有的样式模版字符串,正则匹配,还有如何把结果传递给styled-components这些方面,坑还是很多的,折腾了一个多小时,也总算解决了。

这里面,最核心的解析已有的样式模版字符串,styled-components提供了一个helper: css,使得工作量大大减少。

function r(pxValue) {
    const ratio = 20; // 根据项目配置比例的方式自行设定

    // 针对template literals
    if (Array.isArray(pxValue)) {
        pxValue = pxValue[0];
    }

    pxValue = parseInt(pxValue);

    return pxValue / ratio + 'rem';
}

// 把字符串样式里面的px单位换算成rem的
// 支持多行匹配

function transformPxToRem(style) {
    // 避免处理了函数等情况
    if (typeof style !== 'string') {
        return style;
    }

    return style.replace(/\d+px/gm, matched => {
        return r(matched);
    });
}

// 实现在把样式传递给styled之前,预先用transformPxToRem处理

function t(strings, ...interpolations) {
    let styles = css(strings, ...interpolations); // css是styled-components的一个helper
    styles = styles.map(transformPxToRem);

    // 模拟raw的调用
    return [[""], styles]
};

基于以上代码,在最终书写样式的时候就可以这样:

let AvatarImage = styled(Image)(...t`
    width: 132px;
    height: 132px;
`);

以函数的形式调用styled-compoent,而不是标签模版的形式,同时解构t函数的返回值,这样的结果和styled-components直接计算标签模版是一样的。

不过在实现这个功能之后,在写这篇文章的时候,发现lib-flexible不再用rem作为多端适配的方案了,而是改用的vm

不过最核心的预处理部分已经实现了,后面的调整还是很容易做的。

后期的计划:

现在css helper返回的是一个数组,可以考虑join成字符串,去掉多余的空白符,然后实现css to object和object to css。然后再加上plugin机制,使得整个系统更加灵活多变。

说着说着,好像实现了一个简版的postCss。

现在styled-components是有增加babel plugin的计划来打通postCss和styled-compoent,期待。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在styled-components的样式声明中做px到rem的自动转换 的相关文章

随机推荐

  • layer好看的弹出文本框

    layer open type 1 title 料架列表 skin layui layer rim 加上边框 area 300px 350px 宽高 shadeClose true skin yourclass content inLj c
  • 手写实现next_permutation(全排列)

    next permutation函数 需要加头文件
  • 绘制思维导图用什么软件?告诉你三个实用的软件

    思维导图是一种有效的思维模式 应用于记忆 学习 思考等的思维 地图 有利于人脑思维的扩散 如今市面上能够辅助我们更好地锻炼大脑 产出思维导图的工具数不胜数 但不同人群的使用不同 适配的软件也不尽相同 那么今天就让我来告诉你电脑好用的思维导图
  • 蚂蚁区块链第17课 错误码指导大全

    1 摘要 本文介绍蚂蚁区块链的错误码按出错来源分为5类 平台校验错误码 虚拟机错误码 区块链错误码 客户端系统错误码 TEE 错误码 并给出了具体的错误码值和解释说明 2 错误码大全 2 1 平台校验错误码 错误码 错误码值 错误消息 描述
  • [Django] Django基础环境配置

    step1 设置python 虚拟环境并激活 然后安装Django开发版本 这里可以本人参考博客 step2 新建项目 之前安装Django以及虚拟环境都是在C盘下处理的 在这里用D盘存储项目 出现小插曲 C Users 用户名 gt d
  • 2023高教社杯数学建模思路 - 案例:FPTree-频繁模式树算法

    文章目录 算法介绍 FP树表示法 构建FP树 实现代码 建模资料 赛题思路 赛题出来以后第一时间在CSDN分享 https blog csdn net dc sinor type blog 算法介绍 FP Tree算法全称是Frequent
  • MySQL基础篇-第15章_存储过程与函数

    第15章 存储过程与函数 讲师 尚硅谷 宋红康 江湖人称 康师傅 官网 http www atguigu com MySQL从5 0版本开始支持存储过程和函数 存储过程和函数能够将复杂的SQL逻辑封装在一起 应用程序无须关注存储过程和函数内
  • vue动态添加路由清空路由

    刚做的项目分多个模块 点击后再查询菜单 动态加进路由 直接动态添加则爆出警告信息 路由重复 于是乎想到了先清空路由 resetRouter const newRouter new Router mode hash scrollBehavio
  • TortoiseGit清除账号密码

    开发十年 就只剩下这套Java开发体系了 gt gt gt 1 编辑系统配置 2 删除配置信息 3 删除 git credentials 一般在c盘的用户目录下
  • pytorch怎么加入环境变量_pytorch安装(使用pip3装到conda环境下)(示例代码)

    之前在windows上使用pip3的方式安装过pytorch 虽然偶尔也会HTTP Error 安装失败 但是基本还是可以安装成功的 上 这一次在ubuntu上装了anaconda 想着之后的库都用conda安装 而不使用ubuntu自带的
  • 序(为什么要抄unreal源码)

    unreal所有源码很长 几百万行 一辈子也抄不完 然而 ue4 0版本的runtime只有1887个文件 251043行 不算第三方库 可以只按照渲染相关部分抄写一下 然后 逐版本增补 只需要关注渲染部分 和工作中用到的插件 还是可以的
  • 深入剖析Kubernetes之控制器模式的实现-Job与CronJob

    文章目录 Job CronJob Deployment StatefulSet 以及 DaemonSet 这三个编排概念 它们主要编排的对象 都是 在线业务 即 Long Running Task 长作业 比如 常用的 Nginx Tomc
  • 深度学习常见术语及作用--个人笔记

    1 池化层 提取重要信息 去掉不重要信息 减少参数 减少计算开销 防止过拟合 2 全连接层 FC 在整个卷积神经网络起 分类器 的作用 3 激活函数 给神经元引入了非线性因素 进而提升网络的表达能力 4 backbone 主干 骨干 网络
  • 快速查找Unity死循环

    我们先建立一个新工程 新建C 文件 然后在Start函数中加入以下代码 void Start while true int i 1 把这个C 文件挂到场景摄像机或其它GameObject上 打开这个工程对应的VS工程 如何用VS编辑unit
  • Spring DataBinding

    1 用 ModelAttribute注释方法 1 1 ModelAttribute和 RequestMapping同时注释一个方法 span style font size 14px RequestMapping method Reques
  • 送书

    六月 初夏 高考结束 毕业季到来 准大学生纠结选什么专业 毕业生迈进就业大军 不论什么身份 大家都在思考着同一件事情 当下什么能力最热门 想要得到答案很简单 打开任意一款求职软件 热门岗位的职位简介中都少不了这一项 数据分析能力 4月20日
  • 笔记&代码

    1 1数据与统计学 统计学的含义 数据及其分类和来源 1 1 1 什么是统计学 收集数据 数据分析 描述统计 利用图表 计算简单统计量 推断统计 根据样本判断总体 参数估计和假设检验 1 1 2 变量与数据 变量 数据 变量的观测结果就是数
  • TCP详解之重传机制

    TCP详解之重传机制 TCP 实现可靠传输的方式之一 是通过序列号与确认应答 在 TCP 中 当发送端的数据到达接收主机时 接收端主机会返回一个确认应答消息 表示已收到消息 但在错综复杂的网络 并不一定能如上图那么顺利能正常的数据传输 万一
  • OpenGL ES 着色器(shader)介绍

    1 Shader Shader其实就是一段执行在GPU上的程序 此程序使用OpenGL ES SL语言来编写 它是一个描述顶点或像素特性的简单程序 在opengles中常用的shader有两种 vertex shader和fragment
  • 在styled-components的样式声明中做px到rem的自动转换

    原文地址 最近在尝试使用styled components来做React下的样式开发 这样可以利用js语言的灵活来增强css的能力 在用styled components处理px到rem的转换时 有点问题了 styled component