Theming Bootstrap
Customize Bootstrap 4 with our new built-in Sass variables for global style preferences for easy theming and component changes.
Introduction
In Bootstrap 3, theming was largely driven by variable overrides in LESS, custom CSS, and a separate theme stylesheet that we included in our dist files. With some effort, one could completely redesign the look of Bootstrap 3 without touching the core files. Bootstrap 4 provides a familiar, but slightly different approach.
Now, theming is accomplished by Sass variables, Sass maps, and custom CSS. There’s no more dedicated theme stylesheet; instead, you can enable the built-in theme to add gradients, shadows, and more.
Utilize our source Sass files to take advantage of variables, maps, mixins, and more.
File structure
Whenever possible, avoid modifying Bootstrap’s core files. For Sass, that means creating your own stylesheet that imports Bootstrap so you can modify and extend it. Assuming you’re using a package manager like npm, you’ll have a file structure that looks like this:
If you’ve downloaded our source files and aren’t using a package manager, you’ll want to manually setup something similar to that structure, keeping Bootstrap’s source files separate from your own.
Importing
In your custom.scss , you’ll import Bootstrap’s source Sass files. You have two options: include all of Bootstrap, or pick the parts you need. We encourage the latter, though be aware there are some requirements and dependencies across our components. You also will need to include some JavaScript for our plugins.
With that setup in place, you can begin to modify any of the Sass variables and maps in your custom.scss . You can also start to add parts of Bootstrap under the // Optional section as needed. We suggest using the full import stack from our bootstrap.scss file as your starting point.
Variable defaults
Every Sass variable in Bootstrap 4 includes the !default flag allowing you to override the variable’s default value in your own Sass without modifying Bootstrap’s source code. Copy and paste variables as needed, modify their values, and remove the !default flag. If a variable has already been assigned, then it won’t be re-assigned by the default values in Bootstrap.
Variable overrides within the same Sass file can come before or after the default variables. However, when overriding across Sass files, your overrides must come before you import Bootstrap’s Sass files.
Here’s an example that changes the background-color and color for the <body> when importing and compiling Bootstrap via npm:
Repeat as necessary for any variable in Bootstrap, including the global options below.
Maps and loops
Bootstrap 4 includes a handful of Sass maps, key value pairs that make it easier to generate families of related CSS. We use Sass maps for our colors, grid breakpoints, and more. Just like Sass variables, all Sass maps include the !default flag and can be overridden and extended.
Some of our Sass maps are merged into empty ones by default. This is done to allow easy expansion of a given Sass map, but comes at the cost of making removing items from a map slightly more difficult.
Modify map
To modify an existing color in our $theme-colors map, add the following to your custom Sass file:
Add to map
To add a new color to $theme-colors , add the new key and value:
Remove from map
To remove colors from $theme-colors , or any other map, use map-remove :
Required keys
Bootstrap assumes the presence of some specific keys within Sass maps as we used and extend these ourselves. As you customize the included maps, you may encounter errors where a specific Sass map’s key is being used.
For example, we use the primary , success , and danger keys from $theme-colors for links, buttons, and form states. Replacing the values of these keys should present no issues, but removing them may cause Sass compilation issues. In these instances, you’ll need to modify the Sass code that makes use of those values.
Functions
Bootstrap utilizes several Sass functions, but only a subset are applicable to general theming. We’ve included three functions for getting values from the color maps:
These allow you to pick one color from a Sass map much like how you’d use a color variable from v3.
We also have another function for getting a particular level of color from the $theme-colors map. Negative level values will lighten the color, while higher levels will darken.
In practice, you’d call the function and pass in two parameters: the name of the color from $theme-colors (e.g., primary or danger) and a numeric level.
Additional functions could be added in the future or your own custom Sass to create level functions for additional Sass maps, or even a generic one if you wanted to be more verbose.
Color contrast
One additional function we include in Bootstrap is the color contrast function, color-yiq . It utilizes the YIQ color space to automatically return a light ( #fff ) or dark ( #111 ) contrast color based on the specified base color. This function is especially useful for mixins or loops where you’re generating multiple classes.
For example, to generate color swatches from our $theme-colors map:
It can also be used for one-off contrast needs:
You can also specify a base color with our color map functions:
Sass options
Customize Bootstrap 4 with our built-in custom variables file and easily toggle global CSS preferences with new $enable-* Sass variables. Override a variable’s value and recompile with npm run test as needed.
You can find and customize these variables for key global options in our _variables.scss file.
| Variable | Values | Description |
|---|---|---|
| $spacer | 1rem (default), or any value > 0 | Specifies the default spacer value to programmatically generate our spacer utilities. |
| $enable-rounded | true (default) or false | Enables predefined border-radius styles on various components. |
| $enable-shadows | true or false (default) | Enables predefined box-shadow styles on various components. |
| $enable-gradients | true or false (default) | Enables predefined gradients via background-image styles on various components. |
| $enable-transitions | true (default) or false | Enables predefined transition s on various components. |
| $enable-hover-media-query | true or false (default) | Deprecated |
| $enable-grid-classes | true (default) or false | Enables the generation of CSS classes for the grid system (e.g., .container , .row , .col-md-1 , etc.). |
| $enable-caret | true (default) or false | Enables pseudo element caret on .dropdown-toggle . |
| $enable-print-styles | true (default) or false | Enables styles for optimizing printing. |
Color
Many of Bootstrap’s various components and utilities are built through a series of colors defined in a Sass map. This map can be looped over in Sass to quickly generate a series of rulesets.
How can I override Bootstrap CSS styles?
I need to modify bootstrap.css to fit my website. I feel it’s better to create a separate custom.css file instead of modifying bootstrap.css directly, one reason being that should bootstrap.css get an update, I’ll suffer trying to re-include all my modifications. I’ll sacrifice some load time for these styles, but it’s negligible for the few styles I’m overriding.
Hw do I override bootstrap.css so that I remove the style of an anchor/class? For example, if I want to remove all the styling rules for legend :
I can just delete all that in bootstrap.css , but if my understanding about best practices on overriding CSS is correct, what should I do instead?
To be clear, I want to remove all those styles of legend and use parent’s CSS values. So combining Pranav’s answer, will I be doing the following?
(I was hoping there’s a way to do something like the following:)
![]()
14 Answers 14
Using !important is not a good option, as you will most likely want to override your own styles in the future. That leaves us with CSS priorities.
Basically, every selector has its own numerical ‘weight’:
- 100 points for IDs
- 10 points for classes and pseudo-classes
- 1 point for tag selectors and pseudo-elements
- Note: If the element has inline styling that automatically wins (1000 points)
Among two selector styles browser will always choose the one with more weight. Order of your stylesheets only matters when priorities are even — that’s why it is not easy to override Bootstrap.
Your option is to inspect Bootstrap sources, find out how exactly some specific style is defined, and copy that selector so your element has equal priority. But we kinda loose all Bootstrap sweetness in the process.
The easiest way to overcome this is to assign additional arbitrary ID to one of the root elements on your page, like this: <body >
This way, you can just prefix any CSS selector with your ID, instantly adding 100 points of weight to the element, and overriding Bootstrap definitions:
![]()
Feb 2022: Since I occasionally still get upvotes on this answer. https://tailwindcss.com
In the head section of your html place your custom.css below bootstrap.css.
Then in custom.css you have to use the exact same selector for the element you want to override. In the case of legend it just stays legend in your custom.css because bootstrap hasn’t got any selectors more specific.
But in case of h1 for example you have to take care of the more specific selectors like .jumbotron h1 because
will not override
Here is a helpfull explantion of specificity of css selectors which you need to understand to know exactly which style rules will apply to an element. http://css-tricks.com/specifics-on-css-specificity/
Everything else is just a matter of copy/paste and edit styles.
It should not effect the load time much since you are overriding parts of the base stylesheet.
Here are some best practices I personally follow:
- Always load custom CSS after the base CSS file (not responsive).
- Avoid using !important if possible. That can override some important styles from the base CSS files.
- Always load bootstrap-responsive.css after custom.css if you don’t want to lose media queries. — MUST FOLLOW
- Prefer modifying required properties (not all).
![]()
![]()
Link your custom.css file as the last entry below the bootstrap.css. Custom.css style definitions will override bootstrap.css
Copy all style definitions of legend in custom.css and make changes in it (like margin-bottom:5px; — This will overrider margin-bottom:20px; )
Update 2021 — Bootstrap 4 and Bootstrap 5
There are 3 rules to follow when overriding Bootstrap CSS..
- import/include bootstrap.css before your CSS rules (overrides)
- use more CSS Specificity (or equal) than the Bootstrap CSS selectors
- if any rule is overridden, use !important attribute to force your rules. If you follow rules 1 & 2 this shouldn’t be necessary except for when using Bootstrap utility classes which often contain !important as explained here
Yes, overrides should be put in a separate styles.css (or custom.css ) file so that the bootstrap.css remains unmodified. This makes it easier to upgrade the Bootstrap version without impacting the overrides. The reference to the styles.css follows after the bootstrap.css for the overrides to work.
Just add whatever changes are needed in the custom CSS. For example:
Note: It’s not a good practice to use !important in the override CSS, unless you’re overriding one of the Bootstrap Utility classes. CSS specificity always works for one CSS class to override another. Just make sure you use a CSS selector that is that same as, or more specific than the bootstrap.css
For example, consider the Bootstrap 4 dark Navbar link color. Here’s the bootstrap.css .
So, to override the Navbar link color, you can use the same selector, or a more specific selector such as:
Изменение исходных стилей Bootstrap 3 и их компиляция в CSS
![]()
Подход к разработке, подразумевающий непосредственное подключение исходных стилей Bootstrap 3 к странице, очень удобен, т.к. позволяет нам сразу увидеть результаты изменений в браузере без непосредственной их компиляции.
Это возможно благодаря инструменту «Less.js», который необходимо подключить к странице. Данный скрипт будет преобразовать LESS в CSS на лету.
После того как настройка стилей будет закончена (для продакшена) необходимо будет исходные стили Bootstrap 3 скомпилировать в CSS и подключить их как обычно .
Пошаговая инструкция подключения «bootstrap.less» к странице.
1. Скачать фреймворк Bootstrap 3 с исходными кодами. Для этого на странице https://getbootstrap.com/docs/3.4/getting-started/ нажимаем на кнопку «Download source».

2. После этого распаковываем архив и копируем папку less в ваш каталог стилей.
3. Подключаем «bootstrap.less» к HTML странице:
«bootstrap.less» – это центральный файл, который импортирует в себя содержимое других файлов. Если какие-то стилевые компоненты не нужны, то их можно закомментировать .

4. Скачиваем файл «less.js» с Github и подключаем его к странице:
Пример страницы, к которой подключены исходные коды Bootstrap 3:
Изменение стилей Bootstrap
Изменение стилей Bootstrap выполняется посредством редактирования значений LESS переменных. Для удобства все LESS переменные собраны в файле «variables.less».
Рассмотрим несколько примеров.
1. Изменим количество колонок на 24 и padding между колонками на 20px:

2. Изменим цветовую гамму Bootstrap:

После внесения изменений необходимо сохранить файл «variables.less» и перезагрузить страницу. После перезагрузки сразу же увидим результат:

Компиляция LESS в CSS
После настройки всех LESS переменных необходимо преобразовать исходный код в CSS .
Для этого можно воспользоваться инструкцией, представленной в статье: «Сборка Вootstrap 3 проекта с использованием Grunt».
При этом файл «variables.less» следует заменить на свой, в который вы вносили изменения. После чего выполнить команду:
Полученный после компиляции файл CSS нужно скопировать в свой проект и подключить к странице:
Комментарии:
Здравствуйте, хотел дополнить статью. Для начинающих, работать с less первое время сложно, не говоря уже о просмотре изменений less в браузере и компиляции в CSS. Но они ваш сайт посещают 🙂
Есть очень удобная программа — WinLess. Есть вариант и для других ОС.
Там все проще простого.