CSS程式碼段-scss mixin

前端小白ML發表於2019-11-25

專案中常用 CSS 程式碼複用。將其封裝成 mixin. (收藏)

1、文字溢位顯示 ... 的樣式.

  • 固定行數(支援多行)

@mixin ellipsis($rowCount: 1) {
  @if $rowCount <=1 {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  } @else {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: $rowCount;
    -webkit-box-orient: vertical;
  }
}
複製程式碼
  • 行數不固定 (對最後一行進行縮略)
/**
* 行數不確定的情況
* 1.{max-height} : 文字所在區域的最大高度
* 2.{line-height} : 文字的行高。
*/
@mixin mls-ellipsis($maxHeight: 200px, $lineHeight: 22px) {
  overflow: hidden;
  position: relative;
  max-height: $maxHeight;
  line-height: $lineHeight;
  &::after {
    position: absolute;
    right: 0;
    bottom: 1px;
    padding-left: 25px;
    background: linear-gradient(to right, transparent, #fff 50%);
    content: "...";
  }
}
複製程式碼

2、移動端 1px

移動端由於畫素密度比的問題, 實際的1px邊框看起來比較粗, 如果想要更"細"可以使用下面的程式碼. 不同畫素密度比的裝置都可以相容(pc/手機), 還支援任意數量圓角.

/**
* 真.1px邊框
* {List}: 多個方向邊框, 預設值為bottom, 你可以根據需要傳入(top, left, bottom, right) 4個方向;
* {Color} 邊框的顏色, 預設#ccc;
* {List} 4個圓角半徑, 預設0;
* {String} 一個高階設定, 一般都不需要改動, 由於細邊框的實現使用了css的偽類, 所以為了規避可能出現的樣式衝突, 我們可以自己指定使用:after還是:before, 預設after;
*/
@mixin thinBorder(
  $directionMaps: bottom,
  $color: #ccc,
  $radius: (
    0,
    0,
    0,
    0
  ),
  $position: after
) {
  // 是否只有一個方向
  $isOnlyOneDir: string==type-of($directionMaps);

  @if ($isOnlyOneDir) {
    $directionMaps: ($directionMaps);
  }

  @each $directionMap in $directionMaps {
    border-#{$directionMap}: 1px solid $color;
  }

  // 判斷圓角是list還是number
  @if (list==type-of($radius)) {
    border-radius: nth($radius, 1)
      nth($radius, 2)
      nth($radius, 3)
      nth($radius, 4);
  } @else {
    border-radius: $radius;
  }

  @media only screen and (-webkit-min-device-pixel-ratio: 2) {
    & {
      position: relative;

      // 刪除1畫素密度比下的邊框
      @each $directionMap in $directionMaps {
        border-#{$directionMap}: none;
      }
    }

    &:#{$position} {
      content: "";
      position: absolute;
      top: 0;
      left: 0;
      display: block;
      width: 200%;
      height: 200%;
      transform: scale(0.5);
      box-sizing: border-box;
      padding: 1px;
      transform-origin: 0 0;
      pointer-events: none;
      border: 0 solid $color;

      @each $directionMap in $directionMaps {
        border-#{$directionMap}-width: 1px;
      }

      // 判斷圓角是list還是number
      @if (list==type-of($radius)) {
        border-radius: nth($radius, 1) *
          2
          nth($radius, 2) *
          2
          nth($radius, 3) *
          2
          nth($radius, 4) *
          2;
      } @else {
        border-radius: $radius * 2;
      }
    }
  }

  @media only screen and (-webkit-min-device-pixel-ratio: 3) {
    &:#{$position} {
      // 判斷圓角是list還是number
      @if (list==type-of($radius)) {
        border-radius: nth($radius, 1) *
          3
          nth($radius, 2) *
          3
          nth($radius, 3) *
          3
          nth($radius, 4) *
          3;
      } @else {
        border-radius: $radius * 3;
      }

      width: 300%;
      height: 300%;
      transform: scale(0.3333);
    }
  }
}

複製程式碼

3、三角圖示

常用來做下拉選單的方向指示

/**
* 等邊三角形
* @param {String} 尺寸
* @param {Color} 顏色
* @param {String} 方向
*/
@mixin triangle($size: 5px, $color: rgba(0, 0, 0, 0.6), $dir: bottom) {
  width: 0;
  height: 0;
  border-style: solid;

  @if (bottom==$dir) {
    border-width: $size $size 0 $size;
    border-color: $color transparent transparent transparent;
  } @else if (top==$dir) {
    border-width: 0 $size $size $size;
    border-color: transparent transparent $color transparent;
  } @else if (right==$dir) {
    border-width: $size 0 $size $size;
    border-color: transparent transparent transparent $color;
  } @else if (left==$dir) {
    border-width: $size $size $size 0;
    border-color: transparent $color transparent transparent;
  }
}
複製程式碼

4、loading

CSS程式碼段-scss mixin

可調節大小

@mixin loading-half-circle($width: 1em) {
  display: inline-block;
  height: $width;
  width: $width;
  border-radius: $width;
  border-style: solid;
  border-width: $width/10;
  border-color: transparent currentColor transparent transparent;
  animation: rotate 0.6s linear infinite;
  vertical-align: middle;
}
複製程式碼

5、棋盤 (不常用,先收藏)

CSS程式碼段-scss mixin

/**
* 棋盤背景
* @param {Color} 背景色
*/
@mixin bgChessboard($color: #aaa) {
  background-image: linear-gradient(
      45deg,
      $color 25%,
      transparent 25%,
      transparent 75%,
      $color 75%,
      $color
    ),
    linear-gradient(
      45deg,
      $color 26%,
      transparent 26%,
      transparent 74%,
      $color 74%,
      $color
    );
  background-size: 10vw 10vw;
  background-position: 0 0, 5vw 5vw;
}

複製程式碼

相關文章