2016-07-27 15 views
3

私は自分のコードをできるだけDRY状態に保つようにしています。この例を考えてみましょう:SASS - 親の参照親

#parent { 
    position: relative; 

    #child { 
    position: absolute; 
    top: 0; 
    left: 0; 
    } 
} 

今私は#childを変更します#parent上のホバー効果を追加したいです。

#parent { 
    position: relative; 

    #child { 
    position: absolute; 
    top: 0; 
    left: 0; 
    } 

    &:hover #child { 
    transform: scale(1.2, 1.2); 
    } 
} 

しかし、私はこの解決策に満足していません。 #childが2度宣言されているため、完全にDRYではありません。それを行うための別の方法は、このようなものです:

#parent { 
    position: relative; 
} 

#child { 
    position: absolute; 
    top: 0; 
    left: 0; 

    #parent:hover & { 
    transform: scale(1.2, 1.2); 
    } 
} 

#parentが2回宣言されているため、これは間違いなく、より意味的な、ないよりDRYです。

SASSでこれを行うには本当にDRY方法がありますか?

+0

第二の例は、どのように動作しますか?前にこの方法を見たことがない... – MMachinegun

+0

@marczking謝罪、私は今固定した私の2番目の例で間違いを犯した。 – Coop

+0

2番目の例で '#child#parent'はどのように動作しますか? –

答えて

2

私はそれを行うには、少なくとも5つの美しい方法があります。私は1を共有します。もしあなたがもっと欲しいのであれば、もっと共有することもできます。

関数の使用

@mixin onParentHover() { 
    $rootString: #{&}; 
    $parentIndex: str-index($rootString, " "); 
    $parent: str_slice($rootString, 0, $parentIndex - 1); 
    $children: str_slice($rootString, $parentIndex); 

    @at-root #{$parent}:hover #{$children} { 
    @content; 
    } 
} 

使用

#parent { 
    position: relative; 
    width: 100px; 
    height: 100px; 
    #child { 
    position: absolute; 
    top: 0; 
    left: 0; 
    width: 100%; 
    height: 100%; 
    @include onParentHover { 
     transform: scale(1.2, 1.2); 
    } 
    } 
} 

最終出力

#parent { 
    position: relative; 
    width: 100px; 
    height: 100px; 
} 
#parent #child { 
    position: absolute; 
    top: 0; 
    left: 0; 
    width: 100%; 
    height: 100%; 
} 
#parent:hover #child { 
    text-size: 20px; 
} 
+0

これは非常に興味深い方法です。意味をなさない!ミックスインのオーバーヘッドがあるのは残念ですが、仕事をしていると思います。 – Coop

+0

@ at-rootと一緒に変数を使用することもできますし、sassのドキュメントでチェックしてください。しかし、私はそれがはるかに表現力豊かなので、この方法が好きです。 – Bamieh

関連する問題