Skip to content

Instantly share code, notes, and snippets.

@molily
Last active August 29, 2015 14:26
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save molily/0c59e5b5b248941c4660 to your computer and use it in GitHub Desktop.
Save molily/0c59e5b5b248941c4660 to your computer and use it in GitHub Desktop.
BEM helper mixins for Sass
// Mixins for generating Block Element Modifier (BEM) class names.
// See https://css-tricks.com/snippets/sass/bem-mixins/
// They can be nested to produce meaningful classes.
// To create a descendant selector like `.block--modifier .block__element`
// the block needs to be repeated. For example:
// +block(some-block)
//
// +element(some-element)
// color: red
//
// +modifier(some-modifier)
// color: blue
//
// +block(some-block)
// +element(some-element)
// color: green
//
// &:hover
// +block(some-block)
// +element(some-element)
// background-color: #fffafa
//
// These mixins also prefix the block name. The example above produces
// selectors like .prefix-some-block, .prefix-some-block__some-element etc.
// Prefix all block names with this
$blockPrefix: 'prefix-'
// BEM mixins
// See https://css-tricks.com/snippets/sass/bem-mixins/
// Generates a block class selector
// e.g. “.prefix-name”
@mixin block($name)
.#{$blockPrefix}#{$name}
@content
// Inside a block, generates an element class selector
// e.g. “.prefix-name__element”
@mixin element($name)
&__#{$name}
@content
// Same styles for multiple elements
// e.g. “@include elements(element1 element2)”
// becomes “.prefix-name__element1, .prefix-name__element2”
@mixin elements($names...)
$selector: ()
@each $name in $names
$selector: append($selector, unquote('&__#{$name}'), comma);
#{$selector}
@content
// Inside a block, generates an modifier class selector
// e.g. “.prefix-name--modifier”
@mixin modifier($name)
&--#{$name}
@content
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment