# CSS

Creator 支持 PostCSS (opens new window)Sass (opens new window)

# 编写样式

先来一个最简单的:

_btn.scss

.btn {
  display: inline-block;
}

main.scss

@import "btn";

.some {
  color: red;
}

编译后,只会产生 main.css

main.css

.btn {
  display: inline-block;
}
.some {
  color: red;
}

# 路径能力

Creator 可以给大家带来更加强大、灵活的路径能力。

# npm 依赖

我们可以使用开源的 Normalize.css (opens new window),还可以开发自己的 CSS 包,发布到官方 NPM 或者公司的私有 NPM。

normalize.css 为例,在你的项目中安装你想要的包:

npm install normalize.css

然后,在你的样式文件中引用该样式

@import "~normalize.css";

body {
  color: #333;
}

# 别名 @

你可能遇到过如下的代码,眼睛累,脑壳还疼。

@import "../../../../../common/reset.css";

而我们支持如下方式:

@import "@/common/reset.css";
// or
@import "~@/common/reset.css";

.test-root-alias {
  width: 320px;
  height: 240px;
  // working
  background: url("~@/index/img/car.jpg") no-repeat;
  // not working
  // background: url("@/index/img/car.jpg") no-repeat;
}

WARNING

CSS 中图片路径使用 @ 别名时,要添加 ~ 前缀。

# Sass 中引用 CSS

Sass 中引用 CSS 时要特别小心如下代码:

@import 'nest/_test_nest2.css';

因为 Sass 的 @import 遇到明确指定 .css 时,并不会导入该文件(参考官方文档 (opens new window)),而是编译为如下代码:

@import url(nest/_test_nest2.css);

这时候,该样式文件实际上是被 css-loader 导入的,如果存在文件目录嵌套时,就有可能会出现打包失败的情况,有如下两种解决方式:

// 去掉 .css 后缀
@import 'nest/_test_nest2';
@import 'nest/test_nest2';

// or

// 使用别名
@import '~@/path/to/nest/_test_nest2.css';

# 支持 Sass 图片相对路径

假设你的目录结构是这样的:

+ main.scss
+ sub/
  + _sub.scss
  + sub.png

代码内容是这样的:

main.scss

@import "sub/sub";

sub/_sub.scss

.sub {
  background: url("./sub.png") no-repeat;
}

输出结果是:

.sub {
  background: url("./sub/sub.png") no-repeat;
}

# 图片内嵌

有时候希望将样式里引用的背景图内嵌到样式里,支持如下两种方式:

  • 小于 1kb 自动内嵌
  • 通过自定义参数 datauri 直接表示内嵌
.test-inline {
  background: url("../img/car.jpg?datauri") no-repeat;
  background: url("../img/car.svg?datauri") no-repeat;
}

# 自动添加版本号

为了解决 CDN 缓存的问题,当执行生产环境构建的时候,会自动给 CSS 中的图片路径添加版本号:

.test-md5 {
  background: url(../img/bg.png?6350fa96) no-repeat;
}

该版本号是根据图片文件生成的 MD5,当文件变化时,该版本号才会发生变化。

# Autoprefixer

有了 Autoprefixer,你不再需要手动写 -webkit--ms--moz- 等浏览器厂商前缀,也就不再需要使用 Sass 之类的语言来编写一堆 mixins。

加浏览器前缀时,我们只考虑下面所列的浏览器:

browsers: [
  '> 0.2%', 'last 2 versions', 'Firefox ESR', 'not dead',
  'iOS >= 9',
  'Android >= 4.4',
  'Explorer >= 9'
]

解释一下,> 0.2% 表示流行使用的浏览器版本,但是由于新发布的版本可能暂时未达到使用率,所以加上 last 2 versions 以及 Firefox ESR,另外前面的条件可能包含已经 dead 的浏览器版本,我们不打算考虑这些浏览器,所以使用 not dead 去掉这些浏览器版本。最后明确指定我们会进行测试的浏览器最低要求,即 iOS >= 9, Android >= 4.4, Explorer >= 9

你可以使用 browser.list (opens new window) 来查看我们的规则包含了哪些浏览器版本。

# 简单的例子

原来你可能这么写:

.btn .icon {
  -webkit-transform: scale(0.5);
      -ms-transform: scale(0.5);
       -o-transform: scale(0.5);
          transform: scale(0.5);
}

现在这么写就成:

.btn .icon {
  transform: scale(0.5);
}

# 自动去掉无用的前缀

Autoprefixer 还会去掉老旧的前缀,比如 border-radius

.btn {
  -webkit-border-radius: 10px;
  border-radius: 10px;
}

根据我们的浏览器支持配置,我们不再需要 border-radius-webkit--moz- 等前缀。经过 Autoprefixer 处理后会变成这样:

.btn {
  border-radius: 10px;
}

# 之前已经手动写了前缀也没关系

.btn .icon {
  -webkit-transform: scale(0.5);
  transform: scale(0.5);
}

会被处理成:

.btn .icon {
  -webkit-transform: scale(0.5);
      -ms-transform: scale(0.5);
       -o-transform: scale(0.5);
          transform: scale(0.5);
}

# 怎么用 -webkit-min-device-pixel-ratio

@media (min-resolution: 2dppx) {
  .image {
    background-image: url(image@2x.png);
  }
}

会被处理成

@media (-webkit-min-device-pixel-ratio: 2),
       (-o-min-device-pixel-ratio: 2/1),
       (min-resolution: 2dppx) {
  .image {
    background-image: url(image@2x.png);
  }
}

# 特定浏览器 hack

.btn .icon {
  transform: scale(0.5);
  -webkit-transform: scale(0.6);
}

会被处理成:

.btn .icon4 {
  -ms-transform: scale(0.5);
   -o-transform: scale(0.5);
      transform: scale(0.5);
  -webkit-transform: scale(0.6);
}

上面我们介绍了几种 Autoprefixer 的处理规则,更多的用法请参见官网 (opens new window)

提示

你可以配置 .browserslistrc 来自定义你需要支持的浏览器。

提示

Autoprefixer 是通过 PostCSS 来实现的,如果需要,你可以自定义 postcss.config.js 来添加更多的功能。

# PostCSS

Creator 内部使用了 PostCSS。

你可以通过 postcss.config.js 来配置 PostCSS。也可以通过 creator.config.js 中的 css.loaderOptions.postcss 配置 postcss-loader (opens new window)

我们默认开启了 autoprefixer (opens new window)。如果要配置目标浏览器,请参考 browserslist 部分。

# CSS Modules

暂不支持,待开发。

# 向预处理器 Loader 传递选项

有的时候你想要向 webpack 的预处理器 loader 传递选项。你可以使用 creator.config.js 中的 css.loaderOptions 选项。比如你可以这样向所有 Sass 样式传入共享的全局变量:

// vue.config.js
module.exports = {
  css: {
    loaderOptions: {
      scss: {
        prependData: `@import "~@/variables.scss";`
      },
    }
  }
}

Loader 可以通过 loaderOptions 配置,包括:

提示

这样做比使用 chainWebpack 手动指定 loader 更推荐,因为这些选项需要应用在使用了相应 loader 的多个地方。