我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何通过CSS向JS传参

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何通过CSS向JS传参

这篇文章主要介绍了如何通过CSS向JS传参,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一、需要通过CSS传参的背景

CSS中有很多媒体查询的用法,例如设备尺寸判别,是否支持鼠标行为,是否是黑暗模式,是否是省电模式等。

比方说最近经常提到的黑暗模式,深色主题:

@media (prefers-color-scheme: dark) {    }@media (prefers-color-scheme: light) {    }

CSS可以自动检测,但是有时候,在JS中,我们也需要根据不同的系统主题,然后实现不同的交互逻辑,或者渲染出不一样的内容。

怎么办?似乎一时间也找不到现成的JS API来检测系统模式,只能借助于CSS中传参了。这就是一个典型的场景,类似的场景还有很多。

例如:

1. CSS和JS边界宽度一致性

我们在做响应式布局的时候,经常会需要设定一个临界宽度值,例如当设备的宽度小于640像素的时候,我们就认为是进入了移动端;或者是宽度小于480的像素的时候,就使用移动端布局等。

此时,JavaScript代码也需要根据这个临界宽度实现不同的交互效果,大于多少的时候是PC的交互,小于多少的时候是移动端布局下的交互。

很多人在实际开发的时候就CSS代码和JS代码约定一下,例如:

@media screen and (max-width: 480px) {    }if (screen.width < 480) {    }

要是这种约定会有一个问题,等项目过了一段时间之后,发现这个临界宽度有问题,比方说手机横屏的时候,它的宽度是大于 480px 的,也应该是移动端的布局方式,于是开发就改成了 640px 。

@media screen and (max-width: 640px) {    }

结果忘记JS代码中也有这一茬判断,结果就会出现bug。

如果原先实现的时候,我们的JavaScript代码中的屏幕判断是基于CSS传参的话,那就不会有这样子的维护问题出现。

2. 浏览器是否支持:hover伪类交互

我们会开发一些ui组件,希望在桌面端和移动端,以及物联网设备上通用。

有些组件在桌面当我们使用 mouseenter 或者 mouseover 事件来实现体验还是很不错的,非常便捷。但是如果这些东西用在移动端以及其他一些触屏设备上,则这个世界就有问题啊,因为没有这种hover的说法。

好在CSS代码中是有关于浏览器是否支持:hover伪类交互媒体查询判断(此查询有专门文章介绍,点击这里):

@media (any-hover: none) {    }

可惜JS中并没有这样的API直接判断。很多人应该是通过判断浏览器是否支持 touchstart 之类的事件来进行判断的。不过可惜这种判断方法是不准确的。因为很多触摸设备也是可以连接鼠标设备的,此时hover事件也应该被良好支持。

因此,最后的方法还是通过CSS媒体查询判断,然后把这个判断结果以参数形式传递给js。

好啦,下面问题来了,上面举了这三个案例,我们如何通过CSS把我们的参数传递给JS代码呢?

二、CSS传参给JS的方法

通常借助CSS向JS传参,我都是使用下面这两种方法。

1. content伪元素内容传参

例如:

@media (any-hover: none) {    body::before {        content: 'hoverNone';        display: none;    }}

此时就可以通过JS代码获取body伪元素传递的信息是什么了:

var strContent = getComputedStyle(document.body, '::before').content;// strContent结果是'none'则表示支持hover// strContent结果是'"hoverNone"'则表示不支持hover经过,需要换成click事件

本文就预埋了上面这样的CSS代码,因此,Chrome浏览器下,打开控制台,进入移动端预览模式,输入JS测试下,可以看到我们CSS传递的字符串信息被JS获取到了。

如何通过CSS向JS传参

此时,我们就可以根据 ::before , ::after 伪元素配合 content 属性,获知CSS中传递的信息了。

这种传参方式的优点在于兼容性相对较好,但是不足却也很明显,那就是我们传递的参数值的数量是有限的,如果我们想一次性传多个值,就有些捉襟见肘,此时可以试试下面这种方法,借助CSS自定义属性。

2. CSS自定义属性(CSS变量)传参

直接上代码,有了 CSS自定义属性(CSS变量) ,黑暗模式和浅色模式的开发和维护工作就变得相对容易很多,除此之外,这个CSS自定义属性我们还可以用来给JS做模式识别。

:root {    --mode: 'unknown';}@media (prefers-color-scheme: dark) {        :root {         --mode: 'dark';         --colorLink: #bfdbff;         --colorMark: #cc0000;         --colorText: #ffffff;         --colorLight: #777777;    }}@media (prefers-color-scheme: light) {        :root {         --mode: 'light';         --colorLink: #34538b;         --colorMark: #cc0000;         --colorText: #000000;         --colorLight: #cccccc;    }}

JS检测代码:

var mode = getComputedStyle(document.documentElement).getPropertyValue('--mode').trim();// mode结果是'"dark"'则表示黑夜主题,深色模式,黑暗风格,护眼模式。// mode结果是其他表示默认模式

例如在我这个电脑上运行的结果是下图这个:

如何通过CSS向JS传参

在Mac OS X或者移动端设备上应该会显示其他的值,欢迎帮忙测试截个图发我,我更新到文章中。

使用CSS自定义属性传统的好处是非常灵活,我们可以定义很多很多的变量都可以。而且其实我们也没有任何必要担心兼容性的问题。为什么呢?因为凡是支持黑夜模式的设备浏览器,一定支持CSS自定义属性。

因此,综合来看,使用CSS自定义属性传参在黑暗模式这个场景中是最佳的实现。但是,如果是基于设备宽度传参响应式布局这场场景,还是使用CSS content 属性传参为佳。

感谢你能够认真阅读完这篇文章,希望小编分享的“如何通过CSS向JS传参”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何通过CSS向JS传参

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何通过CSS向JS传参

这篇文章主要介绍了如何通过CSS向JS传参,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、需要通过CSS传参的背景CSS中有很多媒体查询的用法,例如设备尺寸判别,是否支持鼠
2023-06-08

vue中如何通过函数传参数

这篇文章主要介绍了vue中如何通过函数传参数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-14

SpringCloud如何通过Feign传递List类型参数

小编给大家分享一下SpringCloud如何通过Feign传递List类型参数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过Feign传递List类型参数首先
2023-06-29

SpringBoot如何通过Feign调用传递Header中参数

这篇文章主要介绍了SpringBoot通过Feign调用传递Header中参数,本文给大家分享两种解决方案给大家详细讲解,需要的朋友可以参考下
2023-05-17

Vue路由组件如何通过props配置传参

本篇内容介绍了“Vue路由组件如何通过props配置传参”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体如下:一、基于params参数传递
2023-07-02

nginx反向代理如何传递参数

在Nginx中,可以使用proxy_set_header指令来传递参数。可以在location配置块中使用proxy_set_header指令来设置HTTP请求的头部信息。例如,假设要将请求转发到http://backend-server
2023-10-22

使用controller接收js传过来的参数问题如何解决

本文小编为大家详细介绍“使用controller接收js传过来的参数问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“使用controller接收js传过来的参数问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
2023-07-05

如何通过C#引用传递

这篇文章主要介绍“如何通过C#引用传递”,在日常操作中,相信很多人在如何通过C#引用传递问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何通过C#引用传递”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!C#
2023-06-17

wordpress如何删除css与js请求参数

本篇内容主要讲解“wordpress如何删除css与js请求参数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“wordpress如何删除css与js请求参数”吧!WordPress在php独立i
2023-07-05

python如何通过http上传文件

这篇文章主要介绍“python如何通过http上传文件”,在日常操作中,相信很多人在python如何通过http上传文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python如何通过http上传文件”的疑
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录