|
|
/**
|
|
|
* 混合宏
|
|
|
*/
|
|
|
@import "config";
|
|
|
@import "function";
|
|
|
|
|
|
/**
|
|
|
* BEM,定义块(b)
|
|
|
*/
|
|
|
@mixin b($block) {
|
|
|
$B: $namespace + "-" + $block !global;
|
|
|
|
|
|
.#{$B} {
|
|
|
@content;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 定义元素(e),对于伪类,会自动将 e 嵌套在 伪类 底下 */
|
|
|
@mixin e($element...) {
|
|
|
$selector: &;
|
|
|
$selectors: "";
|
|
|
|
|
|
@if containsPseudo($selector) {
|
|
|
@each $item in $element {
|
|
|
$selectors: #{$selectors + "." + $B + $elementSeparator + $item + ","};
|
|
|
}
|
|
|
@at-root {
|
|
|
#{$selector} {
|
|
|
#{$selectors} {
|
|
|
@content;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} @else {
|
|
|
@each $item in $element {
|
|
|
$selectors: #{$selectors + $selector + $elementSeparator + $item + ","};
|
|
|
}
|
|
|
@at-root {
|
|
|
#{$selectors} {
|
|
|
@content;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/* 此方法用于生成穿透样式 */
|
|
|
/**
|
|
|
* BEM,定义块(b)
|
|
|
*/
|
|
|
@mixin bdeep($block) {
|
|
|
$B: $namespace + "-" + $block !global;
|
|
|
|
|
|
.#{$B}{
|
|
|
@content;
|
|
|
}
|
|
|
}
|
|
|
/* 此方法用于生成穿透样式 */
|
|
|
|
|
|
/* 定义元素(e),对于伪类,会自动将 e 嵌套在 伪类 底下 */
|
|
|
@mixin edeep($element...) {
|
|
|
$selector: &;
|
|
|
$selectors: "";
|
|
|
|
|
|
@if containsPseudo($selector) {
|
|
|
@each $item in $element {
|
|
|
$selectors: #{$selectors + "." + $B + $elementSeparator + $item + ","};
|
|
|
}
|
|
|
@at-root {
|
|
|
#{$selector} {
|
|
|
:deep(#{$selectors}) {
|
|
|
@content;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} @else {
|
|
|
@each $item in $element {
|
|
|
$selectors: #{$selectors + $selector + $elementSeparator + $item + ","};
|
|
|
}
|
|
|
@at-root {
|
|
|
:deep(#{$selectors}) {
|
|
|
@content;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/* 定义状态(m) */
|
|
|
@mixin m($modifier...) {
|
|
|
$selectors: "";
|
|
|
@each $item in $modifier {
|
|
|
$selectors: #{$selectors + & + $modifierSeparator + $item + ","};
|
|
|
}
|
|
|
|
|
|
@at-root {
|
|
|
#{$selectors} {
|
|
|
@content;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
/* 对于需要需要嵌套在 m 底下的 e,调用这个混合宏,一般在切换整个组件的状态,如切换颜色的时候 */
|
|
|
@mixin me($element...) {
|
|
|
$selector: &;
|
|
|
$selectors: "";
|
|
|
|
|
|
@if containsModifier($selector) {
|
|
|
@each $item in $element {
|
|
|
$selectors: #{$selectors + "." + $B + $elementSeparator + $item + ","};
|
|
|
}
|
|
|
@at-root {
|
|
|
#{$selector} {
|
|
|
#{$selectors} {
|
|
|
@content;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} @else {
|
|
|
@each $item in $element {
|
|
|
$selectors: #{$selectors + $selector + $elementSeparator + $item + ","};
|
|
|
}
|
|
|
@at-root {
|
|
|
#{$selectors} {
|
|
|
@content;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 状态,生成 is-$state 类名 */
|
|
|
@mixin when($states...) {
|
|
|
@at-root {
|
|
|
@each $state in $states {
|
|
|
&.#{$state-prefix + $state} {
|
|
|
@content;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 常用混合宏
|
|
|
*/
|
|
|
|
|
|
/* 单行超出隐藏 */
|
|
|
@mixin lineEllipsis {
|
|
|
overflow: hidden;
|
|
|
text-overflow: ellipsis;
|
|
|
white-space: nowrap;
|
|
|
}
|
|
|
|
|
|
/* 多行超出隐藏 */
|
|
|
@mixin multiEllipsis($lineNumber: 3) {
|
|
|
display: -webkit-box;
|
|
|
-webkit-box-orient: vertical;
|
|
|
-webkit-line-clamp: $lineNumber;
|
|
|
overflow: hidden;
|
|
|
}
|
|
|
|
|
|
/* 清除浮动 */
|
|
|
@mixin clearFloat {
|
|
|
&::after {
|
|
|
display: block;
|
|
|
content: "";
|
|
|
height: 0;
|
|
|
clear: both;
|
|
|
overflow: hidden;
|
|
|
visibility: hidden;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* 0.5px 边框 */
|
|
|
@mixin halfPixelBorder($direction: "bottom", $left: 0, $color: $-color-border-light) {
|
|
|
&::after {
|
|
|
position: absolute;
|
|
|
display: block;
|
|
|
content: "";
|
|
|
@if ($left == 0) {
|
|
|
width: 100%;
|
|
|
} @else {
|
|
|
width: calc(100% - #{$left});
|
|
|
}
|
|
|
height: 1px;
|
|
|
left: $left;
|
|
|
@if ($direction == "bottom") {
|
|
|
bottom: 0;
|
|
|
} @else {
|
|
|
top: 0;
|
|
|
}
|
|
|
transform: scaleY(0.5);
|
|
|
background: $color;
|
|
|
}
|
|
|
}
|
|
|
@mixin buttonClear {
|
|
|
outline: none;
|
|
|
-webkit-appearance: none;
|
|
|
-webkit-tap-highlight-color: transparent;
|
|
|
background: transparent;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 三角形实现尖角样式,适用于背景透明情况
|
|
|
* @param $size 三角形高,底边为 $size * 2
|
|
|
* @param $bg 三角形背景颜色
|
|
|
*/
|
|
|
@mixin triangleArrow($size, $bg) {
|
|
|
@include e(arrow) {
|
|
|
position: absolute;
|
|
|
width: 0;
|
|
|
height: 0;
|
|
|
}
|
|
|
|
|
|
@include e(arrow-down) {
|
|
|
border-left: $size solid transparent;
|
|
|
border-right: $size solid transparent;
|
|
|
border-top: $size solid $bg;
|
|
|
transform: translateX(-50%);
|
|
|
bottom: calc(-1 * $size)
|
|
|
}
|
|
|
@include e(arrow-up) {
|
|
|
border-left: $size solid transparent;
|
|
|
border-right: $size solid transparent;
|
|
|
border-bottom: $size solid $bg;
|
|
|
transform: translateX(-50%);
|
|
|
top: calc(-1 * $size)
|
|
|
}
|
|
|
@include e(arrow-left) {
|
|
|
border-top: $size solid transparent;
|
|
|
border-bottom: $size solid transparent;
|
|
|
border-right: $size solid $bg;
|
|
|
transform: translateY(-50%);
|
|
|
left: calc(-1 * $size)
|
|
|
}
|
|
|
@include e(arrow-right) {
|
|
|
border-top: $size solid transparent;
|
|
|
border-bottom: $size solid transparent;
|
|
|
border-left: $size solid $bg;
|
|
|
transform: translateY(-50%);
|
|
|
right: calc(-1 * $size)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 正方形实现尖角样式,适用于背景不透明情况
|
|
|
* @param $size 正方形边长
|
|
|
* @param $bg 正方形背景颜色
|
|
|
* @param $z-index z-index属性值,不得大于外部包裹器
|
|
|
* @param $box-shadow 阴影
|
|
|
*/
|
|
|
@mixin squareArrow($size, $bg, $z-index, $box-shadow) {
|
|
|
@include e(arrow) {
|
|
|
position: absolute;
|
|
|
width: $size;
|
|
|
height: $size;
|
|
|
z-index: $z-index;
|
|
|
}
|
|
|
|
|
|
@include e(arrow-down) {
|
|
|
transform: translateX(-50%);
|
|
|
bottom: 0;
|
|
|
|
|
|
&:after {
|
|
|
content: "";
|
|
|
width: $size;
|
|
|
height: $size;
|
|
|
background-color: $bg;
|
|
|
position: absolute;
|
|
|
bottom: calc(-1 * $size / 2);
|
|
|
transform: rotateZ(45deg);
|
|
|
box-shadow: $box-shadow;
|
|
|
}
|
|
|
}
|
|
|
@include e(arrow-up) {
|
|
|
transform: translateX(-50%);
|
|
|
&:after {
|
|
|
content: "";
|
|
|
width: $size;
|
|
|
height: $size;
|
|
|
background-color: $bg;
|
|
|
position: absolute;
|
|
|
top: calc(-1 * $size / 2);
|
|
|
transform: rotateZ(45deg);
|
|
|
box-shadow: $box-shadow;
|
|
|
}
|
|
|
}
|
|
|
@include e(arrow-left) {
|
|
|
transform: translateY(-50%);
|
|
|
&:after {
|
|
|
content: "";
|
|
|
width: $size;
|
|
|
height: $size;
|
|
|
background-color: $bg;
|
|
|
position: absolute;
|
|
|
left: calc(-1 * $size / 2);
|
|
|
transform: rotateZ(45deg);
|
|
|
box-shadow: $box-shadow;
|
|
|
}
|
|
|
}
|
|
|
@include e(arrow-right) {
|
|
|
transform: translateY(-50%);
|
|
|
&:after {
|
|
|
content: "";
|
|
|
width: $size;
|
|
|
height: $size;
|
|
|
background-color: $bg;
|
|
|
position: absolute;
|
|
|
right: calc(-1 * $size / 2);
|
|
|
transform: rotateZ(45deg);
|
|
|
box-shadow: $box-shadow;
|
|
|
}
|
|
|
}
|
|
|
}
|