Essential SASS Mixins

SASS

Here’s some SASS Mixins I’ve collected over the years.

Anti-Alias

@mixin antialias {
    font-smoothing: antialiased;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

Highlights

@mixin selection {
    ::-moz-selection { @content; }
    ::selection { @content; }
}

Unselectable

@mixin unselectable {
    -webkit-touch-callout: none;
    user-select: none;
}

Reset Box

@mixin reset-box {
    padding: 0;
    margin: 0;
}

Rem font output with px fallback

@mixin font-size($sizeValue: 1) {
    font-size: ($sizeValue * 16) * 1px;
    font-size: $sizeValue * 1rem;
}

Center block

@mixin center-block {
    display: block;
    margin-left: auto;
    margin-right: auto;
}

Another way to center things

@mixin centerer($horizontal: true, $vertical: true) {
    position: absolute;
    @if ($horizontal and $vertical) {
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }
    @else if ($horizontal) {
        left: 50%;
        transform: translate(-50%, 0);
    }
    @else if ($vertical) {
        top: 50%;
        transform: translate(0, -50%);
    }
}

Box Shadow

@mixin box-shadow($params) {
    -webkit-box-shadow: $params;
    -moz-box-shadow: $params;
    box-shadow: $params;
}

Aspect Ratio

@mixin aspect-ratio($width, $height) {
    position: relative;
    &:before {
        display: block;
        content: "";
        width: 100%;
        padding-top: ($height / $width) * 100%;
    }
    > .content {
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
    }
}

Rounded edges/corners

@mixin border-radius($radius: 0.5em, $important: false) {
    @if $important {
        -webkit-border-radius: $radius !important;
        -moz-border-radius: $radius !important;
        border-radius: $radius !important;
    }
    @else {
        -webkit-border-radius: $radius;
        -moz-border-radius: $radius;
        border-radius: $radius;
    }
}

Clearfix (Inline)

@mixin clearfix() {
    content: "";
    display: table;
}

Clearfix (::after)

@mixin cf {
    &::after {
        content: '';
        display: table;
        clear: both;
    }
}

Hide from Screen-readers

@mixin hidden {
    display: none;
    visibility: hidden;
}

Generic Transform

@mixin transform($transforms) {
    -moz-transform: $transforms;
    -o-transform: $transforms;
    -ms-transform: $transforms;
    -webkit-transform: $transforms;
    transform: $transforms;
}

Transition

@mixin transition($args) {
    -webkit-transition: $args;
    -moz-transition: $args;
    -ms-transition: $args;
    -o-transition: $args;
    transition: $args;
}

Filters

Blur

@mixin blur($amount) {
    filter: blur($amount);
    -webkit-filter: blur($amount);
}

Black and White

@mixin greyscale($amount) {
    filter: grayscale($amount);
    -webkit-filter: grayscale($amount);
}

Rotate

@mixin rotate($deg) {
    @include transform(rotate(#{$deg}deg));
}

Opacity

@mixin opacity($opacity) {
    opacity: $opacity;
    $opacity-ie: $opacity * 100;
    filter: alpha(opacity=$opacity-ie); //IE8
}

Truncate String

@mixin text-truncate {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

Pseudo Content

@mixin pseudo($display: block, $pos: absolute, $content: ''){
    content: $content;
    display: $display;
    position: $pos;
}

Foundation Breakpoint Media Queries

@mixin size-real-medium {
    @media only screen and (max-width: 64em) {
        @content;
    }
}

@mixin size-real-large {
    @media only screen and (min-width: 64em) {
        @content;
    }
}

@mixin size-large {
    @media only screen and (min-width: 40em) {
        @content;
    }
}

@mixin size-small {
    @media only screen and (max-width: 39.9375em) {
        @content;
    }
}

@mixin size-real-small {
    @media only screen and (max-width: 30em) {
        @content;
    }
}

Custom Media Queries Alternative

$breakpoints: (
    "phone":        400px,
    "phone-wide":   480px,
    "phablet":      560px,
    "tablet-small": 640px,
    "tablet":       768px,
    "tablet-wide":  1024px,
    "desktop":      1248px,
    "desktop-wide": 1440px
);
@mixin mq($width, $type: min) {
    @if map_has_key($breakpoints, $width) {
        $width: map_get($breakpoints, $width);
        @if $type == max {
            $width: $width - 1px;
        }
        @media only screen and (#{$type}-width: $width) {
            @content;
        }
    }
}

// Z-Indexes

@function z($name) {
    @if index($z-indexes, $name) {
        @return (length($z-indexes) - index($z-indexes, $name)) + 1;
    } @else {
        @warn 'There is no item "#{$name}" in this list; choose one of: #{$z-indexes}';
        @return null;
    }
}
$z-indexes: (
    "outdated-browser",
    "modal",
    "site-header",
    "page-wrapper",
    "site-footer"
);

Hardware Acceleration

@mixin hardware($backface: true, $perspective: 1000) {
    @if $backface {
        backface-visibility: hidden;
    }
    perspective: $perspective;
}

Remove Margins From Top/Bottom

@mixin content-margins($selector: '> *', $last-child: false) {
    @if not $selector {
        $selector: '&';
    }
    #{unquote($selector)} {
        &:first-child { margin-top: 0; }
        @if $last-child {
            &:last-child { margin-bottom: 0; }
        }
    }
}

Retina Images

@mixin retina {
    @media only screen and (-webkit-min-device-pixel-ratio: 1.5),
    only screen and (-moz-min-device-pixel-ratio: 1.5),
    only screen and (-o-min-device-pixel-ratio: 3 / 2),
    only screen and (min-device-pixel-ratio: 1.5),
    only screen and (min-resolution: 1.5dppx) {
        @content;
    }
}

Gradients

@function convert-angle($value, $unit) {
    $convertable-units: deg grad turn rad;
    $conversion-factors: 1 (10grad/9deg) (1turn/360deg) (3.1415926rad/180deg);
    @if index($convertable-units, unit($value)) and index($convertable-units, $unit) {
        @return $value / nth($conversion-factors, index($convertable-units, unit($value))) * nth($conversion-factors, index($convertable-units, $unit));
    }
    @warn "Cannot convert `#{unit($value)}` to `#{$unit}`.";
}

@function is-direction($value) {
    $is-direction: index((to top, to top right, to right top, to right, to bottom right, to right bottom, to bottom, to bottom left, to left bottom, to left, to left top, to top left), $value);
    $is-angle: type-of($value)=='number' and index('deg' 'grad' 'turn' 'rad', unit($value));
    @return $is-direction or $is-angle;
}

@function legacy-direction($value) {
    @if is-direction($value)==false {
        @warn "Cannot convert `#{$value}` to legacy syntax because it doesn't seem to be an angle or a direction";
    }
    $conversion-map: ( to top: bottom, to top right: bottom left, to right top: left bottom, to right: left, to bottom right: top left, to right bottom: left top, to bottom: top, to bottom left: top right, to left bottom: right top, to left: right, to left top: right bottom, to top left: bottom right);
    @if map-has-key($conversion-map, $value) {
        @return map-get($conversion-map, $value);
    }
    @return 90deg - convert-angle($value, 'deg');
}

@mixin linear-gradient($direction, $color-stops...) {
    @if is-direction($direction)==false {
        $color-stops: ($direction, $color-stops);
        $direction: 180deg;
    }
    background: nth(nth($color-stops, 1), 1);
    background: -webkit-linear-gradient(legacy-direction($direction), $color-stops);
    background: linear-gradient($direction, $color-stops);
}

CSS Triangles

@mixin css-triangle($color, $direction, $size: 6px, $position: absolute, $round: false){
    @include pseudo($pos: $position);
    width: 0;
    height: 0;
    @if $round {
        border-radius: 3px;
    }
    @if $direction == down {
        border-left: $size solid transparent;
        border-right: $size solid transparent;
        border-top: $size solid $color;
        margin-top: 0 - round( $size / 2.5 );
    } @else if $direction == up {
        border-left: $size solid transparent;
        border-right: $size solid transparent;
        border-bottom: $size solid $color;
        margin-bottom: 0 - round( $size / 2.5 );
    } @else if $direction == right {
        border-top: $size solid transparent;
        border-bottom: $size solid transparent;
        border-left: $size solid $color;
        margin-right: -$size;
    } @else if  $direction == left {
        border-top: $size solid transparent;
        border-bottom: $size solid transparent;
        border-right: $size solid $color;
        margin-left: -$size;
    }
}

Fade Animation

@-webkit-keyframes fade_up {
    0% {
        @include opacity(0);
        @include transform(translate(0, 70px));
    }
    100% {
        @include transition(transform 1.1s ease-out);
        @include transform(translate(0, 0));
        @include opacity(1);
    }
}

@keyframes fade_up {
    0% {
        @include opacity(0);
        @include transform(translate(0, 70px));
    }
    100% {
        @include transition(transform 1.1s ease-out);
        @include transform(translate(0, 0));
        @include opacity(1);
    }
}

.animate {
    @include opacity(0);
    @include transform(translate(0, 100px));
    -webkit-animation-duration: 1.1s;
    animation-duration: 1.1s;
    -webkit-animation-fill-mode: both;
    animation-fill-mode: both;

    &.reveal {
        -webkit-animation-name: fade_up;
        animation-name: fade_up;
    }
}

Small Big Animation

@keyframes smallbig {
    0%,
    100% {
        @include transform(scale(1));
    }
    50% {
        @include transform(scale(0));
    }
}
ender