几个实用的Sass mixins
- 发表于
- 前端
Mixins 是 Sass (其实很多预处理语言都有) 中用来方便地复用代码的方法,你可以简单点理解成函数,返回的是一组 CSS 属性或代码。
@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 代码。
.box { -webkit-border-radius: 10px; -moz-border-radius: 10px; -ms-border-radius: 10px; border-radius: 10px; }
如果你对 Sass 不熟悉,可以先去学习一番 ,让我们进入主题,介绍几个实用的 mixins。
Absolute Position
如果你的页面中经常用到 absolute 定位,你可以试试下面这个:
@mixin abs-pos ($top: auto, $right: auto, $bottom: auto, $left: auto) { top: $top; right: $right; bottom: $bottom; left: $left; position: absolute; }
使用
.abs { @include abs-pos(10px, 10px, 5px, 15px); }
产出
.abs { top: 10px; right: 10px; bottom: 5px; left: 15px; position: absolute; }
带有优雅降级地使用 rem 单位
熟悉 rem 单位的前端er是否遇到过不支持的浏览器? 你如何解决的呢?下面这个 mixin 我们加上 px 单位作 fallback:
@function calculateRem($size: 16) {
$remSize: $size / 16px;
@return $remSize * 1rem;
}
@mixin font-size($size) {
font-size: $size;
font-size: calculateRem($size);
}
使用
p {
@include font-size(14px)
}
产出
p {
font-size: 14px;
font-size: 0.8rem;
}
Clearfix
网上有很多 clearfix 的 hacks,下面这种比较常见,兼容到 IE6以上
@mixin clearfix() {
&:before,
&:after {
content: "";
display: table;
}
&:after {
clear: both;
}
}
使用
.container {
@include clearfix();
}
When-inside
个人比较中意的 mixin,常用在修改元素在不同状态下的属性。比如我们的H5页面会给当前页面加个 active类名,我们想让当前页面中的 foo对象执行动画。
/// Make a context based selector a little more friendly
/// @author Hugo Giraudel
/// @param {String} $context
@mixin when-inside($context) {
#{$context} & {
@content;
}
}
使用
.foo {
@include when-inside('.active') {
animation: fadeIn 0.3s 1s forwards;
}
}
产出
.active .foo {
animation: fadeIn 0.3s 1s forwards;
}
方便的媒体查询
媒体查询再做响应式网站时候,非常方便。如果下面的代码满足不了你的需求的话,那么推荐你看之前的文章 《使用Sass之更高级的媒体查询》
$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;
}
}
用法
.foo {
@include respond-to('sm') {
padding-left: 20px;
padding-right: 20px;
}
}
产出
@media only screen and (min-width: 480px) {
.foo {
padding-left: 20px;
padding-right: 20px;
}
}
长阴影
这个mixin可能不常用,但是效果真的很酷~
@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);
}
使用
h1 {
@include longshadow(darken($color, 5% ));
}
精灵图
之前写过一篇关于 Gulp 生成精灵图的文章,里面的 mixin 也很实用
@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
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。