2021.03.29

Sass

@at-rootによるルートへの書き出しと@keyframes

通常通りSassをコンパイルした場合、ネストされたルールセットをルートに書き出すことはできません。

.products {
  .ttl {
    color: #ff0000;
  }
  .contents {
    margin-top: 20px;
  }
}

コンパイル後のCSSは以下のようになります。

.products .ttl {
  color: #ff0000;
}

.products .contents {
  margin-top: 20px;
}

クラス名contentsをルートに書き出すには、@at-rootを利用します。

.products {
  .ttl {
    color: #ff0000;
  }
  @at-root .contents {
    margin-top: 20px;
  }
}

コンパイル後のCSSは以下のようになります。クラス名contentsのルールセットのみルートに書き出されました。

.products .ttl {
  color: #ff0000;
}

.contents {
  margin-top: 20px;
}

CSSアニメーションを実装する場合、@keyframesはルートに記述する必要があります。ただしSassで記述した場合、以下のようにクラス名ttlのanimationプロパティと@keyframesの位置が離れて関係性がわかりにくくなります。

.products {
  .ttl {
    color: #ff0000;
    animation: show 0.2s linear 0s;
  }
  .contents {
    margin-top: 20px;
  }
}

@keyframes show{
  from{
    opacity: 0;
  }
  to{
    opacity: 1;
  }
}

そこで、animationプロパティの直後に@keyframesを記述して関係性を明確にします。@keyframesはネストされたルールセット内に記述するので、通常であれば以下のように@at-rootを利用します。

.products {
  .ttl {
    color: #ff0000;
    animation: show 0.2s linear 0s;
    @at-root @keyframes show{
      from{
        opacity: 0;
      }
      to{
        opacity: 1;
      }
    }
  }
  .contents {
    margin-top: 20px;
  }
}

ただし@keyframesに限っては@at-rootを利用しなくてもルートに書き出されます。Sassのバージョン3.4からこの仕様になりました。

.products {
  .ttl {
    color: #ff0000;
    animation: show 0.2s linear 0s;
    @keyframes show{
      from{
        opacity: 0;
      }
      to{
        opacity: 1;
      }
    }
  }
  .contents {
    margin-top: 20px;
  }
}

コンパイル後のCSSは以下のようになります。@keyframesはルートに書き出され、animationプロパティとの関係性も明確です。

.products .ttl {
  color: #ff0000;
  animation: show 0.2s linear 0s;
}

@keyframes show {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

.products .contents {
  margin-top: 20px;
}

関連記事

2025.07.05

Sass

mixinで@ifの条件分岐を利用して疑似要素を表示

mixinで@if(条件分岐)を利用して、疑似要素にグラデーションの点線ボーダーを表示します。mixinの設定は以下になります。 デフォルトの設定として要素の上…

2021.01.26

Sass

インターポレーションの利用

インターポレーションは変数が参照できない場所でも使うことができるようにする機能です。通常Sassの変数はプロパティ値から参照して使用します。この場合インターポレ…

2021.02.19

Sass

mixinでfont-sizeとletter-spacingを設定

htmlタグやbodyタグにfont-sizeの基準値を何も設定していない場合、1emを指定すると16pxで表示されます。20pxで表示したい場合は、20px …

2021.01.27

Sass

プロパティに変数でマイナス値を設定

プロパティに変数でマイナス値を設定するケースです。例えばマイナスmarginを設定する場合、値が単独の場合は以下のように記述すれば問題ありません。 ですがプロパ…

2022.05.11

Sass

Sassの@import

CSSの@importは以下のいずれかを記述します。 style.cssからabout.cssを読み込んでいるので、htmlではstyle.cssのみ読み込みま…

上に戻る