限定 SCSS @font-face 变量以与 Font Face Observer 一起使用
Scoping SCSS @font-face variables for use with Font Face Observer
所以我维护了一个我们使用 Font Face Observer 的站点:https://fontfaceobserver.com — 我们目前定义的字体是这样的:
$serif: Georgia, Times, 'Times New Roman', serif;
$serifFontface: 'Chronicle Display', $serif;
%serif {
font-family: $serif;
.fonts-loaded&{
font-family: $serifFontface;
}
}
我们现在正在修改代码库以用作多语言站点,页面上将始终同时 罗马和日文汉字字符。
我们有一个正文 class .isJa
我试过这样的范围设定,但是即使正文中没有 class,汉字字体也会出现在堆栈中:
$serif: Georgia, Times, 'Times New Roman', serif;
.isJa{
$serif: 'hiragino kaku gothic pro', Georgia, Times, 'Times New Roman', serif;
}
$serifFontface: 'Chronicle Display', $serif;
%serif {
font-family: $serif;
.fonts-loaded &{
font-family: $serifFontface;
}
}
如何/有可能达到预期的结果?即 hiragino 字体仅在存在 .isJa
时声明,但在最初以及在 Font Face Observer 应用 .fonts-loaded
class 时声明。我应该补充一点,我们仅限于 Sass v3.2.6
你被@extend 咬了。扩展规则仅生成一次 - 在您声明 %placeholder 的那一刻。稍后更改变量不会影响它们。这就是(原因之一)为什么通常不鼓励使用@extend。
您应该做的是使用将默认参数设置为您的初始变量值的混入。
代码:
$serifFontface: 'Chronicle Display';
@mixin fontFallback($fallback: (Georgia, Times, 'Times New Roman', serif)) {
font-family: $fallback;
&.fonts-loaded {
font-family: $serifFontface, $fallback;
}
}
body {
@include fontFallback;
}
.isJa {
$japaneseFallback: 'hiragino kaku gothic pro', Georgia, Times, 'Times New Roman', serif;
@include fontFallback($japaneseFallback);
}
输出:
body {
font-family: Georgia, Times, "Times New Roman", serif;
}
body.fonts-loaded {
font-family: "Chronicle Display", Georgia, Times, "Times New Roman", serif;
}
.isJa {
font-family: "hiragino kaku gothic pro", Georgia, Times, "Times New Roman", serif;
}
.isJa.fonts-loaded {
font-family: "Chronicle Display", "hiragino kaku gothic pro", Georgia, Times, "Times New Roman", serif;
}
所以我维护了一个我们使用 Font Face Observer 的站点:https://fontfaceobserver.com — 我们目前定义的字体是这样的:
$serif: Georgia, Times, 'Times New Roman', serif;
$serifFontface: 'Chronicle Display', $serif;
%serif {
font-family: $serif;
.fonts-loaded&{
font-family: $serifFontface;
}
}
我们现在正在修改代码库以用作多语言站点,页面上将始终同时 罗马和日文汉字字符。
我们有一个正文 class .isJa
我试过这样的范围设定,但是即使正文中没有 class,汉字字体也会出现在堆栈中:
$serif: Georgia, Times, 'Times New Roman', serif;
.isJa{
$serif: 'hiragino kaku gothic pro', Georgia, Times, 'Times New Roman', serif;
}
$serifFontface: 'Chronicle Display', $serif;
%serif {
font-family: $serif;
.fonts-loaded &{
font-family: $serifFontface;
}
}
如何/有可能达到预期的结果?即 hiragino 字体仅在存在 .isJa
时声明,但在最初以及在 Font Face Observer 应用 .fonts-loaded
class 时声明。我应该补充一点,我们仅限于 Sass v3.2.6
你被@extend 咬了。扩展规则仅生成一次 - 在您声明 %placeholder 的那一刻。稍后更改变量不会影响它们。这就是(原因之一)为什么通常不鼓励使用@extend。
您应该做的是使用将默认参数设置为您的初始变量值的混入。
代码:
$serifFontface: 'Chronicle Display';
@mixin fontFallback($fallback: (Georgia, Times, 'Times New Roman', serif)) {
font-family: $fallback;
&.fonts-loaded {
font-family: $serifFontface, $fallback;
}
}
body {
@include fontFallback;
}
.isJa {
$japaneseFallback: 'hiragino kaku gothic pro', Georgia, Times, 'Times New Roman', serif;
@include fontFallback($japaneseFallback);
}
输出:
body {
font-family: Georgia, Times, "Times New Roman", serif;
}
body.fonts-loaded {
font-family: "Chronicle Display", Georgia, Times, "Times New Roman", serif;
}
.isJa {
font-family: "hiragino kaku gothic pro", Georgia, Times, "Times New Roman", serif;
}
.isJa.fonts-loaded {
font-family: "Chronicle Display", "hiragino kaku gothic pro", Georgia, Times, "Times New Roman", serif;
}