SCSS Architecture Patterns
Learn how to structure and organize your SCSS codebase for maintainability and scalability.
7-1 Pattern
A popular architecture pattern that organizes code into 7 folders and 1 main file.
scss/
├── abstracts/
│ ├── _variables.scss # Variables
│ ├── _functions.scss # Functions
│ ├── _mixins.scss # Mixins
│ └── _placeholders.scss # Placeholders
│
├── base/
│ ├── _reset.scss # Reset/normalize
│ ├── _typography.scss # Typography rules
│ └── _animations.scss # Animations
│
├── components/
│ ├── _buttons.scss # Buttons
│ ├── _carousel.scss # Carousel
│ ├── _cards.scss # Cards
│ └── _dropdown.scss # Dropdown
│
├── layout/
│ ├── _navigation.scss # Navigation
│ ├── _grid.scss # Grid system
│ ├── _header.scss # Header
│ ├── _footer.scss # Footer
│ └── _sidebar.scss # Sidebar
│
├── pages/
│ ├── _home.scss # Home specific styles
│ ├── _about.scss # About specific styles
│ └── _contact.scss # Contact specific styles
│
├── themes/
│ ├── _theme.scss # Default theme
│ ├── _dark.scss # Dark theme
│ └── _admin.scss # Admin theme
│
├── vendors/
│ ├── _bootstrap.scss # Bootstrap
│ └── _jquery-ui.scss # jQuery UI
│
└── main.scss # Main file
Main SCSS File (main.scss):
// Abstracts
@import 'abstracts/variables';
@import 'abstracts/functions';
@import 'abstracts/mixins';
@import 'abstracts/placeholders';
// Vendors
@import 'vendors/bootstrap';
@import 'vendors/jquery-ui';
// Base
@import 'base/reset';
@import 'base/typography';
@import 'base/animations';
// Layout
@import 'layout/navigation';
@import 'layout/grid';
@import 'layout/header';
@import 'layout/footer';
@import 'layout/sidebar';
// Components
@import 'components/buttons';
@import 'components/carousel';
@import 'components/cards';
@import 'components/dropdown';
// Pages
@import 'pages/home';
@import 'pages/about';
@import 'pages/contact';
// Themes
@import 'themes/theme';
@import 'themes/dark';
@import 'themes/admin';
ITCSS (Inverted Triangle CSS)
An architecture methodology that helps organize CSS properties in order of specificity.
scss/
├── settings/
│ ├── _global.scss # Global variables
│ └── _colors.scss # Color definitions
│
├── tools/
│ ├── _functions.scss # Global functions
│ └── _mixins.scss # Global mixins
│
├── generic/
│ ├── _normalize.scss # Normalize/reset
│ └── _box-sizing.scss # Global box-sizing
│
├── elements/
│ ├── _headings.scss # H1-H6 styles
│ ├── _links.scss # Anchor styles
│ └── _lists.scss # List styles
│
├── objects/
│ ├── _container.scss # Container objects
│ ├── _grid.scss # Grid system
│ └── _media.scss # Media objects
│
├── components/
│ ├── _buttons.scss # Button styles
│ └── _cards.scss # Card styles
│
└── utilities/
├── _spacing.scss # Spacing helpers
└── _text.scss # Text utilities
Example Implementation:
// settings/_colors.scss
$color-primary: #007bff;
$color-secondary: #6c757d;
// tools/_mixins.scss
@mixin button-variant($background) {
background-color: $background;
&:hover {
background-color: darken($background, 10%);
}
}
// components/_buttons.scss
.button {
padding: 0.5rem 1rem;
border-radius: 4px;
&--primary {
@include button-variant($color-primary);
}
&--secondary {
@include button-variant($color-secondary);
}
}
SMACSS (Scalable and Modular Architecture for CSS)
A style guide for structuring CSS and organizing rules.
scss/
├── base/
│ ├── _reset.scss
│ └── _base.scss
│
├── layout/
│ ├── _header.scss
│ └── _grid.scss
│
├── modules/
│ ├── _buttons.scss
│ └── _cards.scss
│
├── state/
│ └── _states.scss
│
└── theme/
└── _theme.scss
Naming Conventions:
/* Layout Rules */
.l-header {}
.l-grid {}
/* Module Rules */
.btn {}
.btn-primary {}
.card {}
/* State Rules */
.is-active {}
.is-hidden {}
/* Theme Rules */
.theme-dark {}
BEM with SCSS
Implementing BEM (Block Element Modifier) methodology with SCSS features.
// _card.scss
.card {
background: white;
border-radius: 4px;
&__header {
padding: 1rem;
&--highlighted {
background: #f8f9fa;
}
}
&__content {
padding: 1rem;
}
&__footer {
padding: 1rem;
border-top: 1px solid #eee;
}
&--featured {
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
}
// Usage in HTML:
// <div class="card card--featured">
// <div class="card__header card__header--highlighted">
// <div class="card__content">
// <div class="card__footer">
// </div>
Component-Based Architecture
Organizing SCSS for component-based frameworks like React or Vue.
src/
├── components/
│ ├── Button/
│ │ ├── Button.jsx
│ │ └── _button.scss
│ └── Card/
│ ├── Card.jsx
│ └── _card.scss
│
├── styles/
│ ├── abstracts/
│ │ ├── _variables.scss
│ │ └── _mixins.scss
│ │
│ ├── base/
│ │ └── _global.scss
│ │
│ └── main.scss
Component SCSS Example:
// Button/_button.scss
@import '../../styles/abstracts/variables';
@import '../../styles/abstracts/mixins';
.button {
// Component styles
&--primary {
// Variant styles
}
}
// Usage in Component:
// import './_button.scss';
Best Practices
- Follow a consistent naming convention
- Keep files small and focused
- Use partial files with meaningful names
- Maintain a logical file structure
- Document your architecture decisions
- Use source maps for development
- Implement consistent code formatting
- Follow the Single Responsibility Principle
- Keep nesting to a minimum (max 3 levels)
- Use variables for repeated values