I want to create a website theme based on Bootstrap. I want to extend Bootstrap's default components and change some of them. For this, I would need access to SASS variables that Bootstrap defines so I can override them.
I though of cloning Bootstrap from GitHub and changing it directly, but I heard that's actually not good practice. Could you give me some advice please?
Here's how to override / customize Bootstrap 4 with SASS...
Overrides and customizations should be kept in a separate custom.scss
file that is separate from the Bootstrap SASS source files. This way any changes you make don't impact the Bootstrap source, which makes changes or upgrading Bootstrap later much easier.
1- Consider Bootstrap's SASS folder structure, alongside your custom.scss
...
|-- \bootstrap
| |-- \scss
| | |-- \mixins
| | |-- \utilities
| | |-- bootstrap.scss
| | |-- variables.scss
| | |-- functions.scss
| | |-- ...more bootstrap scss files
| custom.scss
2- In your custom.scss
, import the Bootstrap files that are needed for the overrides. (Usually, this is just variables.scss
. In some cases, with more complex cutomizations, you may also need the functions
, mixins
, and other Bootstrap files.). Make the changes, then @import "bootstrap"
. It's important to import Bootstrap after the changes...
/* custom.scss */
/* import the necessary Bootstrap files */
@import "bootstrap/functions";
@import "bootstrap/variables";
/* make changes to the !default Bootstrap variables */
$body-color: green;
/* finally, import Bootstrap to set the changes! */
@import "bootstrap";
2a (optional) - Also, you can extend existing Bootstrap classes after the @import "bootstrap";
to create new custom classes. For example, here is a new .row-dark
class that extends (inherits from) the Bootstrap .row
class and then add a background-color.
/* optionally create new custom classes from existing classes */
.row-dark {
@extend .row;
background-color: #333333;
color: #ffffff;
}
3- Compile the SASS (node-sass, gulp-sass, webpack/NPM, etc..). The CSS output will contain the overrides! Don't forget to check the includePaths if your @imports fail. For a full list of variables you can override, see the variables.scss file. There are also these global variables.
Bootstrap SASS Demo on Codeply
In summary, here's how it works:
1_ First, when the custom.scss
file is processed using SASS, the !default values are defined in the bootstrap/variables.scss
.
2_ Next, our custom values are set, which will override any of the variables that had !default values set in bootstrap/variables.scss
.
3_ Finally, Bootstrap is imported (@import "bootstrap"
) which enables the SASS processor (A.K.A. compiler) to generate all the appropriate CSS using both the Bootstrap defaults and the custom overrides.
For those that don't know SASS, try this tool that I made.
Also see:
How to get 15 columns in Bootstrap 4 in SASS CSS?
Bootstrap v4 grid sizes / Sass List
Customizing Bootstrap CSS template
Extending Bootstrap 4 and SASS
I will explain from scratch: Download Ruby because sass is written in Ruby. Open the “start command prompt with Ruby” and enter this:
gem install sass
In macos, ruby is already installed. so in terminal:
sudo gem install sass
If you did install bootstrap through package manager; write this code into main.scss
@import "../node_modules/bootstrap/scss/bootstrap";
then navigate to your work directory where you keep your main.scss or main.css files. Enter this code into command line:
sass main.scss main.css
this will initialize compiling sass to css.
If you did download bootstrap source files, find the “scss” folder in your source folder
BOOTSTRAP\bootstrap-4.2.1\bootstrap-4.2.1\scss
and copy it into your style folder in your project where u keep all styling files:css,scss,bootstrap then import “bootstrap.scss” file into main.scss
@import "./scss/bootstrap.scss";
And now initialize compiling by entering this code:
sass main.scss main.css
Finally, you can type:
sass --watch main.scss:main.css //this should be running
to watch all changes in main.css DONT FORGET: You will write your css codes into main.scss, sass will compile it to main.css and you will LINK main.css file in your html.
If you are using visual studio code, you can install “Live Sass Compiler” extension and down below you will see “Watch Sass” button. create main.scss file in the style folder and after import the files the way I explained above, click on the “watch Sass” button and it will start compiling.
Now in bootstrap folder, under scss folder there is _variables.scss
folder. this contains bootstrap variables. let's say you wanna change border-radius. in main.scss
file, before importing your bootstrap:
$border-radius:10rem
@import "./scss/bootstrap.scss";
Github version of Bootstrap always changes since the foundation itself is being updated constantly. Not to mention, the way Bootstrap is structured, it doesn't necessarily compile the way your SASS compiler will export. The best practice is to structure it the way best suitable for you.
Here's how I usually structure my entire project
/style/
/style/theme.scss
/style/theme.min.css
/style/bootstrap.scss
/style/bootstrap.min.css
/style/bootstrap/{subfiles}
/style/bootstrap/mixins/{subfiles}
/style/bootstrap/utilities/{subfiles}
/scripts/
/scripts/bootstrap.min.js
/scripts/main.min.js
/scripts/bootstrap/
This assumes you have sass and js minifier.