跳到主要内容

使用 Stylus 进行样式设计

安装 Stylus 非常简单,只需先安装 Node.js,然后获取适用于您平台的二进制文件,并确保它们也包括 npm,Node 的包管理器。

现在,在终端中输入以下命令:

# npm
$ npm install stylus -g

# pnpm
$ pnpm add -g stylus

如果您想要一个具有以下功能的用于 nodejs 的表达性 css 语言,请前往 GitHub 了解更多信息。

Stylus 命令行界面

Stylus 附带了 stylus 可执行文件,用于将 Stylus 转换为 CSS。

Usage: stylus [options] [command] [< in [> out]]
[file|dir ...]

Commands:

help [<type>:]<prop> 在您的默认浏览器中打开 MDC 上有关 <prop> 的帮助信息。可选择搜索 <type> 的其他资源:
safari opera w3c ms caniuse quirksmode

Options:

-i, --interactive 启动交互式 REPL
-u, --use <path> 使用位于 <path> 的 Stylus 插件
-U, --inline 通过数据 URI 支持使用图像内联
-w, --watch 监视文件的更改并重新编译
-o, --out <dir> 在传递文件时输出到 <dir>
-C, --css <src> [dest] 将 CSS 输入转换为 Stylus
-I, --include <path><path> 添加到查找路径中
-c, --compress 压缩 CSS 输出
-d, --compare 显示输入和输出
-f, --firebug 在生成的 CSS 中发出可供 FireStylus Firebug 插件使用的调试信息
-l, --line-numbers 在生成的 CSS 中发出注释,指示相应的 Stylus 行
-m, --sourcemap 生成 sourcemaps v3 格式的源映射
--sourcemap-inline 使用 base64 格式的完整源文本内联源映射
--sourcemap-root <url> 生成的 sourcemap 的 "sourceRoot" 属性
--sourcemap-base <path> sourcemap 和所有源相对的基本 <path>
-P, --prefix [prefix] 前缀所有 css 类
-p, --print 打印编译后的 CSS
--import <file> 导入 stylus <file>
--include-css 在 @import 中包含常规 CSS
-D, --deps 显示编译文件的依赖项
--disable-cache 禁用缓存
--hoist-atrules 将 @import 和 @charset 移动到顶部
-r, --resolve-url 解析 URL

解析导入的相对 URL --resolve-url-nocheck:类似于--resolve-url,但不检查文件是否存在 -V,--version:显示 Stylus 的版本 -h,--help:显示帮助信息

STDIO 编译示例

stylusstdin 读取并输出到 stdout,例如:

$ stylus --compress < some.styl > some.css

在终端中尝试使用 Stylus!在下面输入并按 CTRL-D 以输入 __EOF__

$ stylus
body
color red
font 14px Arial, sans-serif

编译文件示例

stylus 还接受文件和目录。例如,名为 css 的目录将在同一目录中编译并输出 .css 文件。

$ stylus css

以下内容将输出到 ./public/stylesheets

$ stylus css --out public/stylesheets

或者几个文件:

$ stylus one.styl two.styl

为了开发目的,您可以使用 linenos 选项来发出注释,指示在生成的 CSS 中的 Stylus 文件名和行号:

$ stylus --line-numbers <path>

或者如果您想使用 FireStylus 扩展程序

$ stylus --firebug <path>

添加类前缀

stylus 可执行文件提供了一种使用 --prefix 选项和给定的 [prefix] 前缀所有生成的样式的方法,

$ stylus --prefix foo-

与此代码一起使用:

.bar
width: 10px

将产生

.foo-bar {
width: 10px;
}

所有类都将被添加前缀:插值、扩展等。

转换 CSS

如果您希望将 CSS 转换为简洁的 Stylus 语法,请使用 --css 标志。

通过 stdio:

$ stylus --css < test.css > test.styl

输出与同名的 .styl 文件:

$ stylus --css test.css

输出到特定目标:

$ stylus --css test.css /tmp/out.styl

CSS 属性帮助

在 OS X 上,stylus help <prop> 将打开您的默认浏览器,并显示给定 <prop> 的帮助文档。

$ stylus help box-shadow

交互式 Shell

Stylus REPL(Read-Eval-Print-Loop)或“交互式 shell”允许您直接从终端中玩弄 Stylus 表达式。

请注意,这仅适用于表达式-不适用于选择器等。要使用简单地添加 -i--interactive 标志:

$ stylus -i
> color = white
=> #fff
> color - rgb(200,50,0)
=> #37cdff
> color
=> #fff
> color -= rgb(200,50,0)
=> #37cdff
> c

颜色
=> #37cdff
> rgba(颜色, 0.5)
=> rgba(55,205,255,0.5)

解决导入中的相对 URL

默认情况下,Stylus 不会解析导入的 .styl 文件中的 URL,因此如果您有一个 foo.styl 文件,其中包含 @import "bar/bar.styl",而 bar/bar.styl 中包含 url("baz.png"),则在生成的 CSS 中也会是 url("baz.png")

但是,您可以使用 --resolve-url(或 -r)选项来更改此行为,以在生成的 CSS 中获得 url("bar/baz.png")

列出依赖项

您可以使用 --deps(或 -D)标志来获取编译文件的依赖项列表。

例如,假设我们有 test.styl

@import 'foo'
@import 'bar'

并且在 foo.styl 中:

@import 'baz'

运行:

$ stylus --deps test.styl

将给我们导入路径的列表:

foo.styl
baz.styl
bar.styl

请注意,目前此功能不适用于动态生成的路径。

利用插件

对于此示例,我们将使用 nib Stylus 插件来说明其 CLI 用法。

假设我们有以下 Stylus,它导入了 nib 以使用其 linear-gradient() 函数。

@import 'nib'

body
background: linear-gradient(20px top, white, black)

我们通过 stdio 使用 stylus(1) 进行渲染的第一次尝试可能如下所示:

$ stylus < test.styl

这将产生以下错误(因为 Stylus 不知道在哪里找到 nib)。

Error: stdin:3
1|
2|
> 3| @import 'nib'
4|
5| body
6| background: linear-gradient(20px top, white, black)

对于仅提供 Stylus API 的插件,我们可以将路径添加到 Stylus 查找路径中。我们可以使用 --include-I 标志来实现:

$ stylus < test.styl --include ../nib/lib

现在产生以下输出。(正如您可能注意到的那样,对 gradient-data-uri()create-gradient-image() 的调用输出为文字。这是因为仅公开库路径不足以提供插件提供 JavaScript API。但是,如果我们只想使用纯 Stylus nib 函数,那么我们就没问题了。)

body {
background: url(gradient-data-uri(create-gradient-image(20px, top)));
background: -webkit-gradient(
linear,
left top,
left bottom,
color-stop(0, #fff),
color-stop(1, #000)
);
background: -webkit-linear-gradient(top, #fff 0%, #000 100%);
background: -moz-linear-gradient(top, #fff 0%, #000 100%);
background: linear-gradient(top, #fff 0%, #000 100%);
}

因此,

我们需要使用 --use-u 标志。它需要一个指向一个 Node 模块的路径(可以带有 .js 扩展名)。这个模块会被 require(),期望一个函数被导出为 module.exports,然后调用 style.use(fn()) 来暴露插件(定义其 js 函数等)。

$ stylus < test.styl --use ../nib/lib/nib

产生预期结果:

body {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAUCAYAAABMDlehAAAABmJLR0QA/wD/AP+gvaeTAAAAI0lEQVQImWP4+fPnf6bPnz8zMH358oUBwkIjKJBgYGNj+w8Aphk4blt0EcMAAAAASUVORK5CYII=");
background: -webkit-gradient(
linear,
left top,
left bottom,
color-stop(0, #fff),
color-stop(1, #000)
);
background: -webkit-linear-gradient(top, #fff 0%, #000 100%);
background: -moz-linear-gradient(top, #fff 0%, #000 100%);
background: linear-gradient(top, #fff 0%, #000 100%);
}

如果你需要向插件传递参数,使用 --with 选项。--with 会评估任何有效的 JavaScript 表达式,并将其值传递给插件。例如:

$ stylus < test.styl --use ../node_modules/autoprefixer-stylus --with "{ browsers: ['ie 7', 'ie 8'] }"