针对移动端的前端工作流(3)—Sass的使用姿势

sass文件的编译与px to rem的转换

基础库使用的预处理器是sass,为什么会选择sass呢?这是因为当时在选择sass和less的时候,简单的了解了下它们:sass是功能强大但是入门门槛高,less是功能稍微薄弱,但是入门简单,而我认为功能强大是工具的事情,但是入门门槛高则是个人的问题,不能以个人的问题来决定使用何种工具,所以最终选择了sass,(现在想想,当时还是很天真啦,其实两者的区别并不是像我想象的如此肤浅),于是便一直使用sass。

sass文件的编译用的是gulp的gulp-sass,当执行gulp后,会监控src/scss下scss文件的变化(并不是src/scss所有的文件,只有在src/scss一级目录下的scss文件),如果发生变化,就会实时编译成css到dev/css目录下。

接着我们会用gulp-autoprefixer插件自动补全Css前缀。

最后我们会进行px to rem的转换,转换的规则就是所有的 px值 除以 75 计算出rem值。

通过下面这个示例代码,一目了然。

处理前:

scss文件转换前

处理后:

scss文件转换后

至于为什么转化规则是除以 75 呢?

这是因为我们这里的移动端设计稿都是 750px 的,我们用PS测量一个按钮为150px的时候,我们就直接写这个按钮的width为150px,这感觉就像写固定布局一样!gulp会为我们自动处理px to rem。

但是如果你的设计稿是640px呢?这个该怎么处理?这时候就需要你修改下gulpfile.js中的配置文件:

  1. gulp.task('dev_sass', function() {
  2. var processors = [px2rem({ remUnit: 75 })]; //根据你的设计稿宽度除以10修改这里的remUnit值
  3. return gulp.src(path.src.scss + "*.scss")
  4. .pipe(sass().on('error', sass.logError))
  5. .pipe(autoprefixer({
  6. browsers: ['last 5 versions'],
  7. cascade: false
  8. }))
  9. .pipe(postcss(processors))
  10. .pipe(gulp.dest(path.dev.css))
  11. .pipe(notify({
  12. message: 'scss文件编译成功'
  13. }))
  14. });

对了,你还可能遇到一个坑,那就是如果你设置按钮的border为1px时

这是scss文件:

  1. .btn {
  2. border: 1px solid #ccc;
  3. }

这是处理后的css文件:

  1. .btn {
  2. border: 0.013333rem solid #ccc;
  3. }

在浏览器中预览时你会看见它的边框,但是当你到了手机上的时候,这条线是没有的!!!

想当初百思不得其解,突然灵光一现,发现了其中蹊跷,那就是手机中算 0.013333rem值的时候可能都算不到1px大小,所以直接就不显示了……

所以我们不想让gulp对border的1px进行处理的时候该怎么办呢?

这时候,我们就需要加上特殊的标示告诉gulp此处请不要转换,看下面的示例代码:

这是scss文件:

  1. .btn {
  2. border: 1px solid #ccc; /*no*/
  3. }

这是处理后的css文件:

  1. .btn {
  2. border: 1px solid #ccc;
  3. }

scss目录结构

目录结构

src/scss目录下,包含了很多细分功能的scss文件。这是scss的目录结构

  1. ├── src/ # 源文件目录
  2. └── scss/ # scss目录
  3. └── helper/
  4. └── _color.scss # 色板
  5. └── _normalize.scss # 重置
  6. └── _rules.scss # 规则
  7. └── _util.scss # util
  8. └── sprite/
  9. └── _sprite.scss # 根据雪碧图生成的scss文件
  10. └── ui/
  11. └── _animation.scss # 动画
  12. └── _button.scss # 按钮组件
  13. └── _global.scss # 全局
  14. └── _icon.scss # 字体图标
  15. └── _loading.scss # 页面加载loading样式
  16. └── index.scss

helper

先介绍helper目录,这里包括了一些帮助项目开发的类

1._color.scss

这里存放着一些扁平的颜色变量,当你没有合适的颜色的时候,可以考虑选择尝试其中的颜色。查看这些颜色

2._normalize.scss

样式重置,基于normalize.css,在此基础上加了针对移动端的一些东西,其中要注意的是这样一句:

  1. * {
  2. -webkit-box-sizing: border-box;
  3. -moz-box-sizing: border-box;
  4. box-sizing: border-box;
  5. }

这句话直接改变了所有元素的盒模型,当你设置一个元素为 box-sizing: border-box;时,此元素的内边距和边框不再会增加它的宽度,绝对是开发福利!

3._rules.scss

在这里设置常用的scss变量,占位符,mixin,请大家在项目开发中不断的完善!

4._util.scss

提供常用的工具类, 让我们在这里做个预览:

  1. /**
  2. * 隐藏元素
  3. */
  4. .hidden,
  5. [hidden] {
  6. display: none !important;
  7. }
  8. /**
  9. * 弹性图片
  10. */
  11. .lnv-img {
  12. max-width: 100%;
  13. height: auto;
  14. display: block;
  15. }
  16. /**
  17. * 清除浮动
  18. */
  19. .clear {
  20. clear: both;
  21. }
  22. /**
  23. * 解決高度塌陷問題
  24. */
  25. .clearfix:after {
  26. content: ' ';
  27. display: block;
  28. height: 0;
  29. clear: both;
  30. visibility: hidden;
  31. }
  32. .clearfix {
  33. zoom: 1;
  34. }
  35. /**
  36. * 单行文本超过宽度显示为三个点
  37. */
  38. .dot {
  39. overflow: hidden;
  40. white-space: nowrap;
  41. text-overflow: ellipsis;
  42. }
  43. /**
  44. * 三角符号
  45. */
  46. .lnv-triangle {
  47. display: inline-block;
  48. width: 0;
  49. height: 0;
  50. margin-left: 2px;
  51. vertical-align: middle;
  52. border-top: 4px dashed;
  53. border-top: 4px solid \9;
  54. border-right: 4px solid transparent;
  55. border-left: 4px solid transparent;
  56. }
  57. /**
  58. * 不被选中
  59. */
  60. .noselect {
  61. -webkit-user-select: none;
  62. -moz-user-select: none;
  63. -ms-user-select: none;
  64. -o-user-select: none;
  65. user-select: none;
  66. }

ui

ui文件夹下存放与ui相关的scss文件。

  1. _animation.scss

这里存放着与动画有关的样式。

  1. _button.scss

这里存放着组件类的样式,如按钮、表单、表格等,这里只写了button类,其他的需要大家在项目开发中完善。之所以设置组件类,是为了方便项目后期的迭代。

  1. _global.scss

这里存放自定义的全局变量。

  1. _icon.scss

这里存放着字体图标有关的样式。

  1. _loading.scss

这里存放着页面加载loading的样式

sprite

sprite文件下存放着由雪碧图生成的scss文件,具体的内容会在雪碧图部分讲解。

base.scss

在base.scss文件中引入uihelper下的文件,要求每个html文件中引入base.css。

这是base.scss文件:

  1. @charset "utf-8";
  2. /* 样式重置 */
  3. @import "helper/_normalize";
  4. /* 色板 */
  5. @import "helper/_color";
  6. /* 规则 */
  7. @import "helper/_rules";
  8. /* 工具类 */
  9. @import "helper/_util";
  10. /* 动画效果 */
  11. @import "ui/_animation";
  12. /* 组件库 */
  13. @import "ui/_buttons";
  14. /* loading */
  15. @import "ui/_loading";
  16. /* icon */
  17. @import "ui/_icon";
  18. /* public style */
  19. @import "ui/_global";