_mixin.scss 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. /**
  2. * 混合宏
  3. */
  4. @import "config";
  5. @import "function";
  6. /**
  7. * BEM,定义块(b)
  8. */
  9. @mixin b($block) {
  10. $B: $namespace + "-"+ $block !global;
  11. .#{$B} {
  12. @content;
  13. }
  14. }
  15. /* 定义元素(e),对于伪类,会自动将 e 嵌套在 伪类 底下 */
  16. @mixin e($element...) {
  17. $selector: &;
  18. $selectors: "";
  19. @if containsPseudo($selector) {
  20. @each $item in $element {
  21. $selectors: #{$selectors + "." + $B + $elementSeparator + $item + ","};
  22. }
  23. @at-root {
  24. #{$selector} {
  25. #{$selectors} {
  26. @content;
  27. }
  28. }
  29. }
  30. }
  31. @else {
  32. @each $item in $element {
  33. $selectors: #{$selectors + $selector + $elementSeparator + $item + ","};
  34. }
  35. @at-root {
  36. #{$selectors} {
  37. @content;
  38. }
  39. }
  40. }
  41. }
  42. /* 此方法用于生成穿透样式 */
  43. /* 定义元素(e),对于伪类,会自动将 e 嵌套在 伪类 底下 */
  44. @mixin edeep($element...) {
  45. $selector: &;
  46. $selectors: "";
  47. @if containsPseudo($selector) {
  48. @each $item in $element {
  49. $selectors: #{$selectors + "." + $B + $elementSeparator + $item + ","};
  50. }
  51. @at-root {
  52. #{$selector} {
  53. :deep() {
  54. #{$selectors} {
  55. @content;
  56. }
  57. }
  58. }
  59. }
  60. }
  61. @else {
  62. @each $item in $element {
  63. $selectors: #{$selectors + $selector + $elementSeparator + $item + ","};
  64. }
  65. @at-root {
  66. :deep() {
  67. #{$selectors} {
  68. @content;
  69. }
  70. }
  71. }
  72. }
  73. }
  74. /* 定义状态(m) */
  75. @mixin m($modifier...) {
  76. $selectors: "";
  77. @each $item in $modifier {
  78. $selectors: #{$selectors + & + $modifierSeparator + $item + ","};
  79. }
  80. @at-root {
  81. #{$selectors} {
  82. @content;
  83. }
  84. }
  85. }
  86. /* 定义状态(m) */
  87. @mixin mdeep($modifier...) {
  88. $selectors: "";
  89. @each $item in $modifier {
  90. $selectors: #{$selectors + & + $modifierSeparator + $item + ","};
  91. }
  92. @at-root {
  93. :deep() {
  94. #{$selectors} {
  95. @content;
  96. }
  97. }
  98. }
  99. }
  100. /* 对于需要需要嵌套在 m 底下的 e,调用这个混合宏,一般在切换整个组件的状态,如切换颜色的时候 */
  101. @mixin me($element...) {
  102. $selector: &;
  103. $selectors: "";
  104. @if containsModifier($selector) {
  105. @each $item in $element {
  106. $selectors: #{$selectors + "." + $B + $elementSeparator + $item + ","};
  107. }
  108. @at-root {
  109. #{$selector} {
  110. #{$selectors} {
  111. @content;
  112. }
  113. }
  114. }
  115. }
  116. @else {
  117. @each $item in $element {
  118. $selectors: #{$selectors + $selector + $elementSeparator + $item + ","};
  119. }
  120. @at-root {
  121. #{$selectors} {
  122. @content;
  123. }
  124. }
  125. }
  126. }
  127. /* 状态,生成 is-$state 类名 */
  128. @mixin when($states...) {
  129. @at-root {
  130. @each $state in $states {
  131. &.#{$state-prefix + $state} {
  132. @content;
  133. }
  134. }
  135. }
  136. }
  137. /**
  138. * 常用混合宏
  139. */
  140. /* 单行超出隐藏 */
  141. @mixin lineEllipsis {
  142. overflow: hidden;
  143. text-overflow: ellipsis;
  144. white-space: nowrap;
  145. }
  146. /* 多行超出隐藏 */
  147. @mixin multiEllipsis($lineNumber: 3) {
  148. display: -webkit-box;
  149. -webkit-box-orient: vertical;
  150. -webkit-line-clamp: $lineNumber;
  151. overflow: hidden;
  152. }
  153. /* 清除浮动 */
  154. @mixin clearFloat {
  155. &::after {
  156. display: block;
  157. content: "";
  158. height: 0;
  159. clear: both;
  160. overflow: hidden;
  161. visibility: hidden;
  162. }
  163. }
  164. /* 0.5px 边框 指定方向*/
  165. @mixin halfPixelBorder($direction: "bottom", $left: 0, $color: $-color-border-light) {
  166. position: relative;
  167. &::after {
  168. position: absolute;
  169. display: block;
  170. content: "";
  171. @if ($left==0) {
  172. width: 100%;
  173. }
  174. @else {
  175. width: calc(100% - #{$left});
  176. }
  177. height: 1px;
  178. left: $left;
  179. @if ($direction=="bottom") {
  180. bottom: 0;
  181. }
  182. @else {
  183. top: 0;
  184. }
  185. transform: scaleY(0.5);
  186. background: $color;
  187. }
  188. }
  189. /* 0.5px 边框 环绕 */
  190. @mixin halfPixelBorderSurround($color: $-color-border-light) {
  191. position: relative;
  192. &::after {
  193. position: absolute;
  194. display: block;
  195. content: ' ';
  196. pointer-events: none;
  197. width: 200%;
  198. height: 200%;
  199. left: 0;
  200. top: 0;
  201. border: 1px solid $color;
  202. transform: scale(0.5);
  203. box-sizing: border-box;
  204. transform-origin: left top;
  205. }
  206. }
  207. @mixin buttonClear {
  208. outline: none;
  209. -webkit-appearance: none;
  210. -webkit-tap-highlight-color: transparent;
  211. background: transparent;
  212. }
  213. /**
  214. * 三角形实现尖角样式,适用于背景透明情况
  215. * @param $size 三角形高,底边为 $size * 2
  216. * @param $bg 三角形背景颜色
  217. */
  218. @mixin triangleArrow($size, $bg) {
  219. @include e(arrow) {
  220. position: absolute;
  221. width: 0;
  222. height: 0;
  223. }
  224. @include e(arrow-down) {
  225. border-left: $size solid transparent;
  226. border-right: $size solid transparent;
  227. border-top: $size solid $bg;
  228. transform: translateX(-50%);
  229. bottom: calc(-1 * $size)
  230. }
  231. @include e(arrow-up) {
  232. border-left: $size solid transparent;
  233. border-right: $size solid transparent;
  234. border-bottom: $size solid $bg;
  235. transform: translateX(-50%);
  236. top: calc(-1 * $size)
  237. }
  238. @include e(arrow-left) {
  239. border-top: $size solid transparent;
  240. border-bottom: $size solid transparent;
  241. border-right: $size solid $bg;
  242. transform: translateY(-50%);
  243. left: calc(-1 * $size)
  244. }
  245. @include e(arrow-right) {
  246. border-top: $size solid transparent;
  247. border-bottom: $size solid transparent;
  248. border-left: $size solid $bg;
  249. transform: translateY(-50%);
  250. right: calc(-1 * $size)
  251. }
  252. }
  253. /**
  254. * 正方形实现尖角样式,适用于背景不透明情况
  255. * @param $size 正方形边长
  256. * @param $bg 正方形背景颜色
  257. * @param $z-index z-index属性值,不得大于外部包裹器
  258. * @param $box-shadow 阴影
  259. */
  260. @mixin squareArrow($size, $bg, $z-index, $box-shadow) {
  261. @include e(arrow) {
  262. position: absolute;
  263. width: $size;
  264. height: $size;
  265. z-index: $z-index;
  266. }
  267. @include e(arrow-down) {
  268. transform: translateX(-50%);
  269. bottom: 0;
  270. &:after {
  271. content: "";
  272. width: $size;
  273. height: $size;
  274. background-color: $bg;
  275. position: absolute;
  276. left: 0;
  277. bottom: calc(-1 * $size / 2);
  278. transform: rotateZ(45deg);
  279. box-shadow: $box-shadow;
  280. }
  281. }
  282. @include e(arrow-up) {
  283. transform: translateX(-50%);
  284. top: 0;
  285. &:after {
  286. content: "";
  287. width: $size;
  288. height: $size;
  289. background-color: $bg;
  290. position: absolute;
  291. left: 0;
  292. top: calc(-1 * $size / 2);
  293. transform: rotateZ(45deg);
  294. box-shadow: $box-shadow;
  295. }
  296. }
  297. @include e(arrow-left) {
  298. transform: translateY(-50%);
  299. left: 0;
  300. &:after {
  301. content: "";
  302. width: $size;
  303. height: $size;
  304. background-color: $bg;
  305. position: absolute;
  306. left: calc(-1 * $size / 2);
  307. top: 0;
  308. transform: rotateZ(45deg);
  309. box-shadow: $box-shadow;
  310. }
  311. }
  312. @include e(arrow-right) {
  313. transform: translateY(-50%);
  314. right: 0;
  315. &:after {
  316. content: "";
  317. width: $size;
  318. height: $size;
  319. background-color: $bg;
  320. position: absolute;
  321. right: calc(-1 * $size / 2);
  322. top: 0;
  323. transform: rotateZ(45deg);
  324. box-shadow: $box-shadow;
  325. }
  326. }
  327. }