为啥我在这个 SASS 文件中得到一个未定义的 Foundation 变量错误?

Posted

技术标签:

【中文标题】为啥我在这个 SASS 文件中得到一个未定义的 Foundation 变量错误?【英文标题】:Why do I get an undefined Foundation variable error in this SASS file?为什么我在这个 SASS 文件中得到一个未定义的 Foundation 变量错误? 【发布时间】:2014-05-01 06:40:02 【问题描述】:

我有一个 Rails 4 应用程序,使用 Foundation-rails v5.2.1.0 gem,以及一个用于我的应用程序布局的自定义 SCSS 文件。当我使用 foundation_and_overrides.scss 文件中的变量时,我收到以下错误:

Undefined variable: "$header-font-family"

我在下面包含了相关代码。如果需要,我可以发布更多。有人知道这里发生了什么吗?

来自application.css

*
 *= require foundation_and_overrides
 *= require_self
 *= require_tree .
 */

来自foundation_and_overrides.scss

// We use these to control header font styles
$header-font-family: "futura-pt", sans-serif;
$header-font-weight: 400;
// $header-font-style: normal;

来自custom.css.scss

$include-html-global-classes: false;
@import "foundation/components/global";
. 
. 
. 
.footer 
  background-color: black;
  color: white;
  height: 100px;
  font-family: $header-font-family;

【问题讨论】:

【参考方案1】:

您收到错误是因为foundation_and_overrides.scss custom.css.scss 之后执行。最好的方法是在部分定义变量并在基础之后将其导入主样式表中。

先把文件名改成

foundation_and_overrides.scss _foundation_and_overrides.scss

然后在基础后将其导入 custom.css.scss文件中

@import 'foundation_and_overrides';

更新

将您的 application.css 重命名为 application.css.scss custom.css.scss 重命名为 custom.scss

在您的 application.css.scss 中删除 *= require_tree .

然后用

导入你的主样式表
@import 'custom'

希望对你有帮助

【讨论】:

太棒了!谢谢你。一个问题,这最终会增加发送给客户的 CSS 文件的总重量吗?含义:我现在会发送重复文件吗? @blundin 您应该从 application.scss 文件中删除 *= require foundation_and_overrides 并在导入基础后在 custom.scss 中导入您的覆盖。如果您查看页面的源代码,那么您只会看到 application.css 文件,其中包含您导入的内容,没有任何重复。 如果您使用 assets/stylesheets 中的子文件夹并收到Sass::SyntaxError: File to import not found or unreadable: global. 错误,则有一个解决方法github.com/zurb/foundation/issues/3855(即config.sass.load_paths += [ "#Gem.loaded_specs['foundation-rails'].full_gem_path/vendor/assets/stylesheets/foundation/components", "#Gem.loaded_specs['foundation-rails'].full_gem_path/vendor/assets/stylesheets/foundation/" ]【参考方案2】:

最干净的方法是添加行

@import "custom";

到你的文件foundation_and_overrides.scss之前

@import "foundation";

如已接受的答案所述,无需从application.css.scss 中删除*= require_tree .。如果您将require_tree . 留在其中,也无需将require foundation_and_overrides 添加到application.css

【讨论】:

这对现有答案有何影响? 它可以让您的 application.css.scss 保持干净和正常工作(拉入 css 文件需要require tree .,不应删除)。【参考方案3】:

根据Rails Docs:

如果你想使用多个 Sass 文件,你通常应该使用 Sass >@import 规则而不是这些 Sprockets 指令。当使用 Sprockets >directives 时,Sass 文件存在于它们自己的范围内,使变量或 >mixin 仅在它们定义的文档中可用。

所以在这种情况下,指令的顺序(application.css 中以 *= 开头的行)无关紧要,因为这些文件中的每一个都存在于自己的范围内,您无法从另一个 scss 访问它们的变量文件。这就是为什么您想要@import foundation_and_overrides 然后自定义,或者@import 您的自定义样式表intofoundation_and_overrides。

【讨论】:

以上是关于为啥我在这个 SASS 文件中得到一个未定义的 Foundation 变量错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我总是在这个 ajax 帖子到 php 时得到未定义的响应?

为啥我在 React 中得到“无法读取未定义的属性(读取 'map')”,而没有语法错误

为啥我得到一个未定义的 pthread_create 引用? [复制]

为啥我得到“未定义的 main 引用”

为啥我在尝试创建新的 qml 文件时得到 QmlCachedGenerateCode?

为啥我从 html doc 得到函数未定义错误?