自定义用户 @mixins

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您的旅程各个阶段提供云产品。从 免费赠送的 200 美元信用额度 开始!

Mixins 是使用 CSS 预处理器最有用和最令人信服的原因之一。它们通常用于帮助处理 CSS3 供应商前缀问题。这确实是一个令人信服的用例。不再需要费力地编写所有前缀,也不再需要随着时间的推移而对其进行更新。

但是,如果您使用的是 Sass,则可以使用 Compass,而 Compass 已经为您准备好了所有这些 CSS3 mixins。想使用新的 CSS 过滤器 但又希望它具有未来证明性?没问题

img {
  @include filter(grayscale(100%));
  &:hover {
    @include filter(grayscale(0));
  }
}

您可以开始了。

但是手工制作的 @mixins 也很有用!也就是说,您自己编写的 @mixins,可以使您的特定项目受益。我非常喜欢 Sacha Greif 的一篇文章,他在文章中列出了他有时会在特定项目中使用的一些 @mixins。

例如,他有一些用于在某些网站上找到的浮雕和凸版效果。

@mixin box-emboss($outerOpacity, $innerOpacity) {
  box-shadow:
    rgba(white, $outerOpacity) 0 1px 0, 
    rgba(black, $innerOpacity) 0 1px 0 inset;
}

然后,您可以在您希望具有该效果的任何选择器上调用它。

.module, header[role="banner"] {
  @include box-emboss(0.3, 0.6);
}

如果您想在这方面变得超级聪明,您也可以创建一个占位符选择器来 @extend。这样一来,您就不会在编译后的 CSS 中重复任何代码,但您可以将选择器分开并按任何您想要的方式组织它们。

%box-emboss {
  @include box-emboss(0.3, 0.6);
}

header[role="banner"] {
  @extend %box-emboss;
}

...

.module {
  @extend %box-emboss;
}

这是 CodePen 上的一个示例

我想分享一下我在自己的一些项目中使用过的其他自定义 @mixins。

字体堆叠

在这个网站上,我有四个字体堆叠

  1. 品牌
  2. 标题
  3. 正文
  4. 代码

如果您对字体足够小心,您可能不会在样式表中设置太多不同的 font-family。如果您在十几个地方设置了相同的堆叠,那么就说明有问题。但是,您可能需要设置不止一次。例如,您可能在 <body> 上设置了一个默认的正文字体,但这不会级联到表单元素,因此如果您想在那里使用相同的字体,您需要在这些元素上再次设置它。现在您在两个地方设置了它,@mixin 已经很有用。

我喜欢使用 @mixins 来实现这一点,而不是将字符串变量设置为字体系列本身,因为 @mixin 允许您在需要时设置其他属性。例如,您可能正在使用 @font-face 字体,其中您只加载了一种特定的权重,因此您希望在设置该 font-family 时设置该权重。

这是目前这个网站的 @mixins

@mixin font-stack-brand {
  font-family: 'Gotham Rounded A', 'Gotham Rounded B', "proxima-nova-soft", sans-serif;
}
@mixin font-stack-headers {
  font-family: 'Whitney Cond A', 'Whitney Cond B', "ronnia-condensed", sans-serif;
  font-weight: 700;
  font-style: normal;
}
@mixin font-stack-body {
  font-family: 'Whitney SSm A', 'Whitney SSm B', "ff-meta-web-pro", sans-serif;
}
@mixin font-stack-code {
  font-family: Menlo, "inconsolata", Monaco, "Courier New", Courier, monospace;
}

媒体查询 Mixin

您可以创建输出您在花括号中传递的内容的 mixins。这允许一些巧妙的可能性。例如,您可以为媒体查询命名,然后在需要的地方使用它。这意味着更新该媒体查询只需要在一个地方进行。例如

@mixin breakpoint($point) {
  @if $point == mama-bear {
    @media (max-width: 1250px) { @content; }
  }
  @if $point == baby-bear {
    @media (max-width: 800px) { @content; }
  }
  @if $point == reverso-baby-bear {
    @media (min-width: 800px) { @content; }
  }
  @if $point == reverso-mama-bear {
    @media (min-width: 1250px) { @content; }
  }
}

一个简单的用法示例

.page-wrap {
  width: 80%;
  @include breakpoint(baby-bear) {
    width: 100%;
  }
}

.footer {
  a {
    display: inline-block;
    @include breakpoint(baby-bear) {
      display: block;
    }
  }
}

您可以在这里了解更多关于这个想法的信息。

CodePen 上的示例。

动画 Mixin

Compass 还没有为关键帧动画提供 @mixin,但这很容易自己添加。它使用与上面媒体查询 mixin 相同的 @content 想法。

@mixin keyframes($name) {
  @-webkit-keyframes #{$name} {
    @content
  }
  @-moz-keyframes #{$name} {
    @content
  }
  @-ms-keyframes #{$name} {
    @content
  }
  @-o-keyframes #{$name} {
    @content
  }
  @keyframes #{$name} {
    @content
  }
}

还有另一个用于设置动画的 mixin...

@mixin animation($value) {
  -webkit-animation: $value;
  -moz-animation: $value;
  -ms-animation: $value;
  -o-animation: $value;
  animation: $value;
}

然后使用它就很简单了

@include keyframes(move) {
  0%   { left: 0; }
  100% { left: 100px; }
}

.box {
  @include animation(move 0.5s ease infinite alternate);
}

您可以在这里了解更多关于 CSS 动画的信息。

CodePen 上的示例

工具箱 Mixins

多年来,我在无数项目中使用了一些简单的辅助类。例如,辅助类可以用于无障碍隐藏和排版。如果您为这些东西创建了一个 mixin,您就可以获得双倍的收益。

// Accessible hiding
@mixin screen-reader-text() {
  position: absolute;
  top: -9999px;
  left: -9999px;
}
.screen-reader-text {
  @include screen-reader-text;
}
// Overflow Ellipsis
@mixin ellipsis() {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.ellipsis {
  @include ellipsis;
}
// Word Wrapping
@mixin word-wrap() {
  -ms-word-break: break-all;
  word-break: break-all;
  word-break: break-word;
  -webkit-hyphens: auto;
  -moz-hyphens: auto;
  hyphens: auto;
}
.word-wrap {
  @include mixin word-wrap;
}

现在您有了可以在标记中使用的类名,如果您需要应用这些属性。但您还可以使用 mixin 将这些属性应用于其他声明,如果您无法或不想修改标记。

请注意,我通常不建议将 mixins 和类放在一起,就像这样。我更喜欢将 mixins 放在单独的文件中,例如 _bits.scss,该文件编译成空文件,因此可以包含在任何其他 Sass 文件中。

您的?

分享总是很有趣。