Zum Inhalt springen

Nebula für ibase3

Eine Sammlung üblicher frontend patterns von Marc Wittenbrink.


Color Guide:

HTML    Sass (SCSS)    CSS    JavaScript / jQuery    Dateien


Werkzeuge

Das Verzeichnis sass/utils enthält einige hilfreiche Sass-Mixins und -Funktionen. Im Folgenden werden einige von ihnen vorgestellt.


Layout-Werkzeuge

sass/utils/_layout.scss

@mixin clearfix

@include clearfix;
@include cf;

Der "clearfix" wird normalerweise im Zusammenhang mit floats verwendet und wird heutzutage eher seltener benutzt. Es kann dazu entweder direkt die Klasse .clearfix genutzt werden oder das Sass-Mixin @include clearfix (oder die Abkürzung @include cf)

.wrapper {
    @include clearfix;
}
.wrapper:after {
    content: '';
    display: table;
    clear: both;
}
  • sass/utils/_layout.scss

@function z z-index Management

z ( string $layer );

Anstatt "z-index"-Werte an vielen Stellen im Code direkt zu vergeben, kann man auch mit Variablen arbeiten, um einen Überblick über die vergebenen Werte zu behalten. Die Indizes werden dazu in einer einzigen Sass-Map (in der Datei sass/variables/_layout.scss) festgelegt und mit einem Namen versehen.

Um einen z-Index anzuwenden, kann die Funktion z wie folgt verwendet werden: z-index: z(NAME).

$z-layers: (
    header:    30,
    content:   10,
    footer:    20
);

.header {   z-index: z(header);   }
.content {  z-index: z(content);  }
.footer  {  z-index: z(footer);   }
  • sass/variables/_layout.scss (z-index Konfiguration)
  • sass/utils/_layout.scss

@mixin visually-hidden

@include visually-hidden;

Mit diesem Mixin kann man ein Element optisch verstecken. Es kann weiterhin von Screenreadern gelesen werden.

Die CSS-Klasse .visually-hidden ist entsprechend vordefiniert.

<p class="visually-hidden">Dieses Element ist optisch unsichtbar, aber nicht für Screenreader.</p>
.visually-hidden {
    @include visually-hidden;
}
  • sass/utils/_layout.scss (das Mixin)
  • sass/basic/_layout.scss (die CSS-Klasse)

@mixin absolute / @mixin relative / @mixin fixed Positioning mixins

@include absolute ( list $args );
@include fixed ( list $args );
@include relative ( list $args );

Mit den Sass-Mixins @mixin absolute, @mixin fixed und @mixin relative können Elemente bequem positioniert werden. Jedes dieser Mixins nimmt ein Argument auf, welches den vier Positionierungs-Eigenschaften (top, right, bottom, left) entspricht. Jede dieser Eigenschaften kann durch den Wert null ersetzt werden, dann wird sie ignoriert. Eine zuvor gesetzte Eigenschaft kann durch den Wert auto wieder zurückgesetzt werden.

Darüberhinaus können auch Shorthands benutzt werden, wie man es z.B. von margin und padding kennt.

.example-pos1
.example-pos2
.example-pos3
.example-pos4
.example-pos1 {
    /*
        top: 1rem
        right: 2rem
        left: 4rem
    */
    @include absolute(1rem 2rem null 4rem);
}

.example-pos2 {
    /*
        right & left: 5rem
        bottom: 2rem
    */
    @include absolute(null 5rem 2rem);
}

.example-pos3 {
    /*
        top & bottom: 12rem
        right & left: 0
    */
    @include absolute(12rem 0);
}

.example-pos4 {
    /*
        top & bottom & right & left: 7rem
    */
    @include absolute(7rem);
}
.example-pos1 {
    top: 1rem;
    right: 2rem;
    left: 4rem;
    position: absolute;
}

.example-pos2 {
    right: 5rem;
    bottom: 2rem;
    left: 5rem;
    position: absolute;
}

.example-pos3 {
    top: 12rem;
    right: 0;
    bottom: 12rem;
    left: 0;
    position: absolute;
}

.example-pos4 {
    top: 7rem;
    right: 7rem;
    bottom: 7rem;
    left: 7rem;
    position: absolute;
}
  • sass/utils/_layout.scss

@mixin center-vertical

@include center-vertical;

Um ein Element mit variabler Höhe vertikal zu zentrieren, wird üblicherweise die flexbox-Technik verwendet. Hiermit geht's aber auch.

http://hackingui.com/front-end/10-best-scss-utilities/

Mittlerweile (2020) kann dieses Mixin als "oldschool" bezeichnet werden. Für die meisten Abwendungsfälle empfiehlt sich eher die flexbox-Technik.

I am a lonely div inside another lonely div. But at least I am a vertically centered div!
<div class="example-center-vert">
    <div class="example-center-vert-item">
        I am a lonely div inside another lonely div. But at least I am a vertically centered div!
    </div>
</div>
.example-center-vert {
    @include center-vertical;
    [...]
}

.example-center-vert-item {
    @include inline-block;
    [...]
}
  • sass/utils/_layout.scss

@mixin center-both

@include center-both;

Elemente mit dynamischer Breite und Höhe werden hiermit sowohl horizontal als auch vertikal zentriert.

Mittlerweile (2020) kann dieses Mixin als "oldschool" bezeichnet werden. Für die meisten Abwendungsfälle empfiehlt sich eher die flexbox-Technik.

I am a lonely div inside another lonely div. But at least I am a perfectly centered div!
<div class="example-center-both">
    <div class="example-center-both-item">
        I am a lonely div inside another lonely div. But at least I am a perfectly centered div!
    </div>
</div>
.example-center-both {
    position: relative;
    [...]
}

.example-center-both-item {
    @include center-both;
    [...]
}
  • sass/utils/_layout.scss

Größen-Werkzeuge

sass/utils/_sizing.scss

@mixin nb-size

@include nb-size ( string $width , string $height );

Eine Abkürzung für die CSS-Eigenschaften width und height.

.card {
    @include nb-size(10rem, 20rem);
}

.icon {
    @include nb-size(4rem);
}
.card {
    width: 10rem;
    height: 20rem;
}

.icon {
    width: 4rem;
    height: 4rem;
}
  • sass/utils/_sizing.scss

@mixin nb-aspect-ratio

@include nb-aspect-ratio ( [ string $width-factor , string $height-factor ] );

Liefert CSS-Eigenschaften für ein Element, welches seine Proportionen erhält, wenn es vergrößert oder verkleinert wird.

.video-wrapper {
    @include nb-aspect-ratio;
}

.photo-35mm-wrapper {
    @include nb-aspect-ratio(3, 2);
}
.video-wrapper {
    width: 100%;
    height: 0;
    padding-bottom: 56.25%;
}

.photo-35mm-wrapper {
    width: 100%;
    height: 0;
    padding-bottom: 66.6666667%;
}
  • sass/utils/_sizing.scss

Typographie-Werkzeuge

sass/utils/_typography.scss

@mixin nb-font-size font-size und line-height

@include nb-font-size ( list $args );
p {
    @include nb-font-size(1.6rem 2.4rem);
}
p {
    font-size: 1.6rem;
    line-height: 2.4rem;
}
  • sass/utils/_typography.scss
  • sass/utils/_helpers.scss (dependency @mixin x-rem)

@mixin rwd-font-size Responsive Typographie

@include rwd-font-size ( map $definition );

Aufbauend auf @mixin font-size kann dieses Mixin dazu verwendet werden, für verschiedene Breakpoints unterschiedliche Werte für font-size und line-height zu setzen.

Im folgenden Kapitel "Responsives Webdesign" werden die Breakpoints näher erklärt.

$p-font-size: (
    null: (1.8rem 2.6rem),      // "null" is the default (mobile) size
    sm:   (1.6rem 2.4rem),      // breakpoint "sm" (600px)
    lg:   (1.4rem 2rem)       // breakpoint "lg" (980px)
);

p {
    @include rwd-font-size($p-font-size);
}
p {
    font-size: 1.8rem;
    line-height: 2.6rem;
}

@media(min-width: 600px) {
    p {
        font-size: 1.6rem;
        line-height: 2.4rem;
    }
}

@media(min-width: 980px) {
    p {
        font-size: 1.4rem;
        line-height: 2.0rem;
    }
}
  • sass/utils/_typography.scss
  • sass/utils/_helpers.scss (dependency @mixin x-rem)

@mixin font-family

@include font-family ( string $key );
@include ff ( string $key );

Setzt einen in $font-families definierten font-family-Stack. Diese können in der Datei variables/_typography.scss bearbeitet werden.

@include ff kann als Abkürzung verwendet werden.

Text font-family

Heading font-family

Code font-family

.example-family-text {
    @include font-family('text');           // Normales mixin
}

.example-family-heading {
    @include ff('heading');                 // Abkürzung
}

.example-family-code {
    @include ff('code', $font-families);    // Der zweite Parameter ist optional
}
  • sass/utils/_typography.scss
  • sass/variables/_typography.scss ($font-families Konfiguration)

@mixin truncate-text

@include truncate-text;

Quelle: http://hackingui.com/front-end/10-best-scss-utilities/.

Ein kleines Mixin, das sicherstellt, dass ein Textelement nicht über den Container läuft und sauber abgeschnitten wird. Es nimmt einen Parameter auf, bei dem es sich um einen der gültigen Textüberlaufwerte handelt (der Standardwert "ellipsis", "clip", oder ein String).

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum in posuere orci. Nam euismod gravida nunc. Ut accumsan vitae dolor interdum ullamcorper. Ut luctus, lacus quis finibus bibendum, tortor nisl tristique mauris, eu efficitur nisi felis sit amet lacus.

.example-truncate {
    @include truncate-text; // parameter ist optional
}
  • sass/utils/_typography.scss

@mixin remove-whitespace

@include remove-whitespace;

@include remove whitespace entfernt die Lücken zwischen Inline-Block-Elementen, indem die Schriftgröße auf Null gesetzt und der Wortabstand angepasst wird.

Mit @include reset-text können die Text-Styles wieder auf ihren Normalwert zurückgesetzt werden.

These
are
inline-block
<div class="rw-example">
    <div class="rw-example__item">These</div>
    <div class="rw-example__item">are</div>
    <div class="rw-example__item">inline-block</div>
</div>
.rw-example {
    @include remove-whitespace;
}

.rw-example__item {
    @include inline-block;
    border: 1px solid #f66;
    padding: 10px;
    @include rwd-font-size($p-font-size);
    @include reset-text;
}
  • sass/utils/_typography.scss

@mixin hide-text

@include hide-text;

Dieses Mixin kann dazu verwendet werden, den Textinhalt in einem Element auszublenden.

This text is hidden

<p class="example-hidetext">This text is hidden</p>
.example-hidetext {
    background-color: #ccf;
    width: 200px;
    height: 50px;
    @include hide-text;
}
  • sass/utils/_typography.scss

Farb-Werkzeuge

sass/utils/_color.scss

@function nb-color

nb-color ( string $color [, string $tone , map $map ] );

Legt eine vordefinierte Farbe aus $colors oder einer anderen Sass-map mit Farbdefinitionen fest.

Text color

Background color

.example-color {
    color: nb-color('primary');
}

.example-bgcolor {
    background-color: nb-color('greyscale', 'light');
}
  • sass/utils/_colors.scss
  • sass/variables/colors.scss (Hier wird die Sass-map $color definiert)

@function nb-shade / @function nb-tint

nb-shade ( string $color , float $percentage );
nb-tint ( string $color , float $percentage );
//$percentage: percentage of `$color` in returned color

Verdunkelt oder erhellt eine Farbe, indem sie entweder mit Schwarz oder Weiß gemischt wird.

nb-shade(#00ff00, 30);

nb-tint(#ff0000, 50);

.example-shade {
    background-color: nb-shade(#00ff00, 30);
}

.example-tint {
    background-color: nb-tint(#ff0000, 50);
}
  • sass/utils/_colors.scss

@mixin nb-link-colors

@include nb-link-colors(string $link, string $visited, string $hover, string $active);

Setzt die Farbwerte für die :link, :visited, :hover and :active Zustände.

.example-linkcolors {
    @include nb-link-colors(#00f, #00c, #009, #000);
}
  • sass/utils/_colors.scss

Mixins

Das Verzeichnis sass/mixins enthält einige vorgefertigte Styleangaben für verschienene UI-Elemente.

@mixin nb-accordion

@include nb-accordion(string $color, string $hover-color);

Styles für das UI-Element "Accordion". Siehe Abschnitt Accordion.

  • sass/mixins/_accordion.scss

@mixin nb-alert-message

@include nb-alert-message(string $text-color, string $bg-color, string $border-color);

Styles für das UI-Element "Alert Message". Siehe Abschnitt Benachrichtigungen.

  • sass/mixins/_alert.scss

@mixin nb-carousel

@include nb-carousel(percentage $aspect-ratio, string $caption-color, string $caption-bg-color);

Styles für das UI-Element "Carousel". Siehe Abschnitt Carousel.

  • sass/mixins/_carousel.scss

@mixin nb-dropdown-content
@mixin nb-dropdown-content-list
@mixin nb-dropdown

@include nb-dropdown-content([string $content-padding, string $bg-color, string $border, string $border-color, string $box-shadow]);
@include nb-dropdown-content-list([string $padding, string $option-padding, string $color, string $hover-color, string $active-color, string $hover-bg-color, string $active-bg-color]);
@include nb-dropdown ( [ map $params ] );

Styles für das UI-Element "Dropdown". Siehe Abschnitt Dropdowns.

  • sass/mixins/_dropdown.scss

@mixin tabs-list
@mixin tabs-container

@include tabs-list ([string $tab-padding, string $tab-border-radius, string $tab-color, string $tab-border-color, string $tab-bg-color, string $tab-hover-color, string $tab-hover-border-color, string $tab-hover-bg-color, string $tab-active-color, string $tab-active-border-color, string $tab-active-bg-color]);
@include tabs-container ([string $tab-padding, string $tab-border-radius, string $tab-color, string $tab-border-color, string $tab-bg-color, string $tab-hover-color, string $tab-hover-border-color, string $tab-hover-bg-color, string $tab-active-color, string $tab-active-border-color, string $tab-active-bg-color]);

Styles für das UI-Element "Tabs". Siehe Abschnitt Tabs.

@mixin tabs-container contains all the styles for a fully functional tabs ui-element that is initialized by JavaScript. @mixin tabs-list only covers the tabs-ul itself and can be used to create a tab-style navigation.

  • sass/mixins/_tabs.scss

@mixin reset-list

@include nb-reset-list;

list styles resetten (list-style-type, padding).

  • This
  • list
  • is
  • resetted
<ul class="example-reset-list">
    <li>This</li>
    <li>list</li>
    <li>is</li>
    <li>resetted</li>
</ul>
.example-reset-list {
    @include nb-reset-list;
}
  • sass/mixins/_list.scss

@mixin no-list
@mixin comma-separated-list

@include nb-no-list;
@include nb-comma-separated-list;

Während @mixin nb-no-list sämtliche Listen-spezifischen Styles von einer <ul> oder <ol> entfernt, lässt @mixin nb-comma-separated-list diese zusätzlich wie eine einzeilige, kommaseparierte Liste aussehen.

  • This
  • list
  • is
  • comma
  • separated
<ul class="example-comma-separated">
    <li>This</li>
    <li>list</li>
    <li>is</li>
    <li>comma</li>
    <li>separated</li>
</ul>
.example-comma-separated {
    @include nb-no-list;
    @include nb-comma-separated-list;
}
  • sass/mixins/_list.scss

@mixin nb-embed-container

@include nb-embed-container ( [ string $width-factor , string $height-factor ] );

@mixin nb-embed-container basiert auf @mixin nb-aspect-ratio (siehe oben), um Styles für ein Element zu generieren, in dem ein Videoplayer oder ein ähnliches Element Platz findet, welches proportional vergrößert oder verkleinert werden muss.

<div class="example-embedcontainer">
    <iframe src="https://www.youtube.com/embed/IBMKyNJvNV8" frameborder="0" allowfullscreen></iframe>
</div>
.example-embedcontainer {
    @include nb-embed-container;
}
  • sass/mixins/_embed-container.scss

@mixin nb-hamburger

@include nb-hamburger ( [ map $params ] );

@mixin nb-hamburger generiert Styles für ein "hamburger icon". Im Tab "SCSS" werden die einzelnen Parameter erklärt.

<div class="example-hamburgericon" role="button">
    <div class="example-hamburgericon__bar"></div>
    <div class="example-hamburgericon__bar"></div>
    <div class="example-hamburgericon__bar"></div>
</div>
.example-hamburgericon {
    @include nb-hamburger((
        height: 16px,       // Höhe des Icons
        width: 22px,        // Breite des Icons
        bar-height: 2px,    // Dicke der drei Balken
        color: #333,        // Iconfarbe
    ));
}
  • sass/mixins/_hamburger.scss

@mixin nb-loading-spinner

@include nb-loading spinner ( [ map $params ] );

Generiert CSS für eine Lade-Animation. Im Tab "SCSS" werden die einzelnen Parameter erklärt.

<div class="example-spinner"></div>
.example-spinner {
    @include nb-loading-spinner((
        size: 40px,                 // Größe
        border-width: 4px,          // Rahmendicke
        color1: rgba($black, 0.1),  // Grundfarbe
        color2: color('primary'),   // Highlight-Farbe
        duration: 1s                // Zeitraum einer einzelnen Umdrehung
    ));
}
  • sass/mixins/_loading.scss

@mixin nb-triangle

@include nb-triangle ( [ string $direction , string $size , string $color ] );
@include nb-triangle-absolute ( [ string $direction , string $size , string $color ] );

@mixin nb-triangle generiert ein rechtwinkliges Dreieck, dessen rechter Winkel in eine Richtung zeigt, die vom Parameter $direction bestimmt wird. @mixin nb-triangle-absolute fügt weitere Styles zur absoluten Positionierung von Pseudo-Elementen hinzu.

What a pretty triangle!
<span class="triangled">What a pretty triangle!</span>
.triangled {
    position: relative;
    [...]
    &:before {
        @include nb-triangle-absolute(bottom, 10px, $blue1);
        bottom: -10px;
        left: 50%;
        transform: translate(-50%, 0);
    }
}
  • sass/mixins/_triangle.scss

Responsives Webdesign

Die Datei utils/_responsive.scss enthält Mixins und Funktionen zum Aufbau einer responsiven Website.

$breakpoints Breakpoint-Konfiguration

Bei der Erstellung einer responsiven Website kann die Sass-map $breakpoints in der Datei sass/variables/_layout.scss dazu verwendet werden, um den einzelnen Breakpoints Namen zu geben. Dadurch können die breakpoints einfach verfolgt und die Medienabfragen global geändert werden, ohne versehentlich welche zu übersehen.

Es können nach Belieben weitere Haltepunkte hinzugefügt oder die Namen und Werte vollständig verändert werden. Dabei sollte jedoch sichergestellt werden, dass die Werte dabei aufsteigend geordnet sind, beginnend mit dem kleinsten, gefolgt vom zweitkleinsten und so weiter.

Die folgenden Mixins und Klassen basieren auf $breakpoints.

$breakpoints: (
    xs: 400px,  /* iPhone 6 Plus    */
    sm: 600px,  /* Nexus 7          */
    md: 730px,  /* iPad             */
    lg: 980px,  /* Desktop 1024     */
    xl: 1200px  /* Widescreen       */
);
  • sass/variables/_layout.scss

@mixin bp-min min-width breakpoint mixin

Ein Mixin für responsives Webdesign, das verwendet werden kann, um min-width Medienabfragen anhand der vordefinierten $breakpoints (siehe oben) zu erstellen.

Schreibfaule können auch die Abkürzung @mixin bp verwenden.

$breakpoints: (
    xs: 400px,
    sm: 600px,
    md: 730px,
    lg: 980px,
    xl: 1200px
);

.wrapper {
    /* Styles for mobile resolution */

    @include bp(xs) {
        /* Styles for extra-small resolution */
    }

    @include bp(sm) {
        /* Styles for small resolution */
    }

    @include bp(md) {
        /* Styles for medium resolution */
    }

    @include bp(lg) {
        /* Styles for large resolution */
    }

    @include bp(xl) {
        /* Styles for extra large resolution */
    }
}
.wrapper {
    /* Styles for mobile resolution */
}

@media (min-width: 400px) {
    .wrapper {
        /* Styles for extra-small resolution */
    }
}

@media (min-width: 600px) {
    .wrapper {
        /* Styles for small resolution */
    }
}

@media (min-width: 730px) {
    .wrapper {
        /* Styles for medium resolution */
    }
}

@media (min-width: 980px) {
    .wrapper {
        /* Styles for large resolution */
    }
}

@media (min-width: 1200px) {
    .wrapper {
        /* Styles for extra large resolution */
    }
}
  • sass/variables/_layout.scss (Breakpoint-Konfiguration)
  • sass/utils/_responsive.scss (Das Mixin)

@mixin bp-max max-width breakpoint mixin

Ebenfalls anhand der vordefinierten $breakpoints kann man hiermit max-width Medienabfragen erstellen. Von dem in $breakpoints angegebenen Wert wird dabei jeweils 1px abgezogen, um Überlappungen zu vermeiden.

$breakpoints: (
    xs: 400px,
    sm: 600px,
    md: 730px,
    lg: 980px,
    xl: 1200px
);

.wrapper {
    /* Styles for extra large resolution */

    @include bp-max(xl) {
        /* Styles for large resolution */
    }

    @include bp-max(lg) {
        /* Styles for medium resolution */
    }

    @include bp-max(md) {
        /* Styles for small resolution */
    }

    @include bp-max(sm) {
        /* Styles for extra-small resolution */
    }

    @include bp-max(xs) {
        /* Styles for mobile resolution */
    }
}
.wrapper {
    /* Styles for extra large resolution */
}

@media (max-width: 1199px) {
    .wrapper {
        /* Styles for large resolution */
    }
}

@media (max-width: 979px) {
    .wrapper {
        /* Styles for medium resolution */
    }
}

@media (max-width: 729px) {
    .wrapper {
        /* Styles for small resolution */
    }
}

@media (max-width: 599px) {
    .wrapper {
        /* Styles for extra-small resolution */
    }
}

@media (max-width: 399px) {
    .wrapper {
        /* Styles for mobile resolution */
    }
}
  • sass/variables/_layout.scss (Breakpoint-Konfiguration)
  • sass/utils/_responsive.scss (das Mixin)

@mixin bp-min-max min-width and max-width breakpoint mixin

Mit diesem Mixin können - auf Basis der vordefinierten $breakpoints - Medienabfragen erstellt werden, die sowohl eine min-width- als auch eine max-with-Komponente enthalten.

Als Abkürzung kann auch @mixin bp-both verwendet werden.

$breakpoints: (
    xs: 400px,
    sm: 600px,
    md: 730px,
    lg: 980px,
    xl: 1200px
);

.wrapper {
    /* General styles */

    @include bp-min-max(xs, sm) {
        /* Styles for between extra small and small resolution */
    }

    @include bp-min-max(sm, md) {
        /* Styles for between small and medium resolution */
    }

    @include bp-min-max(md, lg) {
        /* Styles for between medium and large resolution */
    }

    @include bp-min-max(sm, xl) {
        /* Styles for between small and extra large resolution */
    }
}
.wrapper {
    /* General styles */
}

@media (min-width: 400px) and (max-width: 599px) {
    .wrapper {
        /* Styles for between extra small and small resolution */
    }
}

@media (min-width: 600px) and (max-width: 729px) {
    .wrapper {
        /* Styles for between small and medium resolution */
    }
}

@media (min-width: 730px) and (max-width: 979px) {
    .wrapper {
        /* Styles for between medium and large resolution */
    }
}

@media (min-width: 600px) and (max-width: 1199px) {
    .wrapper {
        /* Styles for between small and extra large resolution */
    }
}
  • sass/variables/_layout.scss (breakpoint configuration)
  • sass/utils/_responsive.scss (the mixin)

@mixin hd

"Retina" mixin.

.logo {
    background: url('logo-100x50.png');

    @include hd {
        background: url('logo-200x100.png');
        background-size: 100px 50px;
    }
}
.logo {
    background: url('logo-100x50.png');
}

@media (-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) {

    .logo {
        background: url('logo-200x100.png');
        background-size: 100px 50px;
    }
}
  • sass/utils/_responsive.scss

Responsive Hilfsklassen

Basierend auf den Namen und Werten (keys & values) der Einträge in der Sass-Map $breakpoints (siehe oben) werden automatische CSS-Klassen generiert, um Elemente - abhängig vom aktuellen Breakpoint - erscheinen und verschwinden zu lassen.

Aktuell sichtbar (.block- and .inline-Klassen werden zu Demostrationszwecken standardmäßig auf display: none gesetzt):

.hide-mobile
.hide-xs
.hide-sm
.hide-md
.hide-lg
.hide-xl
.block-mobile
.block-xs
.block-sm
.block-md
.block-lg
.block-xl
.inline-mobile
.inline-xs
.inline-sm
.inline-md
.inline-lg
.inline-xl
/*
breakpoint configuation
*/
$breakpoints: (
    mobile: 0,
    xs:     400px,
    sm:     600px,
    md:     730px,
    lg:     980px,
    xl:     1200px
);

/*
Die folgenden CSS-Klassen werden anhand der obigen Konfiguration erstellt:
*/
.hide-mobile {...}      /* display:none ab 400px      */
.hide-xs {...}          /* display:none ab 400px      */
.hide-sm {...}          /* display:none ab 600px      */
.hide-md {...}          /* display:none ab 730px      */
.hide-lg {...}          /* display:none ab 980px      */
.hide-xl {...}          /* display:none ab 1200px     */
.block-mobile {...}     /* display: block ab 400px    */
.block-xs {...}         /* display: block ab 400px    */
.block-sm {...}         /* display: block ab 600px    */
.block-md {...}         /* display: block ab 730px    */
.block-lg {...}         /* display: block ab 980px    */
.block-xl {...}         /* display: block ab 1200px   */
.inline-mobile {...}    /* display: inline ab 400px   */
.inline-xs {...}        /* display: inline ab 400px   */
.inline-sm {...}        /* display: inline ab 600px   */
.inline-md {...}        /* display: inline ab 730px   */
.inline-lg {...}        /* display: inline ab 980px   */
.inline-xl {...}        /* display: inline ab 1200px  */

  • sass/variables/_layout.scss (breakpoint configuration)
  • sass/base/_standards.scss

#responsive status

Mit diesem Feature wird der Name des aktuellen Breakpoints erkennbar für Javascript gemacht. Dies erlaubt z.B. das Programmieren komplizierterer UI-Patterns, deren JavaScript-Komponente sich bei unterschiedlichen Bildschirmgrößen unterschiedlich verhalten soll.

Auch hier wird wieder die Sass-Map $breakpoints (siehe oben) als Ausgangspunkt verwendet.

Das HTML-Element <span id="responsive-status"></span> muss sich im Haupttemplate der Website befinden. Sein CSS-Attribut font-family trägt stets den Namen des aktuellen nächsten min-width breakpoints. Dieses Attribut kann via JavaScript ausgelesen werden. So können die Javaskripte auf spezifische Bildschirmbreiten reagieren. Der unten aufgelistete jQuery-Code befindet sich in der Datei js/utils/responsive.js. In dieser Datei muss die Funktion checkResponsiveStatus, genauer gesagt der switch-Ausdruck darin angepasst werden, sodass die case-Anweisungen den Namen der Breakpoints in $breakpoints entsprechen.

Ergänzend dazu in das Klassen-Attribut von <body> der Names des derzeit aktiven nächsten min-width-Breakpoint geschrieben und dabei mit dem Präfix "responsive-" versehen wird. Zum Beispiel <body class="responsive-md"> für den Breakpoint "md".

Derzeitiger Status:
<body>-classname: responsive-

(Browserfenster schmaler und breiter ziehen, um Änderungen zu sehen)

<span id="responsive-status"></span>
$breakpoints: (
    xs: 400px,
    sm: 600px,
    md: 730px,
    lg: 980px,
    xl: 1200px
);

#responsive-status {
    display: none;
    font-family: "mobile";
}
@each $breakpoint in $breakpoints {
    $name: nth($breakpoint, 1);
    $width: nth($breakpoint, 2);
    @media (min-width: $width) {
        #responsive-status {
            font-family: "#{$name}";
        }
    }
}
function checkResponsiveStatus() {
    var currBreakpoint = $('#responsive-status').css('font-family');

    if (currBreakpoint != lastBreakpoint) {

        // Set <body> classname to responsive-{name of current breakpoint}
        $('body').removeClass (function (index, css) {
            return (css.match (/(^|\s)responsive-\S+/g) || []).join(' ');
        });
        $('body').addClass("responsive-" + currBreakpoint);

        // Just for presentation (may be deleted)
        $('.example-rs').html(currBreakpoint);

        // Call functions tied to current breakpoint
        // Add your own cases if you like
        switch(currBreakpoint) {
            case "mobile":
                console.log("JavaScript-Code for mobile resolution");
                break;

            case "xs":
                console.log("JavaScript-Code for extra small (xs) resolution");
                break;

            case "sm":
                console.log("JavaScript-Code for small (sm) resolution");
                break;

            case "md":
                console.log("JavaScript-Code for medium (md) resolution");
                break;

            case "lg":
                console.log("JavaScript-Code for large (lg) resolution");
                break;

            case "xl":
                console.log("JavaScript-Code for extra large (xl) resolution");
                break;
        }
    }

    lastBreakpoint = currBreakpoint;

    return currBreakpoint;
}

var lastBreakpoint = false,
    currBreakpoint = false;

$(document).ready(function() {

    // Groessenaenderung des Browserfensters abfangen
    $( window ).bind( "resize", function(){
        currBreakpoint = checkResponsiveStatus();
    });

    // Seite initialisieren
    currBreakpoint = checkResponsiveStatus();

});
  • sass/variables/_layout.scss (breakpoint configuration)
  • sass/base/_standards.scss (SCSS-code)
  • templates/layout_main.html (HTML-code)
  • js/responsive.js (jQuery-Code)

Grid

Bei der Erstellung einer responsiven Website sollte die Sass-map $breakpoints (siehe oben) verwendet werden, um den Überblick über die verwendeten Medienabfragen zu behalten. Letztere können mit dem Mixin @mixin bp-min (siehe oben) ausgeführt werden.

Nebula verwendet das Grid-System von Bootstrap 4, um Inhaltsspalten zu generieren. Weitere Informationen dazu bietet die Bootstrap-Dokumentation.


Basics

Headings und Absätze

Heading 1 <h1>

Heading 2 <h2>

Heading 3 <h3>

Heading 4 <h4>

Heading 5 <h5>
Heading 6 <h6>

Heading 4 with class .h2 <h4 class="h2">

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum in posuere orci. Nam euismod gravida nunc. Ut accumsan vitae dolor interdum ullamcorper. Ut luctus, lacus quis finibus bibendum, tortor nisl tristique mauris, eu efficitur nisi felis sit amet lacus. Duis a euismod erat. Sed faucibus ultricies sem, varius fringilla velit ullamcorper sit amet.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum in posuere orci. Nam euismod gravida nunc. Ut accumsan vitae dolor interdum ullamcorper. Ut luctus, lacus quis finibus bibendum, tortor nisl tristique mauris, eu efficitur nisi felis sit amet lacus. Duis a euismod erat. Sed faucibus ultricies sem, varius fringilla velit ullamcorper sit amet.

<h1>Heading 1</h1>
<h2>Heading 2</h2>
<h3>Heading 3</h3>
<h4>Heading 4;</h4>
<h4 class="h2">Heading 4 with class .h2</h4>
<p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum in posuere orci. Nam euismod gravida nunc. Ut accumsan vitae dolor interdum ullamcorper. Ut luctus, lacus quis finibus bibendum, tortor nisl tristique mauris, eu efficitur nisi felis sit amet lacus. Duis a euismod erat. Sed faucibus ultricies sem, varius fringilla velit ullamcorper sit amet.
</p>
<p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum in posuere orci. Nam euismod gravida nunc. Ut accumsan vitae dolor interdum ullamcorper. Ut luctus, lacus quis finibus bibendum, tortor nisl tristique mauris, eu efficitur nisi felis sit amet lacus. Duis a euismod erat. Sed faucibus ultricies sem, varius fringilla velit ullamcorper sit amet.
</p>
  • sass/variables/_typography.scss
  • sass/objects/_h.scss
  • sass/objects/_p.scss

Einleitungstext

Um einen Absatz hervorzuheben, kann die Klasse class="lead" verwendet werden.

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus. Ut luctus, lacus quis finibus bibendum, tortor nisl tristique mauris, eu efficitur nisi felis sit amet lacus. Duis a euismod erat.

<p class="lead">
    Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus. Ut luctus, lacus quis finibus bibendum, tortor nisl tristique mauris, eu efficitur nisi felis sit amet lacus. Duis a euismod erat.
</p>
  • sass/variables/_typography.scss
  • sass/objects/_p.scss

Kleingedruckter Text

Kleingedruckter Text wird mit der Klasse class="small" ausgezeichnet.

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus. Ut luctus, lacus quis finibus bibendum, tortor nisl tristique mauris, eu efficitur nisi felis sit amet lacus. Duis a euismod erat.

<p class="small">
    Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus. Ut luctus, lacus quis finibus bibendum, tortor nisl tristique mauris, eu efficitur nisi felis sit amet lacus. Duis a euismod erat.
</p>
  • sass/variables/_typography.scss
  • sass/objects/_p.scss

Unnummerierte Liste

  • Eins
    • Eins.Eins
    • Eins.Zwei
  • Zwei
  • Drei
  • Vier
<ul>
    <li>Eins
        <ul>
            <li>Eins.Eins</li>
            <li>Eins.Zwei</li>
        </ul>
    </li>
    <li>Zwei</li>
    <li>Drei</li>
    <li>Vier</li>
</ul>
  • sass/objects/_list.scss

Nummerierte Liste

  1. Eins
    1. Eins.Eins
    2. Eins.Zwei
  2. Zwei
  3. Drei
  4. Vier
<ol>
    <li>Eins
        <ol>
            <li>Eins.Eins</li>
            <li>Eins.Zwei</li>
        </ol>
    </li>
    <li>Zwei</li>
    <li>Drei</li>
    <li>Vier</li>
</ol>
  • sass/objects/_list.scss

"Floats" & Lightboxen

Floatende Elemente - also zum Beispiel vom Text umflossene Bilder - können mit den Klassen .float-left und .float-right erstellt werden. Dabei sollte beachtet werden, dass diese "floats" erst ab einem bestimmten $breakpoint (siehe oben) aktiv sind (voreingestellt ist hier der Breakpoint "sm"). Sobald dieser Breakpoint erreicht ist und das Element links oder rechts umflossen wird, hat es eine maximale Breite von 50%.

Werden stattdessen die Klassen .pull-left und .pull-right eingesetzt, werden die floats erzwungen, auch auf kleineren Bildschirmen. Zudem gilt die Maximalbreite von 50% nicht.

Nebula verwendet Magnific Popup für Lightboxen. Um ein HTML-Dokument in einer Lightbox öffnen zu lassen, wird die Klasse .lightbox auf das Link-Element gesetzt. Für Bilder wird die Klasse .lightbox-image, für iFrames die .lightbox-iframe genutzt.

.floatleft Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc luctus dolor a nulla sollicitudin luctus. Aenean in dolor sem. Donec erat neque, pharetra ut massa ut, feugiat maximus tortor. Aliquam erat volutpat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Suspendisse potenti. Pellentesque ac lacus vel diam tempus tempus. Nulla vel placerat quam. Fusce vel egestas elit. Pellentesque maximus erat ut tortor sollicitudin tincidunt. Nunc quis est id risus posuere pretium. Praesent ut nisi non ipsum molestie tincidunt. Aliquam mollis mauris sed velit ultricies, in blandit eros ultricies. Phasellus pulvinar dolor vel lacinia mollis. Donec tempor justo ac tellus molestie, pellentesque rutrum augue porta. Integer efficitur mi eu porta imperdiet. Nullam tincidunt urna id pellentesque tempus.

.floatright Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc luctus dolor a nulla sollicitudin luctus. Aenean in dolor sem. Donec erat neque, pharetra ut massa ut, feugiat maximus tortor. Aliquam erat volutpat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Suspendisse potenti. Pellentesque ac lacus vel diam tempus tempus. Nulla vel placerat quam. Fusce vel egestas elit. Pellentesque maximus erat ut tortor sollicitudin tincidunt. Nunc quis est id risus posuere pretium. Praesent ut nisi non ipsum molestie tincidunt. Aliquam mollis mauris sed velit ultricies, in blandit eros ultricies. Phasellus pulvinar dolor vel lacinia mollis. Donec tempor justo ac tellus molestie, pellentesque rutrum augue porta. Integer efficitur mi eu porta imperdiet. Nullam tincidunt urna id pellentesque tempus.

.floatleft Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc luctus dolor a nulla sollicitudin luctus. Aenean in dolor sem. Donec erat neque, pharetra ut massa ut, feugiat maximus tortor. Aliquam erat volutpat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Interdum et malesuada fames ac ante ipsum primis in faucibus. Suspendisse potenti. Pellentesque ac lacus vel diam tempus tempus. Nulla vel placerat quam. Fusce vel egestas elit. Pellentesque maximus erat ut tortor sollicitudin tincidunt. Nunc quis est id risus posuere pretium. Praesent ut nisi non ipsum molestie tincidunt. Aliquam mollis mauris sed velit ultricies, in blandit eros ultricies. Phasellus pulvinar dolor vel lacinia mollis. Donec tempor justo ac tellus molestie, pellentesque rutrum augue porta. Integer efficitur mi eu porta imperdiet. Nullam tincidunt urna id pellentesque tempus.

Open YouTube video
Open Vimeo video
Open Google Map

<p>
    <img class="float-left" src="img/picture.png" alt=".floatleft">
    Lorem ipsum dolor sit amet...
</p>
<p>
    <img class="float-right" src="img/picture.png" alt=".floatright">
    Aliquam mollis mauris sed ...
</p>
  • sass/base/_layout.scss
  • sass/components/_lightbox.scss

Responsive video embeds

Um Videos in responsive Websites einzubetten und dabei zu gewährleisten, dass sie bei Größenänderungen ihr Seitenverhältnis beibehalten, kann das Element .embed-container als Wrapper um das video/iframe-Element verwendet werden. Das Seitenverhältnis bleibt so stets bei 16:9.

Falls ein anderes Seitenverhältnis benötigt wird, kann das Sass-Mixin @mixin nb-embed-container($width, $height) zur Hilfe genommen werden. Zum Beispiel würde @include nb-embed-container(4, 3); ein klassisches Seitenverhältnis von 4:3 erzeugen.

<div class="embed-container">
    <iframe src="https://player.vimeo.com/video/59361603" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
</div>
  • sass/objects/_embed-container.scss
  • sass/mixins/_embed-container.scss (dependency)
  • sass/utils/_sizing.scss (dependency)

Icons

SVG-Dateien werden "inline" verwendet, um Icons darzustellen. Sie werden automatisch in einem sprite zusammengefasst, um Ladezeit zu sparen.

Hier wird die Verwendung von SVG in HTML näher erläutert:
SVG Sprite Workflow That Works (Ryan Yu @ Medium)
Tips for avoiding common SVG pitfalls (Sara Soueidan)

Icons hinzufügen oder entfernen

Um Icons hinzuzufügen, sollte zunächst sichergestellt werden, dass der gulp-task läuft.

Die SVG-Dateien müssen in das Verzeichnis skins/website/en/accessories/svg abgelegt werden. Der gulp-task aktualisiert dann automatisch die sprite-Datei im Ordner skins/website/en/accessories/svgsprite.

Um ein Icon zu entfernen, reicht es, die entsprechende SVG-Datei im Verzeichnis skins/website/en/accessories/svg zu entfernen. Das Sprite wird automatisch aktualisiert, wenn der Gulp-task läuft.

Icons anzeigen

Um inline-SVG auf der Website darzustellen, gibt es zwei Methodem:

1. SVG-Tag

Die gewöhnliche Methode ist einen SVG-Tag in das HTML-Dokument zu setzen. Der Tag sollte die CSS-Klasse icon besitzen.

<svg class="icon">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#{Name des Icons}"></use>
</svg>

{Name des Icons} bezieht sich auf den Namen der SVG-Datei (ohne Dateiendung), die sich im Icon-Ordner befindet. Die CSS-Klasse icon setzt Basis-Styles, die Standardgröße von 1em und sorgt dafür, dass die Farbe des Icons der Textfarbe entspricht.

Beispielsweise soll hier das Icon globe.svg ausgegeben werden:

<svg class="icon">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#globe"></use>
</svg>
  • sass/objects/_icon.scss

2. Javascript-Methode via Platzhalter-Element

Anstatt den SVG-Tag in das HTML-Dokument zu setzen, kann auch ein Element mit der Klasse js-icon verwendet werden, um ein Icon auszugeben. Diese Methode hat eine wesentlich einfachere Syntax, setzt allerdings aktiviertes JavaScript voraus. Außerdem wird das Icon verzögert dargestellt, nachdem die komplette Webpage geladen wurde.

<i class="js-icon" data-icon="globe"></i>

Die Syntax ist wie folgt:

<i class="js-icon"
   data-icon="{Name des Icons}"
   data-icon-class="{Weitere CSS-Klasse(n)}"
   data-icon-title="{Titel}"
   data-icon-ariahidden="{false/true}"
   data-icon-append="{false/true}"></i>

data-icon-class, data-icon-title, data-icon-ariahidden and data-icon-append sind optionale Attribute:

{Weitere CSS-Klasse(n)} in data-icon-class meint einen String aus einer oder mehrerer (auch ein Leerzeichen getrennter) CSS-Klassen. Diese Klassen werden zusammen mit der Standardklasse icon in den generierten SVG-Tag geschrieben.

{Titel} in data-icon-title ist ein title-Attribut.

{false/true} in data-icon-ariahidden legt fest ob das Element vor Screenreadern verborgen werden soll. Standardmäßig wird 'false' angewendet, das Icon also von einem Screenreader ausgewertet. Für rein dekorative Elemente sollte man also data-icon-ariahidden="true" setzen.

{false/true} im data-icon-append-Attribut legt fest, ob der HTML-Code für das Icon das Element mit der Klasse .js-icon ersetzen oder hinein geschrieben werden soll. "false" (der Standardwert) bedeutet, das Element wird ersetzt, "true" bedeutet, das Icon wird in das Element gesetzt (vor den abschließenden Tag).

<p><i class="js-icon" data-icon="shopping-bag" data-icon-class="icon--lg" data-icon-title="Your shopping bag"></i></p>
<p class="js-icon" data-icon="shopping-bag" data-icon-append="true" data-icon-ariahidden="true"></p>
  • sass/objects/_icon.scss
  • javascript/components/icon.js

Icongrößen

sass/objects/_icon.scss enthält einige vordefinierte Klassen für Größenvarianten. Die Klassen icon--xs, icon--sm, icon--lg, icon--xl, icon--2x, icon--3x, icon--4x und icon--5x müssen jeweils zusammen mit der Klasse icon verwendet werden.

Klasse Größe
icon--xs 0.75em
icon--sm 0.875em
(keine weitere Klasse) 1em
icon--lg 1.33em
icon--xl 1.5em
icon--2x 2em
icon--3x 3em
icon--4x 4em
icon--5x 5em
<svg class="icon icon--xs">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#globe"></use>
</svg>

<svg class="icon icon--sm">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#globe"></use>
</svg>

<svg class="icon">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#globe"></use>
</svg>

<svg class="icon icon--lg">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#globe"></use>
</svg>

<svg class="icon icon--xl">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#globe"></use>
</svg>

<svg class="icon icon--2x">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#globe"></use>
</svg>

<svg class="icon icon--3x">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#globe"></use>
</svg>

<svg class="icon icon--4x">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#globe"></use>
</svg>

<svg class="icon icon--5x">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#globe"></use>
</svg>
  • sass/objects/_icon.scss

Iconfarben

Vorausgesetzt das Icon hat die Klasse .icon, kann es beliebig eingefärt werden, indem man das CSS-Attribut color verwendet. Man kann die Farbe direkt auf das icon anwenden, ansonsten erbt es die Textfarbe seines Elternelements.

<p>
    <i class="js-icon" data-icon="warning" data-icon-class="icon--2x icon--warning"></i>
</p>
<p>
    <i class="js-icon" data-icon="success" data-icon-class="icon--2x icon--success"></i>
</p>
.icon--warning {
    color: color('warning');
}

.icon--success {
    color: color('success');
}

Icon-Transformationen

Es stehen einige weitere Klassen zur Verfügung, um die Darstellung der Icons anzupassen.

Class Transformation
no transformation
icon--rotate-90 rotate 90° clockwise
icon--rotate-180 rotate 180° clockwise
icon--rotate-270 rotate 270° clockwise
icon--flip-h flip horizontal
icon--flip-v flip vertical
icon--spin spinning animation
<svg class="icon">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#shopping-cart"></use>
</svg>

<svg class="icon icon--rotate-90">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#shopping-cart"></use>
</svg>

<svg class="icon icon--rotate-180">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#shopping-cart"></use>
</svg>

<svg class="icon icon--rotate-270">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#shopping-cart"></use>
</svg>

<svg class="icon icon--flip-h">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#shopping-cart"></use>
</svg>

<svg class="icon icon-flip-v">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#shopping-cart"></use>
</svg>

<svg class="icon icon--spin">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#shopping-cart"></use>
</svg>

<svg class="icon icon--4x">
    <use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#refresh"></use>
</svg>
  • sass/objects/_icon.scss

Carousel

Single image carousel

This carousel is powered by slick (http://kenwheeler.github.io/slick/). Please refer to its documentation for more info.

<div class="carousel carousel--single">
    <ul class="slick" data-slick='{"autoplay": true, "autoplaySpeed": 8000, "speed": 1000}'>

        <li class="carousel__item">
            <img src="temp/explorer/files/root/placeholder/headers/header01.jpg">
            <div class="carousel__caption">Beach</div>
        </li>

        [...]

    </ul>
</div>
// http://kenwheeler.github.io/slick/

$(function() {
    $('.carousel--single .slick').slick();
});
  • Mandatory:
    • dependencies/slick-carousel/**/*
  • Optional (but needed for this demo):
    • sass/mixins/_carousel.scss
    • javascript/components/carousel.js

Multi image carousel


Forms

Best practice forms

Based on Form Kitchen Sink

This example meets the following requirements:

  • Container independent, flexible widths in percent
  • Responsive, linearizable, mobile-ready
  • Browser support: All modern desktop browsers, major mobile browsers
  • 2 variants: labels left and labels above
  • Doesn't break with multi-line labels
  • Backend/templating friendly
    • Suitable for using label/input/error includes/snippets
    • Slim and flexible markup

Update 09/01/2023: Rewrote styles for modern browsers. Abandoned IE-support.

Update 05/07/2016: Included styles from formalize CSS to achieve consistent styling of form elements across all major browsers.

Form kitchen sink

Labels left: Suitable for most forms
Labels above: Better for short or narrow forms

Switch label position
Salutation
Link button
Your rating
<form>
    <fieldset class="wideform">
        <div class="formrow">
            <label class="label req" for="firstname">First/last name</label>
            <div class="formitem col-1of2">
                <label class="label req" for="firstname">First name</label>
                <input class="formfield" type="text" name="firstname" id="firstname" placeholder="Placeholder" required="required" x-autocompletetype="given-name"/>
            </div>
            <div class="formitem col-1of2">
                <label class="label req" for="firstname">Last name</label>
                <input class="formfield" type="text" name="lastname" id="lastname" placeholder="... with polyfill" required="required" x-autocompletetype="family-name"/>
            </div>
        </div>
        <div class="formrow">
            <div class="formitem col-1of3">
                <label class="label" for="zip">Zip</label>
                <input class="formfield" type="text" name="zip" id="zip" pattern="[0-9]" x-autocompletetype="postal-code"/>
            </div>
            <div class="formitem col-2of3">
                <label class="label" for="zip">City</label>
                <input class="formfield" type="text" name="city" id="city" x-autocompletetype="city"/>
            </div>
        </div>
    </fieldset>
</form>
  • sass/objects/_form-field.scss
  • sass/objects/_form-error.scss
  • sass/objects/_form-placeholder.scss
  • sass/objects/_form-item.scss
  • sass/objects/_form-row.scss
  • sass/objects/_form-ticks.scss
  • sass/objects/_fieldset.scss
  • sass/objects/_form.scss
  • (sass/objects/_form-rating.scss)
  • js/components/form.js

Easygrid

Very basic, selfmade grid. Classes are mandatory for "form kitchen sink" (see above).

.col-1of4
.col-1of4
.col-1of4
.col-1of4
.col-1of1
.col-1of2
.col-1of2
.col-1of3
.col-2of3
.col-1of4
.col-3of4
.col-2of5
.col-3of5
.col-1of5
.col-4of5
<div class="grid">
    <div class="col-1of5">
        ...
    </div>
    <div class="col-4of5">
        ...
    </div>
</div>
  • sass/objects/_form.scss

Form field sizes

Set heights by using classes .formfield--sm oder .formfield--lg.

<form action="">
    <fieldset>
        <div class="formrow">
            <div class="formitem col-1of3">
                <label class="label" for="formfieldsizes-example-1">Regular text-input</label>
                <input type="text" class="formfield" id="formfieldsizes-example-1">
            </div>
            <div class="formitem col-1of3">
                <label class="label" for="formfieldsizes-example-2">Regular selectbox</label>
                <select name="" id="formfieldsizes-example-2">
                    <option selected="selected">please choose</option>
                    <option>U.S.A.</option>
                    <option>France</option>
                    <option>Italy</option>
                    <option>Spain</option>
                    <option>Germany</option>
                </select>
            </div>
            <div class="formitem col-1of3">
                <button type="button" class="btn">Save</button>
            </div>
        </div>

        <div class="formrow">
            <div class="formitem col-1of3">
                <label class="label" for="formfieldsizes-example-1">Small text-input</label>
                <input type="text" class="formfield formfield--sm" id="formfieldsizes-example-1">
            </div>
            <div class="formitem col-1of3">
                <label class="label" for="formfieldsizes-example-2">Small selectbox</label>
                <select name="" id="formfieldsizes-example-2" class="formfield--sm">
                    <option selected="selected">please choose</option>
                    <option>U.S.A.</option>
                    <option>France</option>
                    <option>Italy</option>
                    <option>Spain</option>
                    <option>Germany</option>
                </select>
            </div>
            <div class="formitem col-1of3">
                <button type="button" class="btn btn--sm">Save</button>
            </div>
        </div>

        <div class="formrow">
            <div class="formitem col-1of3">
                <label class="label" for="formfieldsizes-example-1">Large text-input</label>
                <input type="text" class="formfield formfield--lg" id="formfieldsizes-example-1">
            </div>
            <div class="formitem col-1of3">
                <label class="label" for="formfieldsizes-example-2">large selectbox</label>
                <select name="" id="formfieldsizes-example-2" class="formfield--lg">
                    <option selected="selected">please choose</option>
                    <option>U.S.A.</option>
                    <option>France</option>
                    <option>Italy</option>
                    <option>Spain</option>
                    <option>Germany</option>
                </select>
            </div>
            <div class="formitem col-1of3">
                <button type="button" class="btn btn--lg">Save</button>
            </div>
        </div>
    </fieldset>
</form>

Checkbox Tree

Inline radiobuttons and checkboxes

Add class .ticks--inline to the .ticks-Element to group checkboxes and radiobuttons on the same horizontal row.

<form action="#" method="get">
    <div class="formrow">
        <div class="formitem">
            <div class="ticks ticks--inline">
                <label>
                    <input type="radio" name="salutation" id="salutation-mrs" value="mrs">
                    <span>Mrs.</span>
                </label>

                [...]

            </div>
        </div>
    </div>
    <div class="formrow">
        <div class="formitem">
            <div class="ticks ticks--inline">
                <label>
                    <input type="checkbox" name="newsletter" id="custom-newsletter">
                    <span>Subscribe to newsletter</span>
                </label>
            </div>
        </div>
    </div>
</form>
  • sass/objects/_form-ticks.scss

Floating labels

Add class .floatlabel to the .formitem-Element to have its label floated. Doesn't work within forms or fieldsets with class .wideform.

<form action="#" method="get" id="form6">
    <div class="formrow">
        <div class="formitem col-1of2 floatlabel">
            <label class="label req" for="firstname2">First name</label>
            <input class="formfield" type="text" name="firstname" id="firstname2" required="required" x-autocompletetype="given-name"/>
        </div>
        <div class="formitem col-1of2 floatlabel">
            <label class="label req" for="lastname2">Last name</label>
            <input class="formfield" type="text" name="lastname" id="lastname2" required="required" x-autocompletetype="family-name"/>
        </div>
    </div>
</form>
  • sass/objects/_form-floatlabel.scss
  • js/components/form-floatlabels.js

Password helper

Wrap your <input type="password"> into a div with class .password-helper to create a button that can switch the type of the password-field to "text" and back to "password" when clicked.

This not only helps clueless people to master the password field but makes it just a little bit more convenient for everyone.

<form action="#" method="get" id="form3">
    <div class="formrow">
        <div class="formitem col-1of2">
            <label class="label req" for="password1">Password</label>
            <div class="password-helper">
                <input class="formfield" type="password" name="password" id="password1" required="required" />
            </div>
        </div>
        <div class="formitem col-1of2">
            <label class="label req" for="password2">Password again</label>
            <div class="password-helper">
                <input class="formfield" type="password" name="password2" id="password2" required="required" />
            </div>
        </div>
    </div>
</form>
  • sass/objects/_form-password-helper.scss
  • js/components/form-password-helper.js

Form notice

You can use two kinds of notices to aid the user filling out your forms.

The first helps setting a password in two password text inputs, the latter being a confirmation field that has to be filled out exactly like the first. Add class .form-notice-password to the first field and .form-notice-password-again to the second. Both fields have to be followed by two corresponding message-elements, possessing the classes .form-notice .form-notice--incomplete and .form-notice .form-notice--success. See the HTML-Tab for details.

The second king of notice displays while the corresponding field is focused and will be hidden as soon as the focus is lost. Use class .form-notice-focused on the input field, followed by the message-element having class .form-notice.

Wrap your <fieldset> in <div class="form-notices"> to make space for the notices.

Your password must contain six or more characters
Thank you!
Please repeat your password in this field
Thank you!
This notice is shown as long as the field is focused
<div class="form-notices">

    <fieldset>
        <form action="#" method="get" id="form4">
            <div class="formrow">
                <div class="formitem">
                    <label class="label req" for="password12">Password</label>
                    <input class="formfield form-notice-password" type="password" name="password" id="password12" required="required" />
                    <div class="form-notice form-notice--incomplete">Your password must contain six or more characters</div>
                    <div class="form-notice form-notice--success">✔</div>

                </div>
            </div>
            <div class="formrow">
                <div class="formitem">
                    <label class="label req" for="password22">Password again</label>
                    <input class="formfield form-notice-password-again" type="password" name="password2" id="password22" required="required" />
                    <div class="form-notice form-notice--incomplete">Please repeat your password in this field</div>
                    <div class="form-notice form-notice--success">✔</div>
                </div>
            </div>
        </form>
    </fieldset>

    <fieldset>
        <div class="formrow">
            <div class="formitem">
                <label class="label" for="notice-salutation">Please focus this field</label>
                <input class="formfield form-notice-focused">
                <div class="form-notice">This notice is shown as long as the field is focused</div>
            </div>
        </div>
    </fieldset>

</div>
  • sass/objects/_form-password-helper.scss
  • js/components/form-password-helper.js

Form field groups

Taken from Bootstrap.

Spice up your forms by adding text or buttons before, after or on both sides of any text-based <input> field. Use .formgroup with .formgroup__addon or .formgroup__btn to prepend or append elements to a single textual <input>.

Type your E-Mail-Address here:
@gmail.com
<form action="#" method="get" id="form5">
    <div class="formrow">
        <div class="formitem">
            <label class="label" for="email3">Basic formgroup-addons</label>
            <div class="formgroup">
                <div class="formgroup__addon">Type your E-Mail-Address here:</div>
                <input class="formfield" type="email" name="email3" id="email3" />
                <div class="formgroup__addon">@gmail.com</div>
            </div>
        </div>
    </div>
    <div class="formrow">
        <div class="formitem col-1of2">
            <label class="label" for="addoncheck">With checkbox</label>
            <div class="formgroup">
                <div class="formgroup__addon">
                    <input type="checkbox" />
                </div>
                <input class="formfield" type="text" name="addoncheck" id="addoncheck" />
            </div>
        </div>
        <div class="formitem col-1of2">
            <label class="label" for="addonradio">With radio button</label>
            <div class="formgroup">
                <div class="formgroup__addon">
                    <input type="radio" />
                </div>
                <input class="formfield" type="text" name="addonradio" id="addonradio" />
            </div>
        </div>
    </div>
    <div class="formrow">
        <div class="formitem col-1of2">
            <label class="label" for="addonbtn">Button</label>
            <div class="formgroup">
                <input class="formfield" type="text" name="addonbtn" id="addonbtn" placeholder="Suchbegriff" />
                <div class="formgroup__btn">
                    <button class="btn">Los!</button>
                </div>
            </div>
        </div>
        <div class="formitem col-1of2">
            <label class="label" for="addonbtngrp">Button group</label>
            <div class="formgroup">
                <div class="formgroup__btn">
                    <button class="btn">A</button>
                    <button class="btn">B</button>
                    <button class="btn">C</button>
                </div>
                <input class="formfield" type="text" name="addonbtngrp" id="addonbtngrp" />
            </div>
        </div>
    </div>
</form>
  • sass/objects/_form-group.scss

Buttons

Basic button

Create a button by using the class .btn.

<button class="btn">I am a button</button>
  • sass/objects/_button.scss

Color variants

Use .btn--primary, .btn--action, .btn--decline or .btn--accept to give your button its purpose.

<button class="btn">Normal button</button>
<button class="btn btn--primary">Primary button</button>
<button class="btn btn--action">Action button</button>
<button class="btn btn--decline">Decline button</button>
<button class="btn btn--accept">Accept button</button>
<button class="btn btn--link">Link button</button>
  • sass/objects/_button.scss

Size variants

You may alter its size with .btn--sm or .btn--lg. .btn--square can be used to create a square-shaped button.

<button class="btn btn--sm">Small button</button>
<button class="btn btn--lg">Large button</button>
<button class="btn btn--square"><svg class="icon icon--lg"><use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#search"></use></svg></button>
  • sass/objects/_button.scss

Disabled buttons

Add class .disabled or add the disabled attribute to <button> buttons to make it look unclickable.

<button class="btn">Disabled button</button>
<button class="btn btn--primary" disabled>Disabled button</button>
<button class="btn btn--action" disabled>Disabled button</button>
<button class="btn btn--decline" disabled>Disabled button</button>
<button class="btn btn--accept" disabled>Disabled button</button>
  • sass/objects/_button.scss

Buttons with SVG icons and text

Wrap your text in a <span class="btn__text"> element to apply proper spacing.

<button class="btn">
    <span class="btn__text">Add to cart</span>
    <svg class="icon"><use xlink:href="skins/website/en/accessories/svgsprite/sprite.svg#shopping-cart"></use></svg>
</button>
  • sass/objects/_button.scss

Full button

A .btn--full spans the available horizontal space.

<button class="btn btn--full">Full button</button>
  • sass/objects/_button.scss

Button group

Setup a button group by wrapping your buttons with .btn-group.

<div class="btn-group">
    <button class="btn">Grouped</button>
    <button class="btn">buttons</button>
    ...
</div>
  • sass/objects/_button-group.scss

Combinations

You may combine every colour with every size and every shape.

<div class="btn-group">
    <button class="btn btn--decline btn--prev">Abort</button>
    <button class="btn btn--accept btn--next">Okay</button>
</div>
<button class="btn btn--lg btn--primary btn--full">Big, primary and full button</button>
  • sass/objects/_button.scss

New colors and sizes

All information for button-sizes and -colors is stored in two Sass maps called $button-color-map (which contains all color-variants) and $button-size-map (which contains all size-variants) in sass/objects/_button.scss. Edit these maps accordingly to change existing or add new CSS classes for button colors and sizes.

// SCSS:
$button-color-map: (
    [...]
    'btn--dark': (
        'color':                #ccc,
        'border-color':         #000,
        'bg-color':             #333,
        'hover-color':          #ccc,
        'hover-border-color':   #000,
        'hover-bg-color':       #222,
        'active-color':         #ccc,
        'active-border-color':  #000,
        'active-bg-color':      #111,
        'font-family':          'button'
    )
);
<!-- HTML: -->
<button class="btn btn--dark">Dark button</button>
// SCSS:
$button-size-map: (
    [...]
    'btn--giant': (
        'font-size':            60px,
        'padding-top':          40px,
        'padding-right':        80px,
        'padding-bottom':       40px,
        'padding-left':         80px,
        'height':               auto,
        'next-border-radius':   70px
    )
);
<!-- HTML: -->
<button class="btn btn--giant">Giant button</button>

@mixin create-button A mixin to assign button styles to an element

With this mixin you will be able to assign button styles, predefined via $button-color-map and $button-size-map to an element. This will be handy - for example - when creating a responsive site where an element has to look like a button only at a specific breakpoint.

<a class="you-will-be-a-button" href="...">See? I am a button.</a>.you-will-be-a-button {
    @include create-button('btn--primary', 'btn--lg');
}
  • sass/atoms/_button.scss

Loading button

Add class .btn--loading to display a loading animation when clicked. Or also add class .is-loading to activate the animation manually.

<button class="btn btn--loading">Click me</button>
  • sass/objects/_button.scss

Tabs

Tabs (Reiternavigationen) können erstellt werden, indem ein Wrapper-Element <div class="js-tabs"> gesetzt wird. Mit der zusätzlichen Klasse .tabs auf diesem Element werden entsprechende CSS-Styles angewendet.

In diesem Wrapper befinden sich zum einen die Tab-Links in einer Liste ul.tabs__list, gefolgt von einem weiteren Wrapper-Element mit der Klasse .tabs__content-wrapper. In Letzterem befinden sich die entsprechenden "Registerkarten", welche allesamt die Klasse .tabs__content haben sowie ein ID-Attribut, das dem href-Attribut des jeweils zugehörigen Tab-Links entspricht.

Die Tab-Navigation ist barrierefrei und kann mit der Tastatur bedient werden. Die entsprechenden WAI-ARIA-Attribute werden durch das Skript ergänzt.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam malesuada fermentum mi. Integer ut massa dignissim, fermentum odio a, scelerisque sem. Cras ut mi sed mi iaculis tempor ac ut est. Nulla iaculis eu lectus in luctus. Ut pretium felis sit amet quam rutrum malesuada. Phasellus gravida quam nunc, nec faucibus turpis feugiat et. Sed nec sem a nunc pellentesque volutpat. Duis pharetra varius blandit. Nulla posuere lorem dui, vel suscipit mauris tincidunt eget. Proin sed finibus justo. Integer vel aliquet nulla, a fermentum ex.

Vivamus sed aliquet nisl, sit amet mollis leo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam tempor orci id lectus condimentum feugiat. In eleifend urna elit, et semper odio dapibus eu. Fusce imperdiet faucibus lectus. Donec lobortis tempus arcu, in lacinia purus. Curabitur placerat elementum porta.

Phasellus rhoncus ipsum in nulla mattis hendrerit. Vestibulum magna nunc, luctus at luctus a, sodales eget ligula. Vivamus eget massa ac dolor vehicula gravida eu ac quam. Ut eu ante bibendum, facilisis lectus eu, imperdiet felis. In nec nibh et nunc tincidunt malesuada. Duis a porta ligula, sit amet scelerisque purus. Etiam scelerisque sed lectus nec dictum. Duis at justo nunc. Ut justo est, eleifend eu libero vitae, gravida congue lacus. Cras nec neque id nisl dapibus tincidunt. Etiam id vehicula nisi, ut rutrum mauris. In sollicitudin non ex sit amet facilisis. Cras mauris arcu, sagittis vel bibendum eu, ornare sit amet felis. Phasellus accumsan enim ligula, vitae suscipit mi blandit sed. Ut lobortis risus non aliquet venenatis. Etiam eros mauris, eleifend non leo nec, dictum mollis magna.

<div class="tabs js-tabs">
    <ul class="tabs__list">
        <li><a href="#tab1">Tab 1</a></li>
        <li><a href="#tab2">Tab 2</a></li>
        <li><a href="#tab3">Tab 3</a></li>
    </ul>
    <div class="tabs__content-wrapper">
        <div id="tab1" class="tabs__content">...</div>
        <div id="tab2" class="tabs__content">...</div>
        <div id="tab3" class="tabs__content">...</div>
    </div>
</div>
  • sass/components/_tabs.scss
  • js/components/tabs.js

Accordion

Ein Accordion wird durch ein Wrapper-Element mit der Klasse .js-accordion definiert. Darin sollte sich mindestens eine Kombination aus .accordion__toggle und .accordion__content befinden, die zusammen ein Accordion-Element (Toggle + Inhalt) bilden. Mit der Klasse .accordion auf dem Wrapper-Element wird das entsprechende Styling angewendet.

Bitte beachte folgende Punkte:

  • Das .accordion__content-Element muss entweder direkt auf .accordion__toggle folgen oder dessen direktem Elternelement (wie im Beispielcode zu sehen).
  • Im Sinne der Barrierefreiheit sollte für den .accordion__toggle stets das <button>-Element verwendet werden.
  • Alle weiteren für die Barrierefreiheit nötigen roles und aria-Attribute werden durch das Skript ergänzt.

Anfänglich geschlossene Accordion-Elemente

Phasellus finibus maximus libero, eget tincidunt nisl dapibus vitae. Vestibulum sem purus, sollicitudin ut consectetur eget, dignissim eget mi. Curabitur scelerisque dui non tellus auctor, sed euismod sapien molestie. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam nec ornare sapien. Etiam eu dolor aliquam, sollicitudin nibh quis, tempor nisl. Quisque eget turpis suscipit, imperdiet nisi eget, elementum lorem. Aliquam ultrices, metus in egestas elementum, purus sapien elementum tortor, vitae tempus nulla quam in purus.

Phasellus sit amet accumsan massa. Aliquam erat volutpat. Ut iaculis posuere mattis. Sed porttitor pellentesque sapien, eu bibendum arcu sagittis nec. Donec auctor justo ut rhoncus suscipit. Ut laoreet finibus felis non molestie. Donec dapibus orci in erat interdum auctor. Maecenas vulputate nisl nec blandit accumsan. Praesent vitae ultrices tellus. Nullam ultricies neque et urna placerat rhoncus.

<div class="accordion js-accordion">
    <h4>
        <button class="accordion__toggle">...</button>
    </h4>
    <div class="accordion__content">
        ...
    </div>
    ...
</div>
  • js/utils/id.js (dependency)
  • js/components/accordion.js (script)
  • sass/components/_accordion.scss (styles)

Anfänglich geöffnete Accordion-Elemente

Damit ein Accordion-Element nach dem Laden der Seite geöffnet dargestellt wird, muss auf das entsprechende Toggle (.accordion__toggle) das Attribut aria-expanded="true" gesetzt werden.

Phasellus finibus maximus libero, eget tincidunt nisl dapibus vitae. Vestibulum sem purus, sollicitudin ut consectetur eget, dignissim eget mi. Curabitur scelerisque dui non tellus auctor, sed euismod sapien molestie. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam nec ornare sapien. Etiam eu dolor aliquam, sollicitudin nibh quis, tempor nisl. Quisque eget turpis suscipit, imperdiet nisi eget, elementum lorem. Aliquam ultrices, metus in egestas elementum, purus sapien elementum tortor, vitae tempus nulla quam in purus.

Phasellus sit amet accumsan massa. Aliquam erat volutpat. Ut iaculis posuere mattis. Sed porttitor pellentesque sapien, eu bibendum arcu sagittis nec. Donec auctor justo ut rhoncus suscipit. Ut laoreet finibus felis non molestie. Donec dapibus orci in erat interdum auctor. Maecenas vulputate nisl nec blandit accumsan. Praesent vitae ultrices tellus. Nullam ultricies neque et urna placerat rhoncus.

<div class="accordion js-accordion">
    <h4>
        <button class="accordion__toggle" aria-expanded="true">...</button>
    </h4>

    <div class="accordion__content">
        ...
    </div>
    ...
</div>
  • js/utils/id.js (dependency)
  • js/components/accordion.js (script)
  • sass/components/_accordion.scss (styles)

Accordion mit geöffnetem ersten Accordion-Element

Wenn man auf den Accordion-Wrapper (.js-accordion) die Klasse .js-accordion--openfirst oder das Attribut data-accordion="openfirst" setzt, wird das erste Accordion-Element initial geöffnet.

Phasellus finibus maximus libero, eget tincidunt nisl dapibus vitae. Vestibulum sem purus, sollicitudin ut consectetur eget, dignissim eget mi. Curabitur scelerisque dui non tellus auctor, sed euismod sapien molestie. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam nec ornare sapien. Etiam eu dolor aliquam, sollicitudin nibh quis, tempor nisl. Quisque eget turpis suscipit, imperdiet nisi eget, elementum lorem. Aliquam ultrices, metus in egestas elementum, purus sapien elementum tortor, vitae tempus nulla quam in purus.

Phasellus sit amet accumsan massa. Aliquam erat volutpat. Ut iaculis posuere mattis. Sed porttitor pellentesque sapien, eu bibendum arcu sagittis nec. Donec auctor justo ut rhoncus suscipit. Ut laoreet finibus felis non molestie. Donec dapibus orci in erat interdum auctor. Maecenas vulputate nisl nec blandit accumsan. Praesent vitae ultrices tellus. Nullam ultricies neque et urna placerat rhoncus.

<div class="accordion js-accordion" data-accordion="openfirst">
    <h4>
        <button class="accordion__toggle">...</button>
    </h4>
    <div class="accordion__content">
        ...
    </div>
    ...
</div>
  • js/utils/id.js (dependency)
  • js/components/accordion.js (script)
  • sass/components/_accordion.scss (styles)

"Autoclose"-feature

Um zu erreichen, dass immer nur maximal ein Accordion-Element geöffnet dargestellt wird und sich beim Öffnen eines neuen Elements das Alte automatisch schließt, muss auf den Accordion-Wrapper (.js-accordion) entweder die Klasse .js-accordion--autoclose oder das Attribut data-accordion="autoclose" gesetzt werden.

Lorem ipsum dolor sit amet, consectetur adipiscing elit

Phasellus finibus maximus libero, eget tincidunt nisl dapibus vitae. Vestibulum sem purus, sollicitudin ut consectetur eget, dignissim eget mi. Curabitur scelerisque dui non tellus auctor, sed euismod sapien molestie. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Etiam nec ornare sapien. Etiam eu dolor aliquam, sollicitudin nibh quis, tempor nisl. Quisque eget turpis suscipit, imperdiet nisi eget, elementum lorem. Aliquam ultrices, metus in egestas elementum, purus sapien elementum tortor, vitae tempus nulla quam in purus.

Phasellus sit amet accumsan massa. Aliquam erat volutpat. Ut iaculis posuere mattis. Sed porttitor pellentesque sapien, eu bibendum arcu sagittis nec. Donec auctor justo ut rhoncus suscipit. Ut laoreet finibus felis non molestie. Donec dapibus orci in erat interdum auctor. Maecenas vulputate nisl nec blandit accumsan. Praesent vitae ultrices tellus. Nullam ultricies neque et urna placerat rhoncus.

Proin urna risus, rutrum vitae sem condimentum, elementum gravida nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus elementum euismod sodales. Sed sodales aliquam velit sed cursus. Praesent venenatis faucibus turpis vitae eleifend. Pellentesque lacinia in lectus id pulvinar. Vestibulum euismod nulla quis nulla semper, at pellentesque augue congue. Vestibulum sed sodales odio. Vivamus vitae feugiat nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam eu est vitae nulla aliquam varius. Mauris lectus dui, fermentum sit amet mi sed, volutpat commodo nisi. Vivamus aliquam semper nibh, faucibus tempus lectus egestas in.

<div class="accordion js-accordion" data-accordion="autoclose">
    <h4>
        <button class="accordion__toggle">...</button>
    </h4>
    <div class="accordion__content">
        ...
    </div>
    <h4>
        <button class="accordion__toggle">...</button>
    </h4>
    <div class="accordion__content">
        ...
    </div>
    ...
</div>
  • js/utils/id.js (dependency)
  • js/components/accordion.js (script)
  • sass/components/_accordion.scss (styles)

Tables

Based on Bootstrap.

Default table styles

These styles only work on a <table> that either has class .table--default or no class at all.

Lorem ipsum dolor sit amet consectetur adipiscing elit
1st Vestibulum in posuere orci Nam euismod
2nd Vestibulum in posuere orci Nam euismod
3rd Vestibulum in posuere orci Nam euismod
tfoot tfoot tfoot tfoot
<table>
    ...
</table>
  • sass/objects/_table.scss

Basic table

Create a <table>. Use class .table to apply some nice styles.

Lorem ipsum dolor sit amet consectetur adipiscing elit
1st Vestibulum in posuere orci Nam euismod
2nd Vestibulum in posuere orci Nam euismod
3rd Vestibulum in posuere orci Nam euismod
tfoot tfoot tfoot tfoot
<table class="table">
    ...
</table>
  • sass/objects/_table.scss

Table variations

Apply some more borders by adding the class .table--bordered. Add zebra-striping to any row within tbody with the class .table--striped. Or enable a hover state on table rows with with .table--hover.

Lorem ipsum dolor sit amet consectetur adipiscing elit
1st Vestibulum in posuere orci Nam euismod
2nd Vestibulum in posuere orci Nam euismod
3rd Vestibulum in posuere orci Nam euismod
tfoot tfoot tfoot tfoot
<table class="table table--bordered table--striped table--hover">
    ...
</table>
  • sass/objects/_table.scss

Contextual classes

Use contextual classes to color table rows or individual cells.

Lorem ipsum ---------- dolor sit ---------- amet consectetur ---------- adipiscing elit ----------
.active Vestibulum in posuere orci Nam euismod
2nd Vestibulum in posuere orci Nam euismod
.info Vestibulum in posuere orci Nam euismod
4th Vestibulum in posuere orci Nam euismod
.success Vestibulum in posuere orci Nam euismod
6th Vestibulum in posuere orci Nam euismod
.warning Vestibulum in posuere orci Nam euismod
8th Vestibulum in posuere orci Nam euismod
.error Vestibulum in posuere orci Nam euismod
<!-- On rows -->
<tr class="active">...</tr>
<tr class="success">...</tr>
<tr class="warning">...</tr>
<tr class="error">...</tr>
<tr class="info">...</tr>

<!-- On cells (`td` or `th`) -->
<tr>
  <td class="active">...</td>
  <td class="success">...</td>
  <td class="warning">...</td>
  <td class="error">...</td>
  <td class="info">...</td>
</tr>
  • sass/objects/_table.scss

Responsive tables (scroll)

Create responsive tables by wrapping any .table in .table--responsive-scroll to make them scroll horizontally on small devices (change the appropriate max-width media query by editing the Sass-variable $table-breakpoint). You will not see any difference in these tables on any larger screen.

Lorem ipsum ---------- dolor sit ---------- amet consectetur ---------- adipiscing elit ----------
1st Vestibulum in posuere orci Nam euismod
2nd Vestibulum in posuere orci Nam euismod
3rd Vestibulum in posuere orci Nam euismod
tfoot tfoot tfoot tfoot
<div class="table--responsive-scroll">
    <table class="table">
        ...
    </table>
</div>
  • sass/objects/_table.scss

Responsive tables (vertical)

You may also create responsive tables by wrapping a .table in .table--responsive-vertical. The table-cells will be displayed vertically on small devices (change the appropriate max-width media query by editing the Sass-variable $table-breakpoint). For correct display you must add 'data-title' to each <td> and <th> of the <tbody>.

Name Gender Age Occupation Game
Master Chief Male unknown Spartan Halo
Lara Croft Female 32 Tomb Raider Tomb Raider
Solid Snake Male 60 Secret Operative Metal Gear Solid
Samus Aran Female 25 Astronaut Metroid
<div class="table--responsive-vertical">
    <table class="table">
        <thead>
            <tr>
                <th>Name</th>
                <th>Gender</th>
                <th>Age</th>
                <th>Occupation</th>
                <th>Game</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <th data-title="Name">Master Chief</th>
                <td data-title="Gender">Male</td>
                <td data-title="Age">unknown</td>
                <td data-title="Occupation">Spartan</td>
                <td data-title="Game">Halo</td>
            </tr>
        </tbody>
    </table>
</div>
  • sass/objects/_table.scss

Tooltips

Diese Tooltips sind reine CSS-Implementierungen und dadurch sehr einfach zu verwenden. Durch ihre statische Natur unterliegen sie allerdings gewissen Einschränkungen. Zum Beispiel können sie sich nicht automatisch neu ausrichten, falls der Platz zur Anzeige nicht reichen sollte.

Um eines dieser Tooltips zu verwenden wird die CSS-Klasse .tooltip auf einem HTML-Element verwendet. Standardmäßig wird das Tooltip über dem Element anzeigt. Die Klassen .tooltip--bottom, .tooltip--left und .tooltip--right sorgen für eine entsprechend andere Ausrichtung. Außerdem kann mit .tooltip--error, .tooltip--warning und .tooltip--success die Farbe geändert werden.

Der im Tooltip enthaltene Text wird im Attribut data-tooltip des Elements, auf dem der Tooltip liegt, hinterlegt. Sollte der Platz für den Text nicht ausreichen, kann die Klasse .tooltip--multiline verwendet werden.

<a href="..." class="tooltip" data-tooltip="Thank you!">Standard tooltip</a>
<a href="..." class="tooltip tooltip--bottom" data-tooltip="Many thanks!">Bottom tooltip</a>
<a href="..." class="tooltip tooltip--left" data-tooltip="Many thanks!">Left tooltip</a>
<a href="..." class="tooltip tooltip--right" data-tooltip="Many thanks!">Right tooltip</a>
<a href="..." class="tooltip tooltip--multiline" data-tooltip="As of today, Nebula tooltips officially support multiline text!">Multiline tooltip</a>
<a href="..." class="tooltip tooltip--error" data-tooltip="Something went wrong!">Error tooltip</a>
<a href="..." class="tooltip tooltip--warning" data-tooltip="Look out!">Warning tooltip</a>
<a href="..." class="tooltip tooltip--success" data-tooltip="Yay!">Success tooltip</a>
<a href="..." class="tooltip tooltip--bottom tooltip--multiline tooltip--error" data-tooltip="Ain't these some fantastic new tooltips? They surely are!">Bottom multiline error tooltip</a>
  • sass/objects/_tooltips.scss
  • sass/utils/_helpers.scss (dependencies @mixin nb-triangle and @mixin nb-triangle-absolute)

Benachrichtigungen

Vordefinierte Vatrianten

Benachrichtigungen werden als hervorgehobene Textzeilen dargestellt, in der Regel am Anfang der Seite. Sie nutzen die Basisklasse .alert-message in Kombination mit einer der Varianten:

  • .info
  • .warning
  • .error
  • .success

Bei Bedarf können weitere Varianten hinzugefügt werden.

Dies ist ein einfacher Infotext.

Dies ist ein Warnhinweis.

Irgendwas ist schief gelaufen.

Irgendwas hat funktioniert.

<div class="alert-message info">
    ...
</div>
<div class="alert-message warning">
    ...
</div>
<div class="alert-message error">
    ...
</div>
<div class="alert-message success">
    ...
</div>
  • sass/objects/_alert-message.scss
  • js/components/alert.js

Dropdowns

Nebula bietet zwei Funktionsweisen von Aufklapp-Menüs an:

  1. Zum einen das Dropdown, ein Aufklappmenü, das per Mouseklick geöffnet wird.
  2. Umd zum anderen das Slidedown, ebenfalls ein Dropdown-Menü, welches aber nicht per Mouseklick geöffnet wird, sondern indem man mit dem Mousezeiger über das entsprechende Toggle-Element fährt.

Im Folgenden wird - zum Verwechslungen zu vermeiden - die erste Variante also Dropdown genannt, die zweite Slidedown.

Dropdown

Ein Dropdown wird geöffnet, indem man auf den sogenannten Toggle klickt. In der Regel liegt es innerhalb eines Wrapper-Elements mit der Klasse .js-dropdown, kann aber auch manuell über die Funktion el.initDropdown() initialisiert werden.

Mit der Klasse .dropdown auf dem Wrapper-Element können entsprechende CSS-Styles angewendet werden.

Innerhalb des Dropdowns fungiert das Element .dropdown__toggle (in der Regel ein <button>) als Toggle, gefolgt von einem <ul> (mit den einzelnen Menüpunkten) oder einem anderen Element mit der Klasse .dropdown__content (welches andere Inhalte enthält).

Auf das Wrapper-Element können weitere CSS-Klassen gesetzt werden:

Klasse Funktion
.js-dropdown--switch Dieses Dropdown schließt sich automatisch, sobald ein anderes Dropdown oder Slidedown geöffnet wird.
.dropdown--left oder .dropdown--center oder .dropdown--right Das Dropdown-Menü wird mit einem Pfeil versehen und in die entsprechende Richtung ausgerichtet.
.dropdown--upwards Das Dropdown-Menü geht nach oben statt nach unten auf

Das Dropdown ist barrierefrei und kann mit der Tastatur bedient werden.


Slidedown

Im Gegensatz zu den Dropdowns werden Slidedowns nicht über einen Mouseklick geöffnet, sondern dadurch, dass man mit der Mouse über den Trigger fährt. Dies geschieht mit einer Verzögerung von 100ms, um ein ungewolltes Öffnen zu verhindern. Sobald der Mousecursor das Menü verlässt und mehr als 400ms nicht mehr auf das Menü zurückkehrt, wird das Slidedown geschlossen.

Unabhängig davon kann das Menü aber auch über die Tastatur bedient werden.

In der Regel befindet sich das Slidedown in einem Wrapper-Element mit der Klasse .js-slidedown. Es kann aber auch über die Funktion el.initSlidedown() initialisiert werden.

Mit der Klasse .dropdown auf dem Wrapper-Element können entsprechende CSS-Styles angewendet werden.

Innerhalb des Slidedowns fungiert das Element .dropdown__toggle (in der Regel ein <a> oder ein <button>) als Toggle, gefolgt von einem <ul> (mit den einzelnen Menüpunkten) oder einem anderen Element mit der Klasse .dropdown__content (welches andere Inhalte enthält).

Ansonsten können dieselben CSS-Klassen für die Pfeile und die Positionierung angewendet werden, die auch für das Dropdown gelten.

Mit der Klasse .js-slidedown--switch auf dem Wrapperelement kann dafür Sorge getragen werden, dass sich das Slidedown automatisch schließt, sobald sich ein anderes Slidedown oder Dropdown öffnet.

Standardmäßig wird ein href-Attribut auf dem Toggle ignoriert, wenn man es via Touchscreen anklickt. Dadurch wird sichergestellt, dass das Menü auch an einem Touchscreen bedienbar bleibt. Dieses Verhalten kann jedoch mit der CSS-Klasse class .js-slidedown--ignore-touch auf dem Wrapper deaktiviert werden, sodass sich der im href-Attribut angegebene Link öffnet.

Einfaches Slidedown:


Slidedown-switch:


Mit Pfeil:









Mit Pfeil:
<!-- Regular Slidedown -->
<div class="dropdown js-slidedown">
    <button class="btn dropdown__toggle">
        Open slidedown
        <span class="dropdown__caret"></span>
    </button>
    <ul>
        <li><a href="...">Option 1</a></li>
        <li><a href="...">Option 2</a></li>
        <li><a href="...">Option 3</a></li>
        <li class="dropdown__divider"></li>
        <li><a href="...">Seperated option 4</a></li>
    </ul>
</div>

<!-- .slidedown--switch -->
<div class="dropdown js-slidedown js-slidedown--switch">
    <button class="btn dropdown__toggle">
        Open slidedown
        <span class="dropdown__caret"></span>
    </button>
    <ul>
        [...]
    </ul>
</div>
  • sass/components/_dropdown.scss
  • sass/mixins/_dropdown.scss
  • javascript/utils/id.js (dependency)
  • javascript/components/slidedown.js

Multi-level Slidedown

Wenn bei einem .js-slidedown ein ul-Element als Menü verwendet wird, kann dieses durch Unterebenen erweitert werden. Das Slidedown-Skript baut dann entsprechende Untermenüs auf.

<div class="dropdown js-slidedown js-slidedown--switch">
    <button class="btn dropdown__toggle">
        Open slidedown
        <span class="dropdown__caret"></span>
    </button>
    <ul>
        <li><a href="javascript://">Option 1</a></li>
        <li><a href="javascript://">Option 2</a>
            <ul>
                <li><a href="javascript://">Option 2.1</a>
                    <ul>
                        <li><a href="javascript://">Option 2.1.1</a></li>
                        <li><a href="javascript://">Option 2.1.2</a></li>
                        [...]
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</div>
  • sass/components/_dropdown.scss
  • sass/mixins/_dropdown.scss
  • javascript/utils/id.js (dependency)
  • javascript/components/slidedown.js

Multi-level Dropdown/Slidedown-Kombination

Dieses Pattern verhält sich ähnlich wie das vorherige Beispiel, mit dem Unterschied, dass das Menü mit einem Klick geöffnet wird. Die Untermenüs funktionieren via Mouseover.

Dazu muss das Wrapper-Element anstatt .js-slidedown die Klassen .js-dropdown und .js-dropdown-slidedown erhalten. Das Skript kümmert sich um den Rest.

<div class="dropdown js-dropdown js-dropdown-slidedown">
    <button class="btn dropdown__toggle">
        Open slidedown
    </button>
    <ul>
        <li><a href="javascript://">Option 1</a></li>
        <li><a href="javascript://">Option 2</a>
            <ul>
                <li><a href="javascript://">Option 2.1</a>
                    <ul>
                        <li><a href="javascript://">Option 2.1.1</a></li>
                        <li><a href="javascript://">Option 2.1.2</a></li>
                        [...]
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</div>
  • sass/components/_dropdown.scss
  • sass/mixins/_dropdown.scss
  • javascript/utils/id.js (dependency)
  • js/components/dropdown.js
  • js/components/slidedown.js

Date- & Timepicker

pickadate.js is used to implement a responsive date picker and time picker. Please refer to the pickadate.js-website for info on configuration and localization options.

Datepicker

<div class="formrow">
    <div class="formitem">
        <label class="label">Select date</label>
        <input type="text" class="formfield js-datepicker">
    </div>
</div>
  • dependencies/pickadate/lib/picker.js
  • dependencies/pickadate/lib/picker.date.js
  • js/components/datepicker.js (configuration)
  • sass/components/_datepicker.scss (styles)

Timepicker

<div class="formrow">
    <div class="formitem">
        <label class="label">Select time</label>
        <input type="text" class="formfield js-timepicker">
    </div>
</div>
  • dependencies/pickadate/lib/picker.js
  • dependencies/pickadate/lib/picker.time.js
  • js/components/datepicker.js (configuration)
  • sass/components/_datepicker.scss (styles)