มีวิธีนำเข้าตัวแปรจาก javascript ไปยัง sass หรือในทางกลับกันหรือไม่?

ฉันกำลังสร้างระบบกริด CSS ที่ใช้แนวคิดเรื่องบล็อก ดังนั้นฉันจึงมีไฟล์ฐานเช่น:

$max-columns: 4;
$block-width: 220px;
$block-height: 150px;
$block-margin: 10px;

และมันถูกใช้โดยมิกซ์ซิน:

@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;
}

แต่ฉันต้องการให้ javascript เข้าถึงตัวแปรในไฟล์ฐานด้วย ฉันคิดว่าฉันสามารถสร้าง div ที่มองไม่เห็นและให้แอตทริบิวต์ $block-width, $block-height และ $block-margin และดึงค่าจากที่นั่น แต่คอลัมน์สูงสุดไม่ได้แมปกับสิ่งใดโดยตรง ดังนั้นฉันต้องหาวิธีแฮ็กเพื่อเรนเดอร์มันใน div มีวิธีที่สะอาดกว่าในการแบ่งปันค่าจาก sass/css ไปยัง javascript หรือในทางกลับกันหรือไม่


person Jeremy Smith    schedule 19.02.2012    source แหล่งที่มา


คำตอบ (8)


คุณสามารถอ่านไฟล์ sass ด้วยสคริปต์ฝั่งเซิร์ฟเวอร์ "แยกวิเคราะห์" และสะท้อนค่าที่คุณต้องการในจาวาสคริปต์

person Corubba    schedule 19.02.2012

หากคุณใช้ webpack คุณสามารถใช้ sass-loader เพื่อส่งออกตัวแปรเช่น:

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

:export {
  animationMillis: $animation-length-ms;
}

และนำเข้ามาเช่น

import styles from '../styles/animation.scss'    
const millis = parseInt(styles.animationMillis)

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

person velop    schedule 13.12.2017
comment
นี้! นี่ควรเป็นคำตอบที่ยอมรับได้ และฉันแนะนำให้ตัดหน่วยในการส่งออกเช่น :export { animationMillis: strip-unit($animation-length-ms);} ด้วย strip-unit เพื่อให้เราสามารถใช้ตัวแปรเป็นตัวเลขได้โดยตรงโดยไม่จำเป็นต้องแยกสตริง - person Martin; 20.05.2020
comment
โซลูชั่นที่สมบูรณ์แบบ! - person mmied; 19.04.2021

ฉันคิดว่าวิธีแก้ปัญหาของฉันค่อนข้างจะน่าเบื่อ แต่มันได้ผล...

ใน _base.scss ของฉันฉันมีตัวแปรบางตัวที่กำหนดไว้:

$menu_bg: rgb(45, 45, 45);
$menu_hover: rgb(0, 0, 0);

ใน menu.scss ฉันมี:

@import "base";

#jquery_vars {
  .menu_bg {
    background-color: $menu_bg;
  }
  .menu_hover {
    background-color: $menu_hover;
  }
}

และในเทมเพลตเพจที่มีประโยชน์:

<span class="is_hidden" id="jquery_vars">
  <span class="is_hidden menu_bg"></span>
  <span class="is_hidden menu_hover"></span>
</span>

ในที่สุดสิ่งนี้ก็อนุญาตในสคริปต์ jQuery ใกล้เคียง:

var menu_bg = $('#jquery_vars .menu_bg').css("background-color");
var menu_hover = $('#jquery_vars .menu_hover').css("background-color");

นี่มันน่าเกลียดมากที่พ่อของฉันเอาถุงคลุมหัว

jQuery สามารถดึงค่า CSS ที่กำหนดเองจากองค์ประกอบของหน้าได้ แต่องค์ประกอบเหล่านั้นจะต้องมีอยู่จริง ฉันลองดึงค่าเหล่านี้บางส่วนจาก CSS แบบ raw โดยไม่สร้างช่วงใน HTML และ jQuery ก็มี undefined ขึ้นมา แน่นอนว่า หากตัวแปรเหล่านี้ถูกกำหนดให้กับออบเจ็กต์ "ของจริง" บนเพจของคุณ คุณไม่จำเป็นต้องมีองค์ประกอบ #jquery_vars ใดๆ เลย ในขณะเดียวกัน เราอาจลืมไปว่า .sidebar-left nice-menu li เป็นองค์ประกอบสำคัญที่ใช้ในการป้อนตัวแปรให้กับ jQuery

ถ้าใครได้อะไรต้องสะอาดกว่านี้...

person ericx    schedule 25.06.2012

sass-ffi ควรทำเคล็ดลับ แต่ตรงกันข้าม (จาก JS ถึง SASS/SCSS) มันจะกำหนดฟังก์ชันที่เรียกว่า ffi-require ซึ่งช่วยให้คุณ require ไฟล์ .js จาก SASS:

config.js:

module.exports = {
     maxColumns: 4,
};

style.scss:

$max-columns: ffi-require('./config', 'maxColumns');

ใช้งานได้กับ sass-loader (webpack) และ node-sass

person futpib    schedule 13.05.2019

ฉันอยากจะเสริมว่าขณะนี้มีหลายวิธีในการแบ่งปันข้อมูลระหว่าง Sass และ JavaScript โดยใช้ JSON ต่อไปนี้เป็นลิงก์ไปยังบทความที่ให้รายละเอียดเกี่ยวกับเทคนิคต่างๆ:

อาจเป็นเพียงเรื่องของเวลาจนกว่าการนำเข้า JSON จะได้รับการสนับสนุนใน Sass

person Teo Dragovic    schedule 22.10.2014

ฉันขอแนะนำให้ดูที่ sass-extract ซึ่งใช้คุณลักษณะ sass ดั้งเดิมเพื่อแยกตัวแปรที่คำนวณแล้ว ค่าลงใน JSON

นอกจากนี้ หากคุณใช้ webpack sass-extract-loader จะทำให้ง่ายมาก เพียงแค่ต้องการ/นำเข้าไฟล์ sass เช่นเดียวกับใน const variables = require('sass-extract-loader!./variables.scss'); และมีตัวแปร sass ของคุณในวัตถุ JSON ที่ดี

เนื่องจากยังรองรับคำสั่ง @import คุณจึงยังคงแยกตัวแปรออกเป็นไฟล์ต่างๆ ได้ และไม่จำเป็นต้องเพิ่มการประมวลผลล่วงหน้าเพิ่มเติมหรือแยกไฟล์ json ด้วยตัวแปร

มีทางเลือกอื่นมากมายในการบรรลุผลตามที่กล่าวไว้ในคำตอบอื่น ๆ และวิธีที่คุณเลือกจะขึ้นอยู่กับกรณีการใช้งานและสภาพแวดล้อมของคุณ

ข้อจำกัดความรับผิดชอบ ฉันเป็นผู้เขียนห้องสมุดทั้งสองแห่งที่กล่าวถึง

person jgranstrom    schedule 29.01.2017

อีกวิธีหนึ่งคือการใช้ gulp-template เพื่อให้คุณสามารถสร้างโครงสร้างใดๆ ที่คุณต้องการสำหรับ JavaScript ของคุณได้

การแชร์ตัวแปรระหว่าง Javascript และ Sass โดยใช้ Gulp กับ gulp-template https://youtu.be/UVeUq8gMYco

มันถูกสร้างขึ้นตั้งแต่เริ่มต้นเพื่อให้ผู้คนสามารถมองเห็นมันได้จากพื้นดินและมี repo git พร้อมผลลัพธ์สุดท้าย:

https://github.com/PocketNinjaCoUk/shared-js-sass-vars-using-gulp/tree/master/dev

โดยพื้นฐานแล้วคุณมีวัตถุกำหนดค่าของคุณ

บันทึกที่ ./dev/config.js

module.exports = {
  defaults: {
    colours: {
      primary: '#fc0'
    },
    sizes: {
      small: '100px',
      medium: '500px',
      large: '1000px'
    },
    zIndex: {
      model: 100,
      dropdown: 50,
      header: 10
    }
  }
}

จากนั้นคุณก็จะมีเทมเพลตทั้งสองสำหรับ Sass และ Javascript หรือน้อยกว่านั้นหรืออะไรก็ได้ที่คุณต้องการ

เทมเพลตขีดเส้นใต้ Sass

บันทึกที่ ./dev/templates/sass-config.txt

<% _.each(defaults, function(category, key) { %>
  // Var <%= key %>
  <% _.each(category, function(value, key) { %>
    $<%= key %>: <%= value %>;
  <% }) %>
<% }) %>

เทมเพลตขีดเส้นใต้ Javascript

บันทึกที่ ./dev/templates/js-config.txt

namespace.config = {};

<% _.each(defaults, function(monkey, key) { %>
  namespace.config.<%= key %> = {
  <% i = 1 %>
  <% _.each(monkey, function(value, key) { %>
    <% comma = (Object.keys(monkey).length === i) ? '': ',' %>
    <% if(typeof value === 'string') {%>
      <%= key %>: '<%= value %>'<%= comma %>
    <%} else { %>
      <%= key %> : <%= value %><%= comma %>
    <% } %>
    <% i++ %>
  <% }); %>
  };
<% }) %>

จากนั้นให้อึกเพื่อเรียบเรียงค่ะ

var gulp = require('gulp');
var template = require('gulp-template');
var rename = require('gulp-rename');
var removeEmptyLines  = require('gulp-remove-empty-lines');

var sharedVars = require('./dev/config');

gulp.task('compile', function() {
  gulp.src('./dev/templates/sass-config.txt')
    .pipe(template(sharedVars))
    .pipe(rename('_sass-config.scss'))
    .pipe(removeEmptyLines())
    .pipe(gulp.dest('./dev/sass'));

  gulp.src('./dev/templates/js-config.txt')
    .pipe(template(sharedVars))
    .pipe(rename('js-config.js'))
    .pipe(removeEmptyLines())
    .pipe(gulp.dest('./dev/js'));
});
person Pocketninja    schedule 24.10.2016