• 코드를 재사용하기 위해 만들어진 기능
  • 반복되는 코드를 include해서 사용
  • mixin이 여러 개인 경우 _mixins.scss에서 한 번에 관리

@mixin 이름(매개변수) {} // 생성
@include 이름(인수); // 사용

인자가 없는 경우

@mixin flex-center-col {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}
 
.card {
  @include flex-center;
  justify-content: left;
}
 
.aside {
  @include flex-center;
  flex-direction: row;
}
  • 원치 않는 속성은 overriding하여 덮어씌울 수 있음
  • 해당 코드 블럭을 아예 툭 가져오는 것으로 취급

인자가 있는 경우

@mixin flex($dir:column, $x:center, $y:center) {
  display: flex;
  flex-direction: $dir;
  justify-content: $x;
  align-items: $y;
}
 
.card {
  // @include flex(column, left, center);
  @include flex(column, left);
}
 
.aside {
  // @include flex(row, center, center);
  @include flex(row);
}
  • 인자를 사용해 능동적으로 스타일 적용
  • 인자에는 미리 default 값을 지정 가능
  • default를 사용할 경우 인자 전달 불필요
  • 앞에서부터 채워짐

  • 연관 있는 요소들끼리 스타일 코드가 중복된 경우에 사용

mixin 쓰면 되는 거 아닌가요?

  • mixin : 관계 없는 선택자에서 조금 다른 스타일을 적용할 때
  • extend : 관계 있는 선택자들에 동일한 소스코드 적용할 때

.profile-user {
    background-image: url("./programmer.png");
    background-size: cover;
    background-position : 50% 50%;
    border-radius: 50%;
    width : 50px;
    height : 50px;
  }
  
  .comment-user {
    @extend .profile-user;
  }
  • 스타일을 가져오고자 하는 선택자 자체를 @extend 뒤에 붙여 사용

%base-button {
  width: 133px;
  height: 44px;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 14px;
  border-radius: 10px;
}
 
.follow-button {
  @extend %base-button;
  background-color: #ffffff;
  color: #ff375f;
  border: 3px solid #ff375f;
}
 
.message-button {
  @extend %base-button;
  background-color: #ff375f;
  color: white;
}

무슨 차이죠?

  • % 선택자는 CSS로 컴파일되지 않는다

모달

// Scss
%modal {
  position: relative;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background-color: #fff;
  border-radius: 6px;
}
 
.login-modal {
  @extend %modal;
  width: 272px;
  height: 405px;
  padding: 10px 20px;
}
 
.event-modal {
  @extend %modal;
  width: 340px;
  height: 160px;
  padding

포토링크 박스

// Scss
%box-frame {
  border: 2px solid #bb6bd9;
  border-radius: 15px;
  width: 574px;
  height: 310px;
}
 
.phoster-span {
  @extend %box-frame;
  span {
    display: inline-block;
    border-top: 2px solid #bb6bd9;
    padding: 16px 0 17px;
    text-align: center;
  }
}
 
.phoster-none {
  @extend %box-frame;
}