几个实用的Sass mixins
- 发表于
 - 前端
 
Mixins 是 Sass (其实很多预处理语言都有) 中用来方便地复用代码的方法,你可以简单点理解成函数,返回的是一组 CSS 属性或代码。
|   1 2 3 4 5 6 7 8 9  |  @mixin border-radius($radius) {   -webkit-border-radius: $radius;      -moz-border-radius: $radius;       -ms-border-radius: $radius;           border-radius: $radius; } .box { @include border-radius(10px); }  |  
上面的代码处理后,将得到下面 CSS 代码。
|   1 2 3 4 5 6 7  |  .box {   -webkit-border-radius: 10px;   -moz-border-radius: 10px;   -ms-border-radius: 10px;   border-radius: 10px; }  |  
如果你对 Sass 不熟悉,可以先去学习一番 ,让我们进入主题,介绍几个实用的 mixins。
Absolute Position
如果你的页面中经常用到 absolute 定位,你可以试试下面这个:
|   1 2 3 4 5 6 7 8  |  @mixin abs-pos ($top: auto, $right: auto, $bottom: auto, $left: auto) {   top: $top;   right: $right;   bottom: $bottom;   left: $left;   position: absolute; }  |  
使用
|   1 2 3 4  |  .abs {   @include abs-pos(10px, 10px, 5px, 15px); }  |  
产出
|   1 2 3 4 5 6 7 8  |  .abs {   top: 10px;   right: 10px;   bottom: 5px;   left: 15px;   position: absolute; }  |  
带有优雅降级地使用 rem 单位
熟悉 rem 单位的前端er是否遇到过不支持的浏览器? 你如何解决的呢?下面这个 mixin 我们加上 px 单位作 fallback:
|   1 2 3 4 5 6 7 8 9  |  @function calculateRem($size: 16) {   $remSize: $size / 16px;   @return $remSize * 1rem; } @mixin font-size($size) {   font-size: $size;   font-size: calculateRem($size); }  |  
使用
|   1 2 3  |  p {   @include font-size(14px) }  |  
产出
|   1 2 3 4  |  p {   font-size: 14px;   font-size: 0.8rem; }  |  
Clearfix
网上有很多 clearfix 的 hacks,下面这种比较常见,兼容到 IE6以上
|   1 2 3 4 5 6 7 8 9 10  |  @mixin clearfix() {     &:before,     &:after {         content: "";         display: table;     }     &:after {         clear: both;     } }  |  
使用
|   1 2 3  |  .container {   @include clearfix(); }  |  
When-inside
个人比较中意的 mixin,常用在修改元素在不同状态下的属性。比如我们的H5页面会给当前页面加个 active类名,我们想让当前页面中的 foo对象执行动画。
|   1 2 3 4 5 6 7 8  |  /// Make a context based selector a little more friendly /// @author Hugo Giraudel /// @param {String} $context @mixin when-inside($context) {   #{$context} & {     @content;   } }  |  
使用
|   1 2 3 4 5  |  .foo {   @include when-inside('.active') {     animation: fadeIn 0.3s 1s forwards;   } }  |  
产出
|   1 2 3  |  .active .foo {   animation: fadeIn 0.3s 1s forwards;  }  |  
方便的媒体查询
媒体查询再做响应式网站时候,非常方便。如果下面的代码满足不了你的需求的话,那么推荐你看之前的文章 《使用Sass之更高级的媒体查询》
|   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  |  $breakpoints: (   'sm': 'only screen and  (min-width: 480px)',   'md': 'only screen and ( min-width: 768px)',   'lg': 'only screen and ( min-width: 992px)' ) !default; @mixin respond-to($breakpoint) {   $query: map-get($breakpoints, $breakpoint);   @if not $query {     @error 'No value found for `#{$breakpoint}`. Please make sure it is defined in `$breakpoints` map.';   }   @media #{if(type-of($query) == 'string', unquote($query), inspect($query))} {     @content;   } }  |  
用法
|   1 2 3 4 5 6  |  .foo {   @include respond-to('sm') {     padding-left: 20px;     padding-right: 20px;   } }  |  
产出
|   1 2 3 4 5 6  |  @media only screen and (min-width: 480px) {   .foo {     padding-left: 20px;     padding-right: 20px;    }  }  |  
长阴影
这个mixin可能不常用,但是效果真的很酷~
|   1 2 3 4 5 6 7 8 9 10 11  |  @function makelongshadow($color) {   $val: 0px 0px $color;   @for $i from 1 through 200 {     $val: #{$val}, #{$i}px #{$i}px #{$color};   }   @return $val; } @mixin longshadow($color) {   text-shadow: makelongshadow($color); }  |  
使用
|   1 2 3  |  h1 {   @include longshadow(darken($color, 5% )); }  |  
精灵图
之前写过一篇关于 Gulp 生成精灵图的文章,里面的 mixin 也很实用
|   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41  |  @mixin sprite-width($sprite) {   width: nth($sprite, 5); } @mixin sprite-height($sprite) {   height: nth($sprite, 6); } @mixin sprite-position($sprite) {   $sprite-offset-x: nth($sprite, 3);   $sprite-offset-y: nth($sprite, 4);   background-position: $sprite-offset-x  $sprite-offset-y; } @mixin sprite-image($sprite) {   $sprite-image: nth($sprite, 9);   background-image: url(#{$sprite-image}); } @mixin sprite($sprite) {   @include sprite-image($sprite);   @include sprite-position($sprite);   @include sprite-width($sprite);   @include sprite-height($sprite); } /* The `sprites` mixin generates identical output to the CSS template   but can be overridden inside of SCSS @include sprites($spritesheet-sprites); */ @mixin sprites($sprites) {   @each $sprite in $sprites {     $sprite-name: nth($sprite, 10);     .#{$sprite-name} {       @include sprite($sprite);     }   } }  |  
总结
以上内容均为整理及实践总结而来,可能不是最优解,如果你又更好的想法,欢迎与我交流~ 用好 mixin 或许可以让你省去大量重复性工作,空出大把时间,为升职加薪迎娶白富美走上人生巅峰做梦去吧。
更多细化的 mixin 看相关内容中的链接。
相关内容
   原文连接:几个实用的Sass mixins  所有媒体,可在保留署名、
  原文连接
的情况下转载,若非则不得使用我方内容。