231 lines
5.9 KiB
SCSS
231 lines
5.9 KiB
SCSS
@charset "UTF-8";
|
||
|
||
/**
|
||
* 获取边框某项对应的值
|
||
* @example getBorderItemValue(10px, 2)
|
||
* @param {string|list} $item 某一项或多个项的列表
|
||
* @param {number} $index 下标
|
||
* @return {string} 项值
|
||
*/
|
||
@function getBorderItemValue($item, $index) {
|
||
@if (type-of($item) == list) {
|
||
@if ($index > length($item)) {
|
||
$index: 1;
|
||
}
|
||
|
||
@return nth($item, $index);
|
||
} @else {
|
||
@return $item;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 判断是否为百分比
|
||
* @param {number} $value 值
|
||
* @return {boolean} 是否为百分比
|
||
*/
|
||
@function is-percentage($value) {
|
||
@return type-of($value) == number and unit($value) == '%';
|
||
}
|
||
|
||
/**
|
||
* 边框圆角,支持单个值与多个值,在高清设备下px圆角加倍
|
||
* @param {number|list} $radius 圆角值
|
||
* @param {number} $ratio 设备像素比
|
||
*/
|
||
@mixin border-radius($radius: 0, $ratio: 1) {
|
||
$border-radius-corner: (top-left, top-right, bottom-right, bottom-left);
|
||
|
||
/* 列表 按照四个角的顺序匹配 */
|
||
@if (type-of($radius) == list) {
|
||
@for $i from 1 through length($radius) {
|
||
$item: nth($radius, $i);
|
||
$corner: nth($border-radius-corner, $i);
|
||
|
||
/* 普通设备,或者为百分比则直接使用圆角值 */
|
||
@if $ratio == 1 or is-percentage($item) {
|
||
border-#{$corner}-radius: $item;
|
||
}
|
||
|
||
/* 否则翻$ratio倍 */
|
||
@else {
|
||
border-#{$corner}-radius: $item * $ratio;
|
||
}
|
||
}
|
||
}
|
||
|
||
/* 单个值 */
|
||
@else {
|
||
@if $ratio == 1 or is-percentage($radius) {
|
||
border-radius: $radius;
|
||
} @else {
|
||
border-radius: $radius * $ratio;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 元素边框
|
||
* @param {string|list} $direction: all 为all或列表时表示多个方向的边框,否则为单个边框
|
||
* @param {string|list} $size: 1px 边框尺寸,为列表时表将按照direction的顺序取值
|
||
* @param {string|list} $style: solid 边框样式,高清设备下仅支持solid,同上
|
||
* @param {string|list} $color: #ddd 边框颜色,同上
|
||
* @param {string} $position: relative 元素定位方式,一般为relative即可
|
||
* @param {string} $radius: 0 边框圆角
|
||
*/
|
||
@mixin border(
|
||
$direction: all,
|
||
$size: 1px,
|
||
$style: solid,
|
||
$color: #ddd,
|
||
$position: relative,
|
||
$radius: 0
|
||
) {
|
||
/* 多个边框 */
|
||
@if $direction == all or type-of($direction) == list {
|
||
/* 普通设备 */
|
||
@media not screen and (-webkit-min-device-pixel-ratio: 2) {
|
||
@include border-radius($radius);
|
||
|
||
@if $direction == all {
|
||
border: $size $style $color;
|
||
} @else {
|
||
@for $i from 1 through length($direction) {
|
||
$item: nth($direction, $i);
|
||
|
||
border-#{$item}: getborderitemvalue($size, $i)
|
||
getborderitemvalue($style, $i)
|
||
getborderitemvalue($color, $i);
|
||
}
|
||
}
|
||
}
|
||
|
||
/* 高清设备 */
|
||
@media only screen and (-webkit-min-device-pixel-ratio: 2) {
|
||
@include border-multiple(
|
||
$direction: $direction,
|
||
$size: $size,
|
||
$color: $color,
|
||
$position: $position,
|
||
$radius: $radius
|
||
);
|
||
}
|
||
}
|
||
|
||
/* 单个边框 */
|
||
@else {
|
||
/* 普通设备 */
|
||
@media not screen and (-webkit-min-device-pixel-ratio: 2) {
|
||
border-#{$direction}: $size $style $color;
|
||
}
|
||
|
||
/* 高清设备 */
|
||
@media only screen and (-webkit-min-device-pixel-ratio: 2) {
|
||
@include border-single(
|
||
$direction: $direction,
|
||
$size: $size,
|
||
$color: $color,
|
||
$position: $position
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
/* 实现1物理像素的单条边框线 */
|
||
@mixin border-single($direction: bottom, $size: 1px, $color: #ddd, $position: relative) {
|
||
position: $position;
|
||
|
||
&::after {
|
||
/* 上下 */
|
||
@if ($direction == top or $direction == bottom) {
|
||
left: 0;
|
||
width: 100%;
|
||
height: $size;
|
||
|
||
@media only screen and (-webkit-device-pixel-ratio: 2) {
|
||
-webkit-transform: scaleY(0.5);
|
||
transform: scaleY(0.5);
|
||
}
|
||
|
||
@media only screen and (-webkit-device-pixel-ratio: 3) {
|
||
-webkit-transform: scaleY(0.333333333333);
|
||
transform: scaleY(0.333333333333);
|
||
}
|
||
}
|
||
|
||
/* 左右 */
|
||
@else if ($direction == left or $direction == right) {
|
||
top: 0;
|
||
width: $size;
|
||
height: 100%;
|
||
|
||
@media only screen and (-webkit-device-pixel-ratio: 2) {
|
||
-webkit-transform: scaleX(0.5);
|
||
transform: scaleX(0.5);
|
||
}
|
||
|
||
@media only screen and (-webkit-device-pixel-ratio: 3) {
|
||
-webkit-transform: scaleX(0.333333333333);
|
||
transform: scaleX(0.333333333333);
|
||
}
|
||
}
|
||
|
||
position: absolute;
|
||
pointer-events: none;
|
||
background-color: $color;
|
||
content: '';
|
||
|
||
@media only screen and (-webkit-min-device-pixel-ratio: 2) {
|
||
-webkit-transform-origin: 0 0;
|
||
transform-origin: 0 0;
|
||
}
|
||
|
||
#{$direction}: 0;
|
||
}
|
||
}
|
||
|
||
/* 实现1物理像素的多条边框线 */
|
||
@mixin border-multiple($direction: all, $size: 1px, $color: #ddd, $position: relative, $radius: 0) {
|
||
@include border-radius($radius);
|
||
|
||
position: $position;
|
||
|
||
&::after {
|
||
@if $direction == all {
|
||
border: $size solid $color;
|
||
} @else {
|
||
@for $i from 1 through length($direction) {
|
||
$item: nth($direction, $i);
|
||
|
||
border-#{$item}: getborderitemvalue($size, $i) solid getborderitemvalue($color, $i);
|
||
}
|
||
}
|
||
|
||
position: absolute;
|
||
top: 0;
|
||
left: 0;
|
||
pointer-events: none;
|
||
content: '';
|
||
box-sizing: border-box;
|
||
transform-origin: top left;
|
||
|
||
@media only screen and (-webkit-device-pixel-ratio: 2) {
|
||
@include border-radius($radius, 2);
|
||
|
||
width: 200%;
|
||
height: 200%;
|
||
-webkit-transform: scale(0.5, 0.5);
|
||
transform: scale(0.5, 0.5);
|
||
}
|
||
|
||
@media only screen and (-webkit-device-pixel-ratio: 3) {
|
||
@include border-radius($radius, 3);
|
||
|
||
width: 300%;
|
||
height: 300%;
|
||
-webkit-transform: scale(0.333333333333, 0.333333333333);
|
||
transform: scale(0.333333333333, 0.333333333333);
|
||
}
|
||
}
|
||
}
|