有没有办法将变量从javascript导入sass,反之亦然?

Jer*_*ith 21 javascript css sass

我正在制作一个依赖于块概念的css网格系统.所以我有一个基本文件,如:

$max-columns: 4;
$block-width: 220px;
$block-height: 150px;
$block-margin: 10px;
Run Code Online (Sandbox Code Playgroud)

它由mixin使用:

@mixin block ($rows, $columns, $max-columns) {
  display: block;
  float: left;
  margin: $block-margin 0 0 $block-margin;
  box-sizing: border-box;
  width: ($block-width * $columns) - $block-margin;
}
Run Code Online (Sandbox Code Playgroud)

但我也想让javascript访问基本文件中的变量.我在想我可以创建一个不可见的div,并给它$ block-width,$ block-height和$ block-margin属性并从那里拉取值.但是max-columns,并没有直接映射到任何东西,所以我必须想出一个hacky方法来在div中渲染它.有没有更简洁的方法来分享从sass/css到javascript的值,反之亦然?

eri*_*icx 10

我认为我的解决方案非常好; 但它确实有效......

在我的_base.scss我定义了一些变量:

$menu_bg: rgb(45, 45, 45);
$menu_hover: rgb(0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

menu.scss我有:

@import "base";

#jquery_vars {
  .menu_bg {
    background-color: $menu_bg;
  }
  .menu_hover {
    background-color: $menu_hover;
  }
}
Run Code Online (Sandbox Code Playgroud)

并在一个方便的页面模板中:

<span class="is_hidden" id="jquery_vars">
  <span class="is_hidden menu_bg"></span>
  <span class="is_hidden menu_hover"></span>
</span>
Run Code Online (Sandbox Code Playgroud)

最后,这允许在附近的jQuery脚本中:

var menu_bg = $('#jquery_vars .menu_bg').css("background-color");
var menu_hover = $('#jquery_vars .menu_hover').css("background-color");
Run Code Online (Sandbox Code Playgroud)

这太丑了我爸爸头上戴着一个包.

jQuery可以从页面元素中提取任意CSS值; 但这些元素必须存在.我尝试从原始CSS中提取一些这些值而不在HTML中创建跨度并且jQuery想出了undefined.显然,如果将这些变量分配给页面上的"真实"对象,则实际上并不需要任意#jquery_vars元素.与此同时,人们可能会忘记这.sidebar-left nice-menu li是将变量提供给jQuery的重要元素.

如果有人有别的东西,它必须比这更干净......

  • 这太恶心了。 (3认同)

fut*_*pib 6

sass-ffi应该可以解决问题,但方式相反(从 JS 到 SASS/SCSS)。它将定义一个名为 的函数ffi-require,它允许您require从 SASS获取.js 文件:

config.js

module.exports = {
     maxColumns: 4,
};
Run Code Online (Sandbox Code Playgroud)

style.scss

$max-columns: ffi-require('./config', 'maxColumns');
Run Code Online (Sandbox Code Playgroud)

sass-loader(webpack) 和node-sass.


Cor*_*bba 5

您可以使用服务器端脚本读取sass文件,"解析"它并回显javascript所需的值.


vel*_*lop 5

如果使用webpack,则可以使用sass-loader导出变量,例如:

$animation-length-ms: $animation-length + 0ms;

:export {
  animationMillis: $animation-length-ms;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样导入

import styles from '../styles/animation.scss'    
const millis = parseInt(styles.animationMillis)
Run Code Online (Sandbox Code Playgroud)

https://blog.bluematador.com/posts/how-to-share-variables-between-js-and-sass/

  • 这!这应该是公认的答案。我建议在导出时剥离单元,如 `:export {animationMillis: strip-unit($animation-length-ms);}` 和 [strip-unit](https://css-tricks.com/snippets/sass /strip-unit-function/) 因此我们可以直接将变量用作数字,而不需要解析字符串。 (2认同)
  • 在我的环境中不起作用,运行“webpack@5.45.1”、“sass-loader@12.1.0”和“node-sass@6.0.1”。变量“styles”被记录为“undefined”,因此我无法访问“:export”中声明的变量。有任何想法吗? (2认同)
  • @ChandlerBing 使用“webpack@5.79.0”、“sass-loader@13.2.2”和“node-sass@8.0.0”进行了一些测试。显然,只有当“:export”值的 SCSS 文件命名为“&lt;anything&gt;.modules.scss”时,它才有效,否则导入会产生“undefined”值。 (2认同)