Source

Theming Bootstrap

Anpassa Bootstrap 4 med våra nya inbyggda Sass-variabler för globala stilpreferenser för enkla teman och komponentbyten.

Introduktion

I Bootstrap 3 drevs teman till stor del av variabla åsidosättningar i LESS, anpassad CSS och en separat temastilmall som vi inkluderade i våra distfiler. Med lite ansträngning kunde man helt omforma utseendet på Bootstrap 3 utan att röra kärnfilerna. Bootstrap 4 ger ett välbekant, men något annorlunda tillvägagångssätt.

Nu åstadkoms teman med Sass-variabler, Sass-kartor och anpassad CSS. Det finns ingen mer dedikerad stilmall för tema; istället kan du aktivera det inbyggda temat för att lägga till övertoningar, skuggor och mer.

Sass

Använd våra Sass-källfiler för att dra fördel av variabler, kartor, mixins och mer.

Filstruktur

Undvik att ändra Bootstraps kärnfiler när det är möjligt. För Sass betyder det att du skapar din egen stilmall som importerar Bootstrap så att du kan ändra och utöka den. Förutsatt att du använder en pakethanterare som npm, kommer du att ha en filstruktur som ser ut så här:

your-project/
├── scss
│   └── custom.scss
└── node_modules/
    └── bootstrap
        ├── js
        └── scss

Om du har laddat ner våra källfiler och inte använder en pakethanterare, vill du manuellt ställa in något som liknar den strukturen och hålla Bootstraps källfiler åtskilda från dina egna.

your-project/
├── scss
│   └── custom.scss
└── bootstrap/
    ├── js
    └── scss

Importerar

I din custom.scsskommer du att importera Bootstraps käll Sass-filer. Du har två alternativ: inkludera hela Bootstrap, eller välj de delar du behöver. Vi uppmuntrar det senare, men var medveten om att det finns vissa krav och beroenden mellan våra komponenter. Du måste också inkludera lite JavaScript för våra plugins.

// Custom.scss
// Option A: Include all of Bootstrap

@import "node_modules/bootstrap/scss/bootstrap";
// Custom.scss
// Option B: Include parts of Bootstrap

// Required
@import "node_modules/bootstrap/scss/functions";
@import "node_modules/bootstrap/scss/variables";
@import "node_modules/bootstrap/scss/mixins";

// Optional
@import "node_modules/bootstrap/scss/reboot";
@import "node_modules/bootstrap/scss/type";
@import "node_modules/bootstrap/scss/images";
@import "node_modules/bootstrap/scss/code";
@import "node_modules/bootstrap/scss/grid";

Med den inställningen på plats kan du börja modifiera någon av Sass-variablerna och kartorna i din custom.scss. Du kan också börja lägga till delar av Bootstrap under // Optionalavsnittet efter behov. Vi föreslår att du använder hela importstacken från vår bootstrap.scssfil som utgångspunkt.

Variable standardvärden

Varje Sass-variabel i Bootstrap 4 innehåller !defaultflaggan som gör att du kan åsidosätta variabelns standardvärde i din egen Sass utan att ändra Bootstraps källkod. Kopiera och klistra in variabler efter behov, ändra deras värden och ta bort !defaultflaggan. Om en variabel redan har tilldelats kommer den inte att omtilldelas av standardvärdena i Bootstrap.

Variabelöverstyrningar inom samma Sass-fil kan komma före eller efter standardvariablerna. Men när du åsidosätter Sass-filer måste dina åsidosättningar komma innan du importerar Bootstraps Sass-filer.

Här är ett exempel som ändrar background-coloroch colorför <body>när du importerar och kompilerar Bootstrap via npm:

// Your variable overrides
$body-bg: #000;
$body-color: #111;

// Bootstrap and its default variables
@import "node_modules/bootstrap/scss/bootstrap";

Upprepa vid behov för valfri variabel i Bootstrap, inklusive de globala alternativen nedan.

Kartor och slingor

Bootstrap 4 innehåller en handfull Sass-kartor, nyckelvärdespar som gör det lättare att generera familjer av relaterade CSS. Vi använder Sass-kartor för våra färger, rutnätsbrytpunkter och mer. Precis som Sass-variabler inkluderar alla Sass-kartor !defaultflaggan och kan åsidosättas och utökas.

Vissa av våra Sass-kartor slås ihop till tomma kartor som standard. Detta görs för att möjliggöra enkel utökning av en given Sass-karta, men kommer till priset av att det blir lite svårare att ta bort föremål från en karta.

Ändra karta

För att ändra en befintlig färg i vår $theme-colorskarta, lägg till följande i din anpassade Sass-fil:

$theme-colors: (
  "primary": #0074d9,
  "danger": #ff4136
);

Lägg till på kartan

För att lägga till en ny färg till $theme-colors, lägg till den nya nyckeln och värdet:

$theme-colors: (
  "custom-color": #900
);

Ta bort från kartan

För att ta bort färger från $theme-colorseller någon annan karta, använd map-remove:

$theme-colors: map-remove($theme-colors, "success", "info", "danger");

Nödvändiga nycklar

Bootstrap förutsätter närvaron av vissa specifika nycklar inom Sass-kartor som vi använde och utökar dessa själva. När du anpassar de medföljande kartorna kan du stöta på fel där en specifik Sass-kartas nyckel används.

Till exempel använder vi tangenterna primary, success, och dangerfrån $theme-colorsför länkar, knappar och formulärtillstånd. Att ersätta värdena för dessa nycklar bör inte ge några problem, men att ta bort dem kan orsaka Sass-kompileringsproblem. I dessa fall måste du ändra Sass-koden som använder dessa värden.

Funktioner

Bootstrap använder flera Sass-funktioner, men bara en delmängd är tillämplig på allmänt tema. Vi har inkluderat tre funktioner för att få värden från färgkartorna:

@function color($key: "blue") {
  @return map-get($colors, $key);
}

@function theme-color($key: "primary") {
  @return map-get($theme-colors, $key);
}

@function gray($key: "100") {
  @return map-get($grays, $key);
}

Dessa låter dig välja en färg från en Sass-karta ungefär som hur du skulle använda en färgvariabel från v3.

.custom-element {
  color: gray("100");
  background-color: theme-color("dark");
}

Vi har också en annan funktion för att få en viss färgnivå från $theme-colorskartan. Negativa nivåvärden gör färgen ljusare, medan högre nivåer blir mörkare.

@function theme-color-level($color-name: "primary", $level: 0) {
  $color: theme-color($color-name);
  $color-base: if($level > 0, #000, #fff);
  $level: abs($level);

  @return mix($color-base, $color, $level * $theme-color-interval);
}

I praktiken skulle du anropa funktionen och skicka in två parametrar: namnet på färgen från $theme-colors(t.ex. primär eller fara) och en numerisk nivå.

.custom-element {
  color: theme-color-level(primary, -10);
}

Ytterligare funktioner kan läggas till i framtiden eller din egen anpassade Sass för att skapa nivåfunktioner för ytterligare Sass-kartor, eller till och med en generisk sådan om du vill vara mer utförlig.

Färgkontrast

En ytterligare funktion som vi inkluderar i Bootstrap är färgkontrastfunktionen, color-yiq. Den använder YIQ-färgrymden för att automatiskt returnera en ljus ( #fff) eller mörk ( #111) kontrastfärg baserat på den angivna basfärgen. Den här funktionen är särskilt användbar för mixins eller loopar där du genererar flera klasser.

Till exempel, för att generera färgprover från vår $theme-colorskarta:

@each $color, $value in $theme-colors {
  .swatch-#{$color} {
    color: color-yiq($value);
  }
}

Den kan också användas för engångskontrastbehov:

.custom-element {
  color: color-yiq(#000); // returns `color: #fff`
}

Du kan också ange en grundfärg med våra färgkartfunktioner:

.custom-element {
  color: color-yiq(theme-color("dark")); // returns `color: #fff`
}

Sass alternativ

Anpassa Bootstrap 4 med vår inbyggda anpassade variabelfil och växla enkelt globala CSS-inställningar med nya $enable-*Sass-variabler. Åsidosätt en variabels värde och kompilera om med npm run testefter behov.

Du kan hitta och anpassa dessa variabler för viktiga globala alternativ i vår _variables.scssfil.

Variabel Värderingar Beskrivning
$spacer 1rem(standard), eller valfritt värde > 0 Anger standardvärdet för spacer för att programmässigt generera våra spacer-verktyg .
$enable-rounded true(standard) ellerfalse Aktiverar fördefinierade border-radiusstilar på olika komponenter.
$enable-shadows trueeller false(standard) Aktiverar fördefinierade box-shadowstilar på olika komponenter.
$enable-gradients trueeller false(standard) Aktiverar fördefinierade övertoningar via background-imagestilar på olika komponenter.
$enable-transitions true(standard) ellerfalse Aktiverar fördefinierade transitions på olika komponenter.
$enable-hover-media-query trueeller false(standard) Utfasad
$enable-grid-classes true(standard) ellerfalse Möjliggör generering av CSS-klasser för nätsystemet (t.ex. , .container, .row, .col-md-1etc.).
$enable-caret true(standard) ellerfalse Aktiverar pseudoelement caret på .dropdown-toggle.
$enable-print-styles true(standard) ellerfalse Möjliggör stilar för att optimera utskrifter.

Färg

Många av Bootstraps olika komponenter och verktyg är byggda genom en serie färger som definieras i en Sass-karta. Den här kartan kan loopas över i Sass för att snabbt generera en serie regeluppsättningar.

Alla färger

Alla färger som finns tillgängliga i Bootstrap 4 är tillgängliga som Sass-variabler och en Sass-karta i vår scss/_variables.scssfil. Detta kommer att utökas i efterföljande mindre släpp för att lägga till ytterligare nyanser, ungefär som gråskalepaletten vi redan inkluderar.

Blå
Indigo
Lila
Rosa
Röd
Orange
Gul
Grön
Kricka
Cyan

Så här kan du använda dessa i din Sass:

// With variable
.alpha { color: $purple; }

// From the Sass map with our `color()` function
.beta { color: color("purple"); }

Färgverktygsklasser finns också tillgängliga för inställning coloroch background-color.

I framtiden kommer vi att sikta på att tillhandahålla Sass-kartor och variabler för nyanser av varje färg som vi har gjort med gråskalefärgerna nedan.

Temafärger

Vi använder en delmängd av alla färger för att skapa en mindre färgpalett för att generera färgscheman, även tillgänglig som Sass-variabler och en Sass-karta i vår scss/_variables.scssfil.

Primär
Sekundär
Framgång
Fara
Varning
Info
Ljus
Mörk

Gråa

En omfattande uppsättning grå variabler och en Sass-karta scss/_variables.scssför konsekventa nyanser av grått i hela ditt projekt.

100
200
300
400
500
600
700
800
900

Inom _variables.scss, hittar du våra färgvariabler och Sass-karta. Här är ett exempel på $colorsSass-kartan:

$colors: (
  "blue": $blue,
  "indigo": $indigo,
  "purple": $purple,
  "pink": $pink,
  "red": $red,
  "orange": $orange,
  "yellow": $yellow,
  "green": $green,
  "teal": $teal,
  "cyan": $cyan,
  "white": $white,
  "gray": $gray-600,
  "gray-dark": $gray-800
) !default;

Lägg till, ta bort eller ändra värden i kartan för att uppdatera hur de används i många andra komponenter. Tyvärr använder inte alla komponenter denna Sass-karta för närvarande. Framtida uppdateringar kommer att sträva efter att förbättra detta. Tills dess, planera att använda ${color}variablerna och denna Sass-karta.

Komponenter

Många av Bootstraps komponenter och verktyg är byggda med @eachloopar som itererar över en Sass-karta. Detta är särskilt användbart för att generera varianter av en komponent av vår $theme-colorsoch skapa responsiva varianter för varje brytpunkt. När du anpassar dessa Sass-kartor och kompilerar om, kommer du automatiskt att se dina ändringar återspeglas i dessa loopar.

Modifierare

Många av Bootstraps komponenter är byggda med en basmodifieringsklassmodell. Detta innebär att huvuddelen av stilen finns i en basklass (t.ex. .btn) medan stilvariationer är begränsade till modifieringsklasser (t.ex. .btn-danger). Dessa modifieringsklasser är byggda från $theme-colorskartan för att anpassa antalet och namnet på våra modifieringsklasser.

Här är två exempel på hur vi loopar över $theme-colorskartan för att generera modifierare till .alertkomponenten och alla våra .bg-*bakgrundsverktyg.

// Generate alert modifier classes
@each $color, $value in $theme-colors {
  .alert-#{$color} {
    @include alert-variant(theme-color-level($color, -10), theme-color-level($color, -9), theme-color-level($color, 6));
  }
}

// Generate `.bg-*` color utilities
@each $color, $value in $theme-colors {
  @include bg-variant('.bg-#{$color}', $value);
}

Mottaglig

Dessa Sass-loopar är inte heller begränsade till färgkartor. Du kan också skapa responsiva varianter av dina komponenter eller verktyg. Ta till exempel våra responsiva textjusteringsverktyg där vi blandar en @eachloop för $grid-breakpointsSass-kartan med en mediefråga.

@each $breakpoint in map-keys($grid-breakpoints) {
  @include media-breakpoint-up($breakpoint) {
    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);

    .text#{$infix}-left   { text-align: left !important; }
    .text#{$infix}-right  { text-align: right !important; }
    .text#{$infix}-center { text-align: center !important; }
  }
}

Om du skulle behöva ändra din $grid-breakpoints, kommer dina ändringar att gälla för alla loopar som itererar över den kartan.

CSS-variabler

Bootstrap 4 innehåller cirka två dussin anpassade CSS-egenskaper (variabler) i sin kompilerade CSS. Dessa ger enkel åtkomst till vanliga värden som våra temafärger, brytpunkter och primära teckensnittsstaplar när du arbetar i din webbläsares Inspector, en kodsandlåda eller allmän prototyp.

Tillgängliga variabler

Här är variablerna vi inkluderar (observera att det :rootkrävs). De finns i vår _root.scssfil.

:root {
  --blue: #007bff;
  --indigo: #6610f2;
  --purple: #6f42c1;
  --pink: #e83e8c;
  --red: #dc3545;
  --orange: #fd7e14;
  --yellow: #ffc107;
  --green: #28a745;
  --teal: #20c997;
  --cyan: #17a2b8;
  --white: #fff;
  --gray: #6c757d;
  --gray-dark: #343a40;
  --primary: #007bff;
  --secondary: #6c757d;
  --success: #28a745;
  --info: #17a2b8;
  --warning: #ffc107;
  --danger: #dc3545;
  --light: #f8f9fa;
  --dark: #343a40;
  --breakpoint-xs: 0;
  --breakpoint-sm: 576px;
  --breakpoint-md: 768px;
  --breakpoint-lg: 992px;
  --breakpoint-xl: 1200px;
  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
}

Exempel

CSS-variabler erbjuder liknande flexibilitet som Sass variabler, men utan behov av kompilering innan de serveras till webbläsaren. Till exempel, här återställer vi vår sidas teckensnitt och länkstilar med CSS-variabler.

body {
  font: 1rem/1.5 var(--font-family-sans-serif);
}
a {
  color: var(--blue);
}

Du kan också använda våra brytpunktsvariabler i dina mediefrågor:

.content-secondary {
  display: none;
}

@media (min-width(var(--breakpoint-sm))) {
  .content-secondary {
    display: block;
  }
}