Sass变量、数据类型、函数随笔(二)

Sass变量

Sass也有变量的概念,变量是以美元 $ 符号开头,为变量赋值的方式如下:

$variable: 750;

与css中属性赋值的方式相同。

命名规则:

  1. 必须以 $ 字符开始。
  2. 变量名称以 _ 或英文字母开头。
  3. 建议变量名称具有可读性的意义。

Sass变量支持块级作用域,嵌套规则之内定义的变量只能在嵌套规则内使用(局部变量),在嵌套规则之外定义的变量则可在任何地方使用(全局变量),如果想局部变量转换为全局变量,则可以采用添加 !global 声明为全局变量, 如下:

// 全局变量
$layout-height: 750px;
$color: #353535 !global;
.frame {

  // 局部变量
  $header-height: 80px;

  margin: 0 auto;

  .header {
    $color: #f00 !global;
    height: $header-height;
    color: $color;
  }

  .wrapper {
    color: $color
  }
}

.main {
  color: $color;
}

编译生成为:


.frame {
  margin: 0 auto;
}
.frame .header {
  height: 80px;
  color: #f00;
}
.frame .wrapper {
  color: #f00;
}
.main {
  color: #f00;
}

总结
1. 变量支持块级作用域,通过这种方式更好封装局部样式模块。
2. 提高Sass变量的可维护扩展性,尽可能少或不采用!global 关键字将局部变量声明为全局变量。
3. 全局变量与文档流渲染顺序有关(自上而下)

数据类型

Sass目前支持六种主要的数据类型:

  • 数字, 例如:1,20,750px
  • 字符串,有引号或无引号,例如:"menu", 'menu', menu
  • 颜色, 例如: #ff0000, #aaa, rgba(0, 0, 0, .5), red
  • 布尔型, true, false
  • 数组,用空格或逗号作为分隔符,例如:15px 20px 30px, Arial, sans-serif
  • maps,与JavaScript的Object相似,例如: (key1: value1,key2: value2)

Sass对于一些特殊的属性值,基本都是按无引号字符串处理, 例如:!important

字符串在@mixin中可以使用 #{} 将带引号字符串编译时转化为无引号字符串这样可以引用选择器名
称,例如:

@mixin use-selector($selector) {
  #{$selector} {
    margin: 0 auto;
    color: #aaa;
  }
}

@include use-selector('.layout')

编译生成为:

.layout {
  margin: 0 auto;
  color: #aaa;
}

总结
项目开发中,掌握Css属性值与Sass中哪种类型对应,能够清楚理解Sass如何编译成css文件。

运算

  • 数字运算
    Sass支持数字类型的加减乘除、取整等运算 (+, -, *, /, %),在编译时可以在不同单位间转换值。
.change  {
  height: 10px + 2pt;
}

编译生成为:

.change {
  height: 12.66667px;
}

总结
在进行数字运算时,注意像素单位是否能够正常转换值,目前项目中遇到不能转换多情况,px,em,rem运算时,不能转换,因为在浏览器渲染中,em、rem等单位会渲染为px像素, 在项目开发过程中,基本采用相同等像素单位进行运算处理。

数字运算中的除法运算符 / 在Css中通常起到分隔数字的作用,在Sass中扩展了 / 的功能,同时拥有分割及运算符两种功能,以下三种情况 / 将被视为除法运算符号:

  1. 如果值或值的一部分,是变量或者函数的返回值。
  2. 如果值被圆括号包裹。
  3. 如果值是算数表达式的一部分。
.main {
  $width: 300px;
  font: 14px/18px;
  width: $width/2;
}

编译生成为:

.main {
  font: 14px/18px;
  width: 150px;
}

可以通过 #{} 来改变上下文运行环境

.main {
  $font-size: 14px;
  $line-height: 18px;
  font: #{$font-size}/#{$line-height}
}

编译生成为:

.main {
  font: 14px/18px;
}

上下文运行环境决定 / 履行相应的功能。

  • 颜色值运算
    颜色值的运算是分段计算,分别计算红色,绿色,蓝色的值:
.main {
  color: #020405 + #030102;
}

计算过程:02 + 03 = 05 04 + 01 = 05 05 + 02 = 07

.main {
  color: #050507;
}

十六进制的颜色值进行其他运算时,以此类推。

颜色值为rgba 或 hsla 两种颜色值时,必须拥有相等的 alpha 值才能进行运算,因为算术运算不会作用于 alpha 值。

.main {
   color: rgba(255, 0, 0, 0.75) + rgba(0, 255, 0, 0.75);
}

编译生成为:

.main {
   color: rgba(255, 255, 0, 0.75);
}

颜色值的 alpha channel 可以通过 opacifytransparentize 两个函数进行调整。

$red: rgba(255, 0, 0, 0.5);
.main {
  color: opacify($red, 0.2);
  background-color: transparentize($red, 0.2);
}

编译生成为:

.main {
  color: rgba(255, 0, 0, 0.7);
  background-color: rgba(255, 0, 0, 0.3);
}
  • 字符串运算
    + 符号用于连接字符串
.main:before {
   content: "Foo " + Bar;
   font-family: sans- + "serif";
}

编译生成为:

.main:before {
  content: "Foo Bar";
  font-family: sans-serif;
}

无引号与带引号字符串链接时, 以前面的字符串形式为主。
在字符串中使用 #{} 动态传值。

$value: 50px;
.main:before {
  content: "I am value: #{$value}"
}

编译生成为:

.main:before {
  content: "I am value: 50px";
}

总结
在字符串进行一些运算时,尽量使带引号字符串进行相关操作。

  • 圆括号 ()
    圆括号可以用来影响运算的顺序。
.main {
  width: (2em + 2em) * 3;
}

编译生成为:

.main {
  width: 12em;
}

函数

  • 内置函数
    Sass内置了一些通用函数,更好提高开发效率。
.main {
  color: hsl(0, 100%, 50%);
}

编译生成为:

.main {
  color: #ff0000;
}

通过 Sass::Functions 查看完整的 Sass 函数列表及参数名,更好的掌握。

  • 自定义函数
    使用@function 自定义函数,格式为:@function <name>(<arguments...>) { ... },
    函数的name可以是任何Sass标识符(建议名称有意义)。函数体只能包含通用语句,以及指示要作为函数调用结果使用的值的`@return
@function test($base,  $exponent) {
  $result: 1;
  @for $_ from 1 through $exponent {
    $result: $result * $base;
  }
  @return $result;
}

.main {
  float: left;
  margin-left: test(4, 3) * 1px;
}

@return
@return在规则中表示作为调用函数的结果返回的使用值。@return只允许在一个@function体内,每个@function 必须以 @return在函数体内结束。

有一些经验总结,仅代表鄙人个人观点,如哪位大神有疑惑可以留言一起讨论。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342