iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何通过CSS向JS传参
  • 430
分享到

如何通过CSS向JS传参

2023-06-08 05:06:56 430人浏览 独家记忆
摘要

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

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

一、需要通过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传参”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: 如何通过CSS向JS传参

本文链接: https://www.lsjlt.com/news/251835.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 如何通过CSS向JS传参
    这篇文章主要介绍了如何通过CSS向JS传参,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、需要通过CSS传参的背景CSS中有很多媒体查询的用法,例如设备尺寸判别,是否支持鼠...
    99+
    2023-06-08
  • vue如何通过$router.push传参数
    目录如何通过$router.push传参数this.$router.push传参及参数接收1、两种方式2、区别如何通过$router.push传参数 下面通过A页面向B页面传值来举个...
    99+
    2024-04-02
  • vue中如何通过函数传参数
    目录vue通过函数传参数vue事件函数传参总结vue通过函数传参数 一,通过点击事件本身的js特性传参。 <view class="center_menu">      ...
    99+
    2023-05-14
    vue函数传参数 vue参数 函数传参数
  • 微服务如何通过feign.RequestInterceptor传递参数
    目录微服务通过feign.RequestInterceptor传递参数创建自定义请求拦截器具体获取逻辑如下feign的拦截器RequestInterceptor首先创建自定义的Req...
    99+
    2024-04-02
  • js如何通过类来修改css样式
    本篇内容介绍了“js如何通过类来修改css样式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • SpringCloud如何通过Feign传递List类型参数
    小编给大家分享一下SpringCloud如何通过Feign传递List类型参数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过Feign传递List类型参数首先...
    99+
    2023-06-29
  • SpringBoot如何通过Feign调用传递Header中参数
    目录【SpringBoot】通过Feign调用传递Header中参数如何通过Feign传递Header参数问题描述解决方案【SpringBoot】通过Feign调用传递Header中...
    99+
    2023-05-17
    SpringBoot Feign调用传递Header参数 SpringBoot Feign调用参数
  • Vue路由组件如何通过props配置传参
    本篇内容介绍了“Vue路由组件如何通过props配置传参”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体如下:一、基于params参数传递...
    99+
    2023-07-02
  • vue怎么通过$router.push传参数
    今天小编给大家分享一下vue怎么通过$router.push传参数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。如何通过$r...
    99+
    2023-07-02
  • SpringBoot通过@MatrixVariable进行传参详解
    目录1.相关概念2.开启矩阵变量3.代码测试1.相关概念 语法: 请求路径:/person/info;name=lisi;hobbies=basketball,football,te...
    99+
    2024-04-02
  • php怎么通过url传递参数
    在PHP中,可以通过URL传递参数使用GET方法或POST方法。1. 通过GET方法传递参数:通过在URL中附加参数来传递参数,参数...
    99+
    2023-08-17
    php
  • 如何通过JS/CSS实现网页返回顶部效果
    这篇文章给大家分享的是有关如何通过JS/CSS实现网页返回顶部效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。CSS 按钮样式:#myBtn {display: none; p...
    99+
    2024-04-02
  • 如何通过php修改文件内的js和css缓存
    随着网站的不断发展,我们时常需要更新网站中的JS和CSS文件。但是我们都知道,浏览器有一个缓存机制,导致用户在浏览网站的时候,新的JS和CSS文件并没有被更新,而继续使用旧的文件,在浏览器中缓存的时间会很长,这会影响网站的用户体验。那么如何...
    99+
    2023-05-14
  • vue中怎么通过函数传参数
    本文小编为大家详细介绍“vue中怎么通过函数传参数”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue中怎么通过函数传参数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue通过函数传参数一,通过点击事件本身的...
    99+
    2023-07-05
  • 使用controller接收js传过来的参数问题如何解决
    本文小编为大家详细介绍“使用controller接收js传过来的参数问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“使用controller接收js传过来的参数问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-07-05
  • nginx反向代理如何传递参数
    在Nginx中,可以使用proxy_set_header指令来传递参数。可以在location配置块中使用proxy_set_hea...
    99+
    2023-10-22
    nginx
  • 如何通过C#引用传递
    这篇文章主要介绍“如何通过C#引用传递”,在日常操作中,相信很多人在如何通过C#引用传递问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何通过C#引用传递”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!C#...
    99+
    2023-06-17
  • python怎么通过命令行传入参数
    在Python中,可以通过`sys.argv`来获取命令行传入的参数。首先,需要导入`sys`模块:```pythonimport ...
    99+
    2023-10-08
    python
  • Ajax是通过什么给XMLHttpReq.onreadystatechange传递参数
    这篇文章主要介绍“Ajax是通过什么给XMLHttpReq.onreadystatechange传递参数”,在日常操作中,相信很多人在Ajax是通过什么给XMLHttpReq.onreadystatecha...
    99+
    2024-04-02
  • shell怎么通过makefile传参给c语言
    这篇文章主要介绍“shell怎么通过makefile传参给c语言”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“shell怎么通过makefile传参给c语言”文章能帮助大家解决问题。建立测试用例建立...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作