您现在的位置是:网站首页> 编程资料编程资料
通过CSS向JS传参的方法CSS Transition通过改变Height实现展开收起元素从QQtabBar看css命名规范BEM的详细介绍css实现两栏布局,左侧固定宽,右侧自适应的多种方法CSS 实现Chrome标签栏的技巧CSS实现两列布局的N种方法CSS实现隐藏搜索框功能(动画正反向序列)CSS3中Animation实现简单的手指点击动画的示例详解CSS中的特指度和层叠问题详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)关于CSS浮动与取消浮动的问题
2023-10-18
296人已围观
简介 CSS中有很多媒体查询的用法,例如设备尺寸判别,是否支持鼠标行为,是否是黑暗模式,是否是省电模式等。今天小编给大家介绍通过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) { /* 设备不支持hover事件 */ }可惜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获取到了。

此时,我们就可以根据 ::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结果是其他表示默认模式例如在我这个电脑上运行的结果是下图这个:

在Mac OS X或者移动端设备上应该会显示其他的值,欢迎帮忙测试截个图发我,我更新到文章中。
使用CSS自定义属性传统的好处是非常灵活,我们可以定义很多很多的变量都可以。而且其实我们也没有任何必要担心兼容性的问题。为什么呢?因为凡是支持黑夜模式的设备浏览器,一定支持CSS自定义属性。
因此,综合来看,使用CSS自定义属性传参在黑暗模式这个场景中是最佳的实现。但是,如果是基于设备宽度传参响应式布局这场场景,还是使用CSS content 属性传参为佳。
总结
以上所述是小编给大家介绍的通过CSS向JS传参的方法,希望对大家有所帮助,也非常感谢大家对网站的支持!
相关内容
- CSS网页响应式布局实现自动适配Pc/Pad/Phone设备CSS像素以及移动端不同屏幕适配问题解决postcss-pxtorem移动端适配的实现css列表滑动防止被底部遮住和适配屏幕长一点的机型处理 CSS3中媒体查询结合rem布局适配手机屏幕手机端用rem+scss做适配的详解通过CSS3的object-fit来调整图片适配尺寸的技巧简介利用css @viewport 做设备适配
- css中有序无序列表项list样式设置方法CSS字体、文本、列表属性详细介绍CSS 有序或者无序列表的前面的标记 list-style-type 属性的实现使用CSS计数器美化数字有序列表的实现方法
- 纯CSS实现鼠标放上滑动出半透明效果的文字说明(新手小白 必看)css实现背景半透明文字不透明的效果示例纯css实现背景图片半透明内容不透明的方法利用CSS3制作简单的3d半透明立方体图片展示用CSS设定一个元素半透明css3实现的半透明遮罩lightbox效果源码纯CSS实现多级半透明效果菜单代码
- 在Firefox浏览器中利用CSS窃取数据CSS Transition通过改变Height实现展开收起元素从QQtabBar看css命名规范BEM的详细介绍css实现两栏布局,左侧固定宽,右侧自适应的多种方法CSS 实现Chrome标签栏的技巧CSS实现两列布局的N种方法CSS实现隐藏搜索框功能(动画正反向序列)CSS3中Animation实现简单的手指点击动画的示例详解CSS中的特指度和层叠问题详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)关于CSS浮动与取消浮动的问题
- css3针对移动端卡顿问题的解决(动画性能优化)CSS 阴影动画优化技巧浅析与CSS3的loading动画加载相关的transition优化
- css选择器四大类:基本、组合、属性、伪类详解css3中的伪类before和after常见用法CSS伪类:empty让我眼前一亮(实例代码)浅谈CSS 伪元素&伪类的妙用CSS 伪类修改input选中样式的示例代码css伪类 右下角点击出现 对号角标表示选中的示例代码详解如何使用CSS3中的结构伪类选择器和伪元素选择器解决移动端跳转问题(CSS过渡、target伪类)css3 伪类选择器快速复习小结CSS新增的:where和:is伪类函数是什么
- border-radius IE8兼容处理的方法使用CSS的border-radius属性 设置圆弧一个关于border-radius值设置的问题记录css3 border-radius属性详解浅析border-radius如何兼容IEIE系列不支持CSS的圆角border-radius等属性的解决方案
- css3实现圆锥渐变conic-gradient效果CSS3颜色值RGBA与渐变色使用介绍css实现透明渐变特效的示例代码通过css3背景控制属性+使用颜色过渡实现渐变效果css3实现背景动态渐变效果CSS 实现渐变效果小结( linear-gradient线性渐变 和 radial-gradient径
- 疯狂猜图 一个黄色的圈里面一朵褐色的梅花 答案是什么_手机游戏_游戏攻略_
- 疯狂猜图 橙色瓶身一个闪电 答案是什么_手机游戏_游戏攻略_
