JavaScript 如何与 CSS 和 Sass 共享数据

CSS 自定义属性现在也不算什么稀罕物了。自从浏览器开始支持以来,就能通过 JavaScript 操作自定义属性值。

具体来说,用 JavaScript 操作自定义属性有以下几种方式。第一个是 setProperty :

<span class="hljs-built_in">document.documentElement.style.setProperty(<span class="hljs-string">"--padding", <span class="hljs-number">124 + <span class="hljs-string">"px"); </span></span></span></span>

还可以用 getComputedStyle ,原因很简单:自定义属性也是样式的一部分,因此也属于计算样式的一部分。

<span class="hljs-selector-tag">getComputedStyle(document.documentElement)<span class="hljs-selector-class">.getPropertyValue(<span class="hljs-string">'--padding') </span></span></span>

同样,还可以用 getPropertyValue 。它可以获取 html 元素的行内样式值:

<span class="hljs-built_in">document.documentElement.style.getPropertyValue(<span class="hljs-string">"--padding'"); </span></span>

注意,自定义属性是有作用域的。也就是说必须从指定元素获取计算后的样式。前面由于我们是 在 :root 里定义的变量,因此要从这个 html 元素上获取。

Sass 变量

Sass 是预处理语言,最终要转换成 CSS 才能应用到网站页面上。所以,像 CSS 自定义属性那样用 JavaScript 直接操作是行不通的。

为此,我们需要修改下构建流程。这一步可能不是必须的,因为大部分构建流程配置都已经包含了这些 loader。如果你的项目配置里没有的话,就需要加上如下的 webpack 配置:

<span class="hljs-attr">module.exports = {<br> // ...<br> module: {<br>  rules: [<br>   {<br>    test: /\.scss$/,<br>    use: [<span class="hljs-string">"style-loader", <span class="hljs-string">"css-loader", <span class="hljs-string">"sass-loader"]<br>   },<br>   // ...<br>  ]<br> }<br>}</span></span></span></span>

为了让 Sass(准确地说这里是 SCSS)变量在 JavaScript 里可用,我们需要将其导出( export ):

// variables.scss<br><span class="hljs-variable">$primary-color: </span>

这里的 :export 部分是黑魔法所在,webpack 就是用它来导入变量的。这种方法的妙处是可以用 camelCase 格式重命名变量,并可以选择要导出的变量。

然后把 Sass 文件( variables.scss )导入到 JavaScript,这样就可以访问文件里的变量了。神不神奇,意不意外?

<span class="hljs-keyword">import variables <span class="hljs-keyword">from <span class="hljs-string">'./variables.scss';<br><br>/*<br> {<br>  primaryColor: <span class="hljs-string">"#fe4e5e"<br>  backgroundColor: <span class="hljs-string">"#fefefe"<br>  padding: <span class="hljs-string">"124px"<br> }<br>*/<br><br>document.getElementById(<span class="hljs-string">"app").style.padding = variables.padding;<br></span></span></span></span></span></span></span>

值得一提的是, :export 语法有一些限制:

  • 可以在文件里的任何位置,但必须位于顶层
  • 如果文件里有多个,这些键和值会合并在一起导出
  • 如果某个 exportedKey 有重复,后面的会覆盖前面的
  • exportedValue 可以包含 CSS 声明中的任意有效字符(包括空格)
  • exportedValue 不需要加引号,因为它已经被处理成字符串了。

在 JavaScript 中访问 Sass 变量的应用场景有哪些呢?其中一个是共享媒体查询中的断点配置。比如这里的 breakpoints.scs 文件,可以用于 JavaScript 中的 matchMedia() 方法,来保持断点设置的一致性。

/<span class="hljs-regexp">/&#x5B9A;&#x4E49;&#x65AD;&#x70B9;&#x7684; Sass &#x53D8;&#x91CF;<br><span class="hljs-regexp">$breakpoints: (<br><span class="hljs-regexp">  mobile: 375px,<br><span class="hljs-regexp">  tablet: 768px,<br><span class="hljs-regexp">  /<span class="hljs-regexp">/ etc.<br><span class="hljs-regexp">);<br><br><span class="hljs-regexp">/<span class="hljs-regexp">/ &#x7528;&#x4E8E;&#x5A92;&#x4F53;&#x67E5;&#x8BE2;&#x7684; Sass variables <br><span class="hljs-regexp">$media: (<br><span class="hljs-regexp">  mobile: '(max-width: <span class="hljs-subst">#{map-get($breakpoints, mobile)})',<br><span class="hljs-regexp">  tablet: '(max-width: <span class="hljs-subst">#{map-get($breakpoints, tablet)})',<br><span class="hljs-regexp">  /<span class="hljs-regexp">/ etc.<br><span class="hljs-regexp">);<br><br><span class="hljs-regexp">/<span class="hljs-regexp">/ &#x5BFC;&#x51FA;&#x90E8;&#x5206;<br><span class="hljs-regexp">:export {<br><span class="hljs-regexp">  breakpointMobile: unquote(map-get($media, mobile));<br><span class="hljs-regexp">  breakpointTablet: unquote(map-get($media, tablet));<br><span class="hljs-regexp">  /<span class="hljs-regexp">/ etc.<br><span class="hljs-regexp">}<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

动画是另一个应用场景。动画的持续时间通常保存在 CSS 中,但是更复杂的动画可能需要 JavaScript 来实现。

// animation.scss<br><span class="hljs-variable">$global-animation-duration: 300ms;<br><span class="hljs-variable">$global-animation-easing: ease-in-out;<br><br>:<span class="hljs-built_in">export {<br>  animationDuration: strip-unit(<span class="hljs-variable">$global-animation-duration);<br>  animationEasing: <span class="hljs-variable">$global-animation-easing;<br>}<br></span></span></span></span></span>

注意,这里在导出变量时用了 strip-unit 函数,目的是为了去掉单位,方便在 JavaScript 里转换数字。

<span class="hljs-string">// <span class="hljs-string">main.<span class="hljs-string">js</span><br><span class="hljs-string">document.getElementById('image').animate([<br>  { <span class="hljs-attr">transform: <span class="hljs-string">'scale(1)', <span class="hljs-attr">opacity: <span class="hljs-number">1, <span class="hljs-attr">offset: <span class="hljs-number">0 }<span class="hljs-string">,<br>  { <span class="hljs-attr">transform: <span class="hljs-string">'scale(.6)', <span class="hljs-attr">opacity: <span class="hljs-number">.6, <span class="hljs-attr">offset: <span class="hljs-number">1 }<br><span class="hljs-string">], {<br>  <span class="hljs-attr">duration: <span class="hljs-string">Number(variables.animationDuration),<br>  <span class="hljs-attr">easing: <span class="hljs-string">variables.animationEasing,<br>}<span class="hljs-string">);<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

还有一个是 echarts 图系列的颜色列表。比如饼图的各个部分用的颜色序列,可能也要在图之外使用。为了便于维护,最好是定义在同一个地方。

总之,这样就可以轻松地实现 CSS、Sass 和 JavaScript 之间交换数据,确实挺不错。变量共享让代码变得更简单,实现了 DRY(Dont’ Repeat Yourself)。

Original: https://www.cnblogs.com/Qooo/p/15144134.html
Author: 酷儿q
Title: JavaScript 如何与 CSS 和 Sass 共享数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535922/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 面向对象的JavaScript-001

    一、 Question是父类,MultipleChoiceQuestion和DragDropQuestion是子类 二、 1. 1 You can do anything you …

    JavaScript 2023年5月29日
    069
  • JavaScript 反射和属性赋值!

    function Antzone(){ this.webName="蚂蚁部落"; this.age=6; } Antzone.prototype={ addre…

    JavaScript 2023年5月29日
    078
  • 理解Javascript执行过程

    Javascript是一种解释型的动态语言。 在程序中,有编译型语言和解释型语言。那么什么是编译型语言,什么是解释型语言呢? 编译型语言: 它首先将源代码编译成机器语言,再由机器运…

    JavaScript 2023年5月29日
    054
  • JavaScript常用单词整理总结

    第一章 object对象undefined未定义变量boolean布尔类型sort()对数组排序charAt返回在指定位置的字符toLowerCase()把字符串转换为小写butt…

    JavaScript 2023年5月29日
    072
  • 你不知道的 JavaScript 系列中( 33 ) - try…finally 和 switch 要注意的地方

    try..finally try..finally 中finally 中的代码总是会在 try 之后执行,如果有 catch 的话则在 catch 之后执行。也可以将 finall…

    JavaScript 2023年5月29日
    056
  • [JavaScript]Promise:异步编程

    1 文由 某项目的需求:先要请求API1,再以API1的结果请求API2. var n, a; //var r = window.md5; var r = function (pa…

    JavaScript 2023年5月29日
    067
  • .net中javascript去调用webservice

    在.net中,可以将一个WEBSERVICE注明是暴露给javascript去调用,比如[System.Web.Script.Services.ScriptService]publ…

    JavaScript 2023年5月29日
    051
  • JavaScript 图片滑动切换效果

    序一(08/07/06) 看到alibaba的一个图片切换效果,感觉不错,想拿来用用。但代码一大堆的,看着昏,还是自己来吧。由于有了做图片滑动展示效果的经验,做这个就容易得多了。 …

    JavaScript 2023年5月29日
    068
  • JavaScript 图片滑动展示效果

    更新版本:SlideView 图片滑动(扩展/收缩)展示效果 看到jQuery实例:图片展示效果后,我也想拿来试试,但我不太喜欢用框架,所以自己做了个。其中的难点在于怎么设计各个滑…

    JavaScript 2023年5月29日
    062
  • javascript运行机制与原理

    本文将从浏览器进程,到浏览器内核运行,到JS引擎单线程,再到JS事件循环机制,系统梳理js的运行机制和原理,形成一个知识体系 区分进程和线程 线程和进程区分不清,是很多新手都会犯的…

    JavaScript 2023年5月29日
    072
  • JavaScript blog式日历控件

    近来要做一个记事本系统,想找一个合适的日历控件,但网上的都是那种日历选择控件。于是到qq的记事本系统找了一个,但里面的算法有点落后,所以用了它的样式自己写了个。 效果: <&…

    JavaScript 2023年5月29日
    073
  • JavaScript统计数据处理(7)- 一维数据生成

    JavaScript是一种广泛使用网页编程语言,在浏览器中运用JavaScript技术处理统计数据具有最佳的推广传播效果 一维数据又称一元数据,是由对等关系的有序或无序信息构成,采…

    JavaScript 2023年5月29日
    0105
  • JavaScript 代码加不加分号有什么区别

    这个问题在很多文章中都讨论过,在 ESlint 规范中也因为加不加分号而分为两大阵营,到于加不加分号,关键是需要了解分号对于 JavaScript 的影响,开始之前可以先看看下面这…

    JavaScript 2023年5月29日
    072
  • 桶排序JavaScript

    // 桶排序 // 公式 // 桶的数量 = ((最大值 – 最小值)/ 数组长度) + 1 // 元素所属桶的位置 =( 元素大小 – 最小值)/ 数组长度 function b…

    JavaScript 2023年5月29日
    057
  • JavaScript的Prototype实现

    JavaScript的Prototype实现 作者:Jeff.Yan(阎宏),BlueSwing.Liu(刘如鸿) 模式: Prototype(原始模型模式或者原型模式) 定义: …

    JavaScript 2023年5月29日
    078
  • java springboot 方法返回 header, javascript 可访问

    var servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestA…

    JavaScript 2023年5月29日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球