zoukankan      html  css  js  c++  java
  • [SCSS] Reuse Styles with the SCSS @mixin Directive

    Copy/pasting the same code is redundant and updating copy/pasted code slows development velocity. Mixins are reusable chunks of code that are included, similar to calling a function, instead of copy/pasted.

    Mixins have some nice features:
    - Arguments just like functions.
    - Arguments can have default values and optional values.
    - Named arguments allow us to use optional and default arguments when the mixin is included.
    - Variable arguments allow us to have a dynamic number of arguments when the mixin is included.
    - The @content directive allow us to add additional styles when the mixin is included.

    In this lesson we learn how to DRY up the code with the SCSS @mixin directive and make copy/paste a thing of the past.

    Define a mixin:

    @mixin make-character($base-color: #a83b24, $mix-color: #fffaa6, $border: null) {

    Here as you can see, we use named parameters. The benifits when we use named parameters is:

    1. we can pass default value: '$base-color: #a83b24'
    2. we can use optional parameter: '$border: null'
    3. when we use mixin, the parameters order doesn't matter
    @include make-character($border: 5px solid brown, $mix-color: pink)

    If you don't know how many paramter the mixin will take, you can do:

    @mixin make-transitions($transitions...) { transition: $transitions; }

    It can take as many as paramters you pass in:

    @include make-transitions(margin 1s, border-radius 1s, border 1s, transform 1s);

    @content directive

    @content directive refers to whatever you pass in when you using mixin:

    .wolverine {
      @include make-character($border: 5px solid brown, $mix-color: pink) {
        @include make-transitions(margin 1s, border-radius 1s, border 1s, transform 1s);
    
        &:hover {
          margin-top: 5rem;
          border-radius: 50%;
          border: 10px solid green;
          transform: rotate3d(10, 0, 0, 360deg);
        }
      };
    }

    So now, @content referts to all the highlighted part.

    @mixin make-character($base-color: #a83b24, $mix-color: #fffaa6, $border: null) {
      $light-color: lighten($base-color, 20%);
      $dark-color: darken($base-color, 35%);
      $cbc: complement($base-color);
      $clc: complement($light-color);
      $cdc: complement($dark-color);
    
      background-image: linear-gradient($light-color, $base-color, $dark-color);
      border: $border;
    
      &:hover { background-image: linear-gradient($clc, $cbc, $cdc); }
      &:hover &-text { color: transparentize(mix($base-color, $mix-color, 25%), .2); }
    
      &-text {
        color: mix($base-color, $mix-color, 75%);
      }
    
      img { @content; }
    }

    In this context, 'img' will get all the highlighted styles.


    .character {
      text-align: center;
      width: 15rem;
      display: inline-block;
      margin: 0.5rem;
    
      p {
        font-size: 1.5rem;
        padding-bottom: 0.5rem;
      }
    
      img {
        margin-top: 1rem;
        border-radius: 25%;
      }
    }
    
    @mixin make-transitions($transitions...) { transition: $transitions; }
    
    @mixin make-character($base-color: #a83b24, $mix-color: #fffaa6, $border: null) {
      $light-color: lighten($base-color, 20%);
      $dark-color: darken($base-color, 35%);
      $cbc: complement($base-color);
      $clc: complement($light-color);
      $cdc: complement($dark-color);
    
      background-image: linear-gradient($light-color, $base-color, $dark-color);
      border: $border;
    
      &:hover { background-image: linear-gradient($clc, $cbc, $cdc); }
      &:hover &-text { color: transparentize(mix($base-color, $mix-color, 25%), .2); }
    
      &-text {
        color: mix($base-color, $mix-color, 75%);
      }
    
      img { @content; }
    }
    
    @mixin media($min-width) {
      @media screen and (min-width: $min-width) { @content; }
    }
    
    .wolverine {
      @include make-character($border: 5px solid brown, $mix-color: pink) {
        @include make-transitions(margin 1s, border-radius 1s, border 1s, transform 1s);
    
        &:hover {
          margin-top: 5rem;
          border-radius: 50%;
          border: 10px solid green;
          transform: rotate3d(10, 0, 0, 360deg);
        }
      };
    }
    
    .rogue { @include make-character(#0ab36d, #FFFE8A, 5px solid green); }
    .firestar { @include make-character(#DB233B, #e3fd00); }
    
    .nightcrawler {
      @include make-character(#1d6098, #ffcef9) {
        @include media(800px) { content: url("../images/bamf.jpg"); }
      };
    }

    Github

  • 相关阅读:
    定位
    浮动
    标准文档流
    盒模型
    CSS继承性和层叠性
    微信公众平台-信息的获取
    信息系统项目管理师-整体介绍
    Dijkstra算法 c语言实现
    windows下c语言获取程序当前的执行目录,读文件的代码片
    网络流问题,及其代码
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6760028.html
Copyright © 2011-2022 走看看