Sass的mixin用法
1.以vue项目开发演示,先在assets里面建Sass文件夹mixin.sass
// 1. 布局
//flex布局复用
@mixin flex($hov:space-between,$col:center){
display:flex;
justify-content:$hov;
align-items:$col;
}
//after伪类加小图标
@mixin bgImg($w:0,$h:0,$img:'',$size:contain){
display:inline-block;
width:$w;
height:$h;
background:url($img) no-repeat center;
background-size:$size;
content:''
}
// 固定定位, 兼容IE6
@mixin fixed {
position: fixed;
_position: absolute;
*zoom: 1;
}
// 水平竖直方向居中-translate
@mixin center {
position: absolute;
left: 50%;
top: 50%;
-moz-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
// 水平竖直方向居中-flex
@mixin flex-center($w, $h) {
@include flex;
align-items: center;
justify-content: center;
}
//水平竖直方向居中-margin
@mixin know-center($w, $h) {
position: absolute;
left: 50%;
top: 50%;
margin-left: -($w/2);
margin-top: -($h/2);
}
// 吸顶导航
@mixin fix-header($h: 70px) {
@include fixed;
top: 0;
left: 0;
width: 100%;
height: $h;
z-index: 1000;
}
// 吸底导航
@mixin fix-footer($h: 70px) {
@include fixed;
left: 0;
bottom: 0;
width: 100%;
height: $h;
z-index: 1000;
}
// 浮动, 兼容 IE6
@mixin fl {
float: left;
*display: inline;
_display: inline;
}
@mixin fr {
float: right;
*display: inline;
_display: inline;
}
// 清除浮动
@mixin clearfix {
*zoom: 1;
&:after {
content: "";
display: block;
height: 0;
visibility: hidden;
clear: both;
}
}
// 弹性盒
@mixin flex {
display: -webkit-box;
display: -webkit-flex;
display: -moz-box;
display: -ms-flexbox;
display: flex;
}
// IE盒模型
@mixin border-box {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
// 尺寸
@mixin size($w, $h) {
width: $w;
height: $h;
}
// 最小尺寸, 兼容IE6
@mixin min-width($min-w) {
min-width: $min-w;
_width: $min-w;
}
@mixin min-height($min-h) {
min-height: $min-h;
_height: $min-h;
}
// 全屏大图背景
@mixin fullscreen-bg($url) {
width: 100vw;
height: 100vh;
background: url($url) no-repeat 50% 50%;
background-size: cover;
}
// 2. 文本
// 禁止文本被选择
@mixin user-select {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
// 文字超出显示省略号
@mixin ellipsis {
/*加宽度width属来兼容部分浏览*/
white-space: nowrap;
overflow: hidden;
-ms-text-overflow: ellipsis;
-o-text-overflow: ellipsis;
text-overflow: ellipsis;
}
//文字超出几行显示省略号
@mixin ellipsis-multi($line) {
// display: -webkit-box; //将对象作为弹性伸缩盒子模型显示
// -webkit-box-orient: vertical; //设置或检索伸缩盒对象的子元素的排列方式
// -webkit-line-clamp: 3; //用来限制在一个块元素显示的文本的行数
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: $line;
overflow: hidden;
-ms-text-overflow: ellipsis;
-o-text-overflow: ellipsis;
text-overflow: ellipsis;
}
// 美化文本选中 ::selection
@mixin beauty-select($color, $bgcolor) {
&::selection {
color: $color;
background-color: $bgcolor;
}
}
// 美化占位符 placeholder 样式
@mixin beauty-placeholder($fz, $color: #999, $align: left) {
&:-moz-placeholder {
font-size: $fz;
color: $color;
text-align: $align;
}
&:-ms-input-placeholder {
font-size: $fz;
color: $color;
text-align: $align;
}
&::-webkit-input-placeholder {
font-size: $fz;
color: $color;
text-align: $align;
}
}
// 隔行换色
@mixin zebra-lists($evenColor, $evenBgColor, $oddColor, $oddBgColor) {
&:nth-child(2n) {
color: $evenColor;
background-color: $evenBgColor;
}
&:nth-child(2n + 1) {
color: $oddColor;
background-color: $oddBgColor;
}
}
// 首字下沉
@mixin first-letter($font-size: 6em) {
&::first-letter {
float: left;
line-height: 1;
font-size: $font-size;
}
}
// 3. 图片
// 滤镜: 将彩色照片显示为黑白照片、保留图片层次
@mixin grayscale {
-webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
-o-filter: grayscale(100%);
filter: grayscale(100%);
}
// 模糊 毛玻璃效果
@mixin blur($blur: 10px) {
-webkit-filter: blur($blur);
-moz-filter: blur($blur);
-o-filter: blur($blur);
-ms-filter: blur($blur);
filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='${blur}');
filter: blur($blur);
*zoom: 1;
}
// 鼠标禁用样式,但仍然可以触发事件
@mixin disabled {
cursor: not-allowed;
}
// 4.图形
// 三角形
@mixin triangle($width: 4px, $color: #000) {
display: inline-block;
width: 0;
height: 0;
vertical-align: middle;
border-top: $width solid $color;
border-left: $width solid transparent;
border-right: $width solid transparent;
}
**// 背景图片
@mixin bgImage($path) {
background-image: url($path + '@2x.png');
@media (-webkit-min-device-pixel-ratio: 3), (min-device-pixel-ratio: 3) {
background-image: url($path + '@3x.png');
}
}
// 居中布局
@mixin center() {
justify-content: center;
align-content: center;
}
// 不换行
@mixin no-wrap() {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
@mixin top-line($c: #c7c7c7) {
content: ' ';
position: absolute;
left: 0;
top: 0;
right: 0;
height: 1px;
border-top: 1px solid $c;
color: $c;
transform-origin: 0 0;
transform: scaleY(0.5);
@media (-webkit-min-device-pixel-ratio: 3), (min-device-pixel-ratio: 3) {
transform: scaleY(0.333333333);
}
}
@mixin bottom-line($c: #E6E6E6) {
content: ' ';
position: absolute;
left: 0;
bottom: 0;
right: 0;
height: 1px;
border-bottom: 1px solid $c;
color: $c;
transform-origin: 0 100%;
transform: scaleY(0.5);
@media (-webkit-min-device-pixel-ratio: 3), (min-device-pixel-ratio: 3) {
transform: scaleY(0.333333333);
}
}
@mixin left-line($c: #c7c7c7) {
content: ' ';
position: absolute;
left: 0;
top: 0;
width: 1px;
bottom: 0;
border-left: 1px solid $c;
color: $c;
transform-origin: 0 0;
transform: scaleX(0.5);
@media (-webkit-min-device-pixel-ratio: 3), (min-device-pixel-ratio: 3) {
transform: scaleX(0.333333333);
}
}
@mixin right-line($c: #c7c7c7) {
content: ' ';
position: absolute;
right: 0;
top: 0;
width: 1px;
bottom: 0;
border-right: 1px solid $c;
color: $c;
transform-origin: 100% 0;
transform: scaleX(0.5);
@media (-webkit-min-device-pixel-ratio: 3), (min-device-pixel-ratio: 3) {
transform: scaleX(0.333333333);
}
}
@mixin line($c: #c7c7c7, $border-radius: 0) {
content: ' ';
position: absolute;
left: 0;
top: 0;
width: 200%;
height: 200%;
border: 1px solid $c;
color: $c;
transform-origin: left top;
@if ($border-radius != 0) {
border-radius: $border-radius * 2;
}
transform: scale(0.5);
@media (-webkit-min-device-pixel-ratio: 3), (min-device-pixel-ratio: 3) {
@if ($border-radius != 0) {
border-radius: $border-radius * 3;
}
width: 300%;
height: 300%;
transform: scale(0.333333333);
}
}
// 一像素上边框
@mixin border-top-1px($color: #c7c7c7) {
position: relative;
&:before {
@include top-line();
}
}
// 一像素下边框
@mixin border-bottom-1px($color: #c7c7c7) {
position: relative;
&:after {
@include bottom-line();
}
}
// 一像素上下边框
@mixin border-top-bottom-1px($color: #c7c7c7) {
position: relative;
&:before {
@include top-line();
}
&:after {
@include bottom-line();
}
}
// 一像素左边框
@mixin border-left-1px($color: #c7c7c7) {
position: relative;
&:before {
@include left-line();
}
}
// 一像素右边框
@mixin border-right-1px($color: #c7c7c7) {
position: relative;
&:before {
@include right-line();
}
}
// 一像素边框
@mixin border-1px($color: #c7c7c7, $position: relative, $border-radius: 0) {
position: $position;
&:after {
@include line($color, $border-radius);
}
}
2.使用方法
2.1首先在使用界面style里面导入mixin(vue以例子)
@import url(‘地址’)
2.2.具体使用
sass中以@include+类名导入,括号里面传入具体的参数
3.less的mixin用法
3.1先建mixin.less文件,定义方法跟sass有所不同
//flex布局复用
.flex(@hov:space-between,@col:center) {
display: flex;
justify-content: @hov;
align-items: @col;
}
.bgImg(@w:0,@h:0,@img:'',@size:contain) {
display: inline-block;
width: @w;
height: @h;
background: url(@img) no-repeat center;
background-size: @size;
}
.position(@pos:absolute,@top:0,@left:0,@w:100%,@h:100%) {
position: @pos;
top: @top;
left: @left;
width: @w;
height: @h;
}
.positionImg(@pos:absolute,@top:0,@right:0,@w:0,@h:0,@img:'') {
position: @pos;
top: @top;
right: @right;
width: @w;
height: @h;
background: url(@img) no-repeat center;
background-size: contain;
}
.height(@h:0,@lh:@h) {
height: @h;
line-height: @lh;
}
.wH(@w:0,@h:0) {
width: @w;
height: @h;
}
.border(@bw:1px,@bc:@colorF,@bs:solid) {
border: @bw @bs @bc;
}
3.2@import引入后使用方法
主要以 .+类名使用
.bgImg(22px,22px,'../../public/imgs/icon-cart-hover.png');