Created
August 5, 2019 00:23
-
-
Save nikola-wd/fec20d809ef46ea6cff3858cd80282d3 to your computer and use it in GitHub Desktop.
[Family SCSS Mixins] - Easily use nth selectors #scss #sass #mixin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// Select all children from the first to `$num`. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @param {number} $num - id of the child | |
@mixin first($num) { | |
@if $num == 1 { | |
&:first-child { | |
@content; | |
} | |
} @else { | |
&:nth-child(-n + #{$num}) { | |
@content; | |
} | |
} | |
} | |
/// Select all children from the last to `$num`. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @param {number} $num - id of the child | |
@mixin last($num) { | |
&:nth-last-child(-n + #{$num}) { | |
@content; | |
} | |
} | |
/// Select all children after the first to `$num`. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @param {number} $num - id of the child | |
@mixin after-first($num) { | |
&:nth-child(n + #{$num + 1}) { | |
@content; | |
} | |
} | |
/// Select all children before `$num` from the last. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @param {number} $num - id of the child | |
@mixin from-end($num) { | |
&:nth-last-child(#{$num}) { | |
@content; | |
} | |
} | |
/// Select all children between `$first` and `$last`. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin between($first, $last) { | |
&:nth-child(n + #{$first}):nth-child(-n + #{$last}) { | |
@content; | |
} | |
} | |
/// Select all even children between `$first` and `$last`. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin even-between($first, $last) { | |
&:nth-child(even):nth-child(n + #{$first}):nth-child(-n + #{$last}) { | |
@content; | |
} | |
} | |
/// Select all odd children between `$first` and `$last`. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin odd-between($first, $last) { | |
&:nth-child(odd):nth-child(n + #{$first}):nth-child(-n + #{$last}) { | |
@content; | |
} | |
} | |
/// Select all `$num` children between `$first` and `$last`. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin n-between($num, $first, $last) { | |
&:nth-child(#{$num}n):nth-child(n + #{$first}):nth-child(-n + #{$last}) { | |
@content; | |
} | |
} | |
/// Select all children but `$num`. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @param {number} $num - id of the child | |
@mixin all-but($num) { | |
&:not(:nth-child(#{$num})) { | |
@content; | |
} | |
} | |
/// Select children each `$num`. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @param {number} $num - id of the child | |
/// @alias every | |
@mixin each($num) { | |
&:nth-child(#{$num}n) { | |
@content; | |
} | |
} | |
/// Select children each `$num`. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @param {number} $num - id of the child | |
@mixin every($num) { | |
&:nth-child(#{$num}n) { | |
@content; | |
} | |
} | |
/// Select the `$num` child from the start and the `$num` child from the last. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @param {number} $num - id of the child | |
@mixin from-first-last($num) { | |
&:nth-child(#{$num}), | |
&:nth-last-child(#{$num}) { | |
@content; | |
} | |
} | |
/// Select the item in the middle of `$num` child. Only works with odd number | |
/// chain. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @param {number} $num - id of the child | |
@mixin middle($num) { | |
&:nth-child(#{round($num / 2)}) { | |
@content; | |
} | |
} | |
/// Select all children between the `$num` first and the `$num` last. | |
/// @group with-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @param {number} $num - id of the child | |
@mixin all-but-first-last($num) { | |
&:nth-child(n + #{$num}):nth-last-child(n + #{$num}) { | |
@content; | |
} | |
} | |
/// This quantity-query mixin will only select the first of `$limit` items. It will not | |
/// work if there is not as much as item as you set in `$limit`. | |
/// @group Quantity queries | |
/// @param {number} $limit | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin first-of($limit) { | |
&:nth-last-child(#{$limit}):first-child { | |
@content; | |
} | |
} | |
/// This quantity-query mixin will only select the last of `$limit` items. It will not | |
/// if there is not as much as item as you set in `$limit`. | |
/// @group Quantity queries | |
/// @param {number} $limit | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin last-of($limit) { | |
&:nth-of-type(#{$limit}):nth-last-of-type(1) { | |
@content; | |
} | |
} | |
/// This quantity-query mixin will select every items if there is at least `$num` items. It will not | |
/// if there is not as much as item as you set in `$num`. | |
/// @group Quantity queries | |
/// @param {number} $limit | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin at-least($num) { | |
$selector: &; | |
$child: nth(nth($selector, -1), -1); | |
&:nth-last-child(n + #{$num}), | |
&:nth-last-child(n + #{$num}) ~ #{$child} { | |
@content; | |
} | |
} | |
/// This quantity-query mixin will select every items if there is at most `$num` items. It will not | |
/// if there is not as much as item as you set in `$num`. | |
/// @group Quantity queries | |
/// @param {number} $limit | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin at-most($num) { | |
$selector: &; | |
$child: nth(nth($selector, -1), -1); | |
&:nth-last-child(-n + #{$num}):first-child, | |
&:nth-last-child(-n + #{$num}):first-child ~ #{$child} { | |
@content; | |
} | |
} | |
/// This quantity-query mixin will select every items only if there is between `$min` and `$max` items. | |
/// @group Quantity queries | |
/// @param {number} $limit | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin in-between($min, $max) { | |
$selector: &; | |
$child: nth(nth($selector, -1), -1); | |
&:nth-last-child(n + #{$min}):nth-last-child(-n + #{$max}):first-child, | |
&:nth-last-child(n + #{$min}):nth-last-child(-n + #{$max}):first-child ~ #{$child} { | |
@content; | |
} | |
} | |
/// Select the first exact child | |
/// @group no-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin first-child() { | |
&:first-of-type { | |
@content | |
} | |
} | |
/// Select the last exact child | |
/// @group no-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin last-child() { | |
&:last-of-type { | |
@content | |
} | |
} | |
/// Select all even children. | |
/// @group no-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin even() { | |
&:nth-child(even) { | |
@content; | |
} | |
} | |
/// Select all odd children. | |
/// @group no-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin odd() { | |
&:nth-child(odd) { | |
@content; | |
} | |
} | |
/// Select only the first and last child. | |
/// @group no-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin first-last() { | |
&:first-child, | |
&:last-child { | |
@content; | |
} | |
} | |
/// Will only select the child if it’s unique. | |
/// @group no-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @alias only | |
@mixin unique() { | |
&:only-child { | |
@content; | |
} | |
} | |
/// Will only select the child if it’s unique. | |
/// @group no-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin only() { | |
&:only-child { | |
@content; | |
} | |
} | |
/// Will only select children if they are not unique. Meaning if there is at | |
/// least 2 children, the style is applied. | |
/// @group no-arguments | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
@mixin not-unique() { | |
&:not(:only-child) { | |
@content; | |
} | |
} | |
/// This mixin is used to automatically sort z-index in numerical order. But it | |
/// can also sort them in anti-numerical order, depending the parameters you use. | |
/// @group using functions | |
/// @content [Write the style you want to apply to the children, and it will be added within the @content directive] | |
/// @param {number} $num - Number of children | |
/// @param {string} $direction [forward] - Direction of the sort | |
/// @param {number} $index [0] - Index of the sorting | |
@mixin child-index($num, $direction: 'forward', $index: 0) { | |
@for $i from 1 through $num { | |
@if ($direction == 'forward') { | |
&:nth-child(#{$i}) { | |
z-index: order-index($i, $index); | |
@content; | |
} | |
} @else if ($direction == 'backward') { | |
&:nth-last-child(#{$i}) { | |
z-index: order-index($i, $index); | |
@content; | |
} | |
} | |
} | |
} | |
/// Used by the child-index mixin. It will returned the proper sorted numbers | |
/// depending on the `$index` value. | |
/// @access private | |
/// @param {number} $num - Number of children | |
/// @param {number} $index - Index of the sorting | |
@function order-index($i, $index) { | |
@return ($index + $i); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@include first(3) | |
@include last(3) | |
@include last(3) | |
@include from-end(3) | |
@include between(3, 6) | |
@include even-between(3, 12) | |
@include odd-between(3, 13) | |
@include n-between(3,3,13) | |
// This mixin uses 3 arguments, the first one is equal to N item, | |
// the second is the starting item and the thirs the end item. | |
@include all-but(3) | |
@include each(3) | |
// Alias of each() | |
@include every(3) | |
@include from-first-last(2) | |
@include middle(11) | |
@include all-but-first-last(2) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment