Benutzerdefinierte @mixins

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Mixins sind einer der nützlichsten und überzeugendsten Gründe für die Verwendung eines CSS-Präprozessors. Die typische Art und Weise, wie sie präsentiert werden, ist, um bei CSS3-Herstellervorsilben-Problemen zu helfen. Tatsächlich ist dies ein überzeugender Anwendungsfall. Kein mühsames Schreiben all der Vorsilben mehr und noch mühsamer das Aktualisieren im Laufe der Zeit.

Wenn Sie jedoch Sass verwenden, können Sie Compass verwenden, und Compass hat bereits alle diese CSS3-Mixins für Sie bereit. Möchten Sie die neuen CSS-Filter verwenden, aber zukunftssicher sein? Kein Problem.

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

Und Sie sind bereit.

Aber handgefertigte @mixins können auch nützlich sein! Das heißt, @mixins, die Sie selbst erstellen, um Ihrem spezifischen Projekt zugute zu kommen. Ich habe einen Beitrag von Sacha Greif genossen, in dem er einige @mixins aufgeführt hat, die er manchmal für bestimmte Projekte verwendet.

Zum Beispiel hat er einige für Präge- & Letterpress-Effekte, die auf einigen Websites zu finden sind.

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

Und dann könnten Sie das auf jedem Selektor aufrufen, auf den Sie diesen Effekt anwenden möchten.

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

Wenn Sie hier besonders raffiniert vorgehen möchten, könnten Sie auch einen Platzhalterselektor erstellen, auf den Sie @extend anwenden. Auf diese Weise wiederholen Sie keinen Code in der kompilierten CSS, aber Sie können Ihre Selektoren trennen und sie so organisieren, wie Sie möchten.

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

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

...

.module {
  @extend %box-emboss;
}

Hier ist ein Beispiel dafür auf CodePen.

Ich dachte, ich teile andere benutzerdefinierte @mixins, die ich in einigen meiner eigenen Projekte verwendet habe.

Schriftartenstapel

Auf dieser Website habe ich vier Schriftartenstapel

  1. Marke
  2. Überschriften
  3. Text
  4. Code

Wenn Sie bei Schriftarten richtig vorsichtig sind, setzen Sie wahrscheinlich font-family nicht zu oft in Ihrem Stylesheet. Wenn Sie denselben Stapel mehrmals setzen, läuft etwas schief. Aber Sie müssen es vielleicht mehr als einmal tun. Zum Beispiel haben Sie vielleicht eine Standard-Schriftart für den Text, die buchstäblich auf dem <body> gesetzt ist, aber das wird nicht in Formelemente übernommen, also wenn Sie dieselbe Schriftart dort verwenden möchten, müssen Sie sie erneut auf diese Elemente anwenden. Da Sie es jetzt an zwei Stellen setzen, ist ein @mixin bereits nützlich.

Ich verwende dafür lieber @mixins statt einer String-Variable, die auf die Schriftfamilien selbst gesetzt ist, da das @mixin es Ihnen ermöglicht, auch andere Eigenschaften zu setzen, wenn Sie möchten. Zum Beispiel verwenden Sie vielleicht eine @font-face-Schriftart, bei der Sie nur ein bestimmtes Gewicht laden und daher dieses Gewicht setzen möchten, wann immer Sie diese font-family setzen.

Hier sind die aktuellen @mixins für diese Website

@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;
}

Media Query Mixin

Sie können Mixins erstellen, die den Inhalt ausgeben, den Sie nach ihnen in geschweiften Klammern übergeben. Dies ermöglicht einige nette Möglichkeiten. Zum Beispiel können Sie eine Media-Query "benennen" und sie dann überall verwenden. Das bedeutet, dass Sie diese Media-Query nur an einer Stelle aktualisieren müssen. Zum Beispiel

@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; }
  }
}

Und ein einfaches Anwendungsbeispiel

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

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

Mehr über diese Idee erfahren Sie hier.

Beispiel dafür auf CodePen.

Animation Mixin

Compass hat noch kein @mixin für Keyframe-Animationen, aber es ist sehr einfach, dies selbst hinzuzufügen. Es verwendet die gleiche @content-Idee wie das Media-Query-Mixin oben.

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

Und eines, um die Animation einzustellen...

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

Die Verwendung wird dann einfach.

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

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

Mehr über CSS-Animationen erfahren Sie hier.

Beispiel dafür auf CodePen

Toolbox Mixins

Es gibt einige einfache Hilfsklassen, die ich im Laufe der Jahre in unzähligen Projekten verwendet habe. Dinge wie eine barrierefreie Klasse zum Ausblenden und typografische Hilfsklassen. Wenn Sie dafür ein Mixin erstellen, können Sie doppelt so viel Nutzen daraus ziehen.

// 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;
}

Jetzt haben Sie einen Klassennamen, den Sie im Markup verwenden können, wenn Sie diese Eigenschaften anwenden müssen. Aber Sie haben **auch** ein Mixin, das Sie verwenden können, um diese Eigenschaften auf andere Deklarationen anzuwenden, wenn Sie das Markup nicht berühren können oder wollen.

Beachten Sie, dass ich im Allgemeinen nicht empfehle, Ihre Mixins und Klassen direkt nebeneinander zu platzieren. Ich bevorzuge es, wenn Mixins in einer separaten Datei wie _bits.scss liegen, die nichts kompiliert und daher in jeder anderen Sass-Datei enthalten sein kann.

Ihre?

Es macht immer Spaß zu teilen.