Sassの競合ず比范的新しいCSS機胜に぀いお

最近では、CSS倉数や新機胜など、CSSには倚くの興味深い機胜がありたす。これらすべおがWebデザむナヌの生掻を倧幅に楜にするこずができたすが、これらの機胜はSassなどのCSSプリプロセッサヌず予期しない方法で盞互䜜甚する可胜性がありたす。 本日翻蚳を公開しおいる資料の著者は、圌女が盎面しなければならなかった問題、それらにどのように察凊したか、そしおなぜサスが今日でも䞍可胜であるず圌女が信じおいるのかに぀いお話したす。











゚ラヌ



CSS機胜min()を詊し、max()さたざたな枬定単䜍を䜿甚しおいる堎合、次のような゚ラヌメッセヌゞが衚瀺される可胜性がありたすIncompatible units: vh and em。





min関数ずmax関数で異なる単䜍を䜿甚した堎合の゚ラヌメッセヌゞ



このメッセヌゞは、Sassに独自の関数があるために衚瀺されたすmin()。そのmin()結果、CSS関数は無芖されたす。さらに、Sassは、それらの間に明確な関係がないナニットを䜿甚しお蚈算を実行するこずはできたせん。



䟋えば、単䜍の関係がされおcmもinサスは、関数の結果を芋぀けるこずができるように、定矩されたmin(20in, 50cm)、あなたのコヌド内でこのようなものを䜿甚する堎合、゚ラヌをスロヌしたせん。



同じこずが他の枬定単䜍でも起こりたす。たずえば、すべおのコヌナヌナニットは盞互接続されおいたす1turn、1radたたは1grad垞に単䜍で衚される同じ倀に倉換されたすdeg。たずえば、1s垞に等しい堎合も同様1000msです。1kHz垞に等しい1000Hz、1dppx垞に等しい96dpi、1in垞に等しい96px。これが、Sassがこれらの単䜍で衚される倀を盞互に倉換し、それ自䜓の関数などのさたざたな関数で䜿甚される蚈算でそれらを混合できる理由min()です。



しかし、枬定単䜍の間に明確な関係がない堎合たずえば、䞊蚘のyemずvh、すべおがうたくいきたせん。



そしお、これは、異なる枬定単䜍で衚された倀を䜿甚する堎合だけではありたせん。calc()内郚で関数を䜿甚しようずしおいたすmin()たた、゚ラヌが発生したす。min()、のように入力しようずするず、calc(20em + 7px)次の゚ラヌが衚瀺されたすcalc(20em + 7px) is not a number for min。





あなたが蚈算倀を䜿甚しようずするず、゚ラヌメッセヌゞ分単䜍が発生



CSS-倉数たたはのようなCSS-数孊関数の出力を䜿甚しようずするず別の問題が状況で発生したcalc()、min()、max()CSSのようなフィルタではinvert()。



同様の状況で衚瀺される可胜性のある゚ラヌメッセヌゞは次のずおりです。$color: 'var(--p, 0.85) is not a color for invert





フィルタでvarを䜿甚するずinvertぱラヌになりたす



ず同じこずが起こりたすgrayscale()$color: ‘calc(.2 + var(--d, .3))‘ is not a color for grayscale。





フィルタでcalcを䜿甚するずgrayscaleぱラヌ



蚭蚈にfilter: opacity()なり、同様の問題が発生する可胜性がありたす$color: ‘var(--p, 0.8)‘ is not a color for opacity。





フィルタヌにVARの䜿甚䞍透明床を゚ラヌが発生し



たすが、他の機胜は䜿甚filterを含め、sepia()、blur()、drop-shadow()、brightness()、contrast()およびhue-rotate()、CSS-倉数を䜿甚するこずは完党に正垞です



この問題の原因は、関数min()ずに圱響を䞎えるものず同様であるこずが刀明したしたmax()。サスには組み蟌み関数ではありたせんsepia()、blur()、drop-shadow()、brightness()、contrast()、hue-rotate()。ただし、独自の関数であるグレヌスケヌル、反転、および䞍透明床がありたす。これらの関数の最初の匕数は倀$colorです。問題のある構造を䜿甚する堎合、Sassはそのような匕数を芋぀けられないため、゚ラヌが衚瀺されたす。



同じ理由で、少なくずも2hsl()぀のhsla()倀たたは-倀を衚すCSS倉数を䜿甚するず問題が発生したす。





varをカラヌで䜿甚する堎合の゚ラヌhsl



䞀方、Sassを䜿甚しない堎合、構成color: hsl(9, var(--sl, 95%, 65%))は完党に正しく、完党に機胜するCSS構成です。や



などの関数に぀いおも同じこずが蚀えたす。rgb()rgba()





varを色で䜿甚するず゚ラヌが発生したすrgba



たた、Compassをむンポヌトしおlinear-gradient()or内でCSS倉数を䜿甚しようずするず、radial-gradient()別の゚ラヌが発生する可胜性がありたす。ただし、同時に、conic-gradient()倉数で倉数を問題なく䜿甚できたすもちろん、ブラりザヌがこの機胜をサポヌトしおいる堎合。





バックグラりンドでvarを䜿甚するず゚ラヌが発生したすlinear-gradient



この問題の理由は、Compassに独自のlinear-gradientずradial-gradient()関数がありたすが、関数conic-gradient()が存圚しなかったためです。



䞀般に、これらの問題はすべお、SassたたはCompassが独自の機胜を持っおおり、その名前がCSSのものず同じであるずいう事実に起因しおいたす。SassずCompassはどちらも、これらの機胜を満たす堎合、暙準の実装ではなく、これらの機胜の独自の実装を䜿甚するず考えおいたす。



これが埅ち䌏せです



解決



この問題は、Sassは倧文字ず小文字を区別したすが、CSSはそうではないこずを芚えおおくこずで解決できたす。



これは、このようなものを曞くこずができMin(20em, 50vh)、Sassがこの構造内の独自の関数を認識しないこずを意味したすmin()。゚ラヌは生成されたせん。この構成は、期埅どおりに機胜する敎圢匏のCSSになりたす。同様に、他の機胜ずの問題を取り陀くために自分の名前を曞き蟌むこずによっお、非暙準的な方法するこずができたすHSL()、HSLA()、RGB()、RGBA()、Invert()。



グラデヌションに関しおは、私は通垞次の圢状を䜿甚したすlinear-Gradient()ずradial-Gradient()。この衚蚘はSVGで䜿甚されおいる名前に近いため、これを行いたす、ただし、少なくずも1぀の倧文字を含む他の同様の名前はこの状況で機胜したす。



なぜこれらすべおの合䜵症



Sassに぀いおツむヌトするたびに、CSS倉数ができたので、Sassを䜿甚する必芁がなくなったこずに぀いお講矩を受けたす。私はこれに答えお、この考えに反察する理由を説明するこずにしたした。



たず、CSS倉数は非垞に䟿利であり、過去3幎間にさたざたなタスクに䜿甚しおきたこずに泚意しおください。ただし、これらを䜿甚するずパフォヌマンスに圱響するこずを芚えおおく必芁があるず思いたす。そしお、呌び出しの迷路の問題の怜玢calc()最も䞍快な経隓になる可胜性がありたす。暙準のブラりザ開発者ツヌルは、ただこれが埗意ではありたせん。私はCSS倉数の䜿甚に倢䞭にならないようにしおいたす。そうするこずで、CSS倉数の欠点が利点よりも倚く珟れる状況に陥らないようにしおいたす。





これらのcalc匏の評䟡結果がどうなるかを理解するのは簡単ではありたせん。



䞀般に、倉数を定数ずしお䜿甚するず、芁玠ごず、たたは状態ごずに倉化したせんこのような堎合、CSS倉数は必ず䜿甚する必芁がありたす。必芁、たたは倉数がコンパむルされたCSSの量を削枛しない堎合プレフィックスによっお䜜成された繰り返しの問題を解決する、Sass倉数を䜿甚したす。



第二に、私がSassを䜿甚する理由の䞭で、可倉サポヌトは垞にかなりマむナヌな理由でした。 2012幎埌半にSassを䜿い始めたずきは、䞻にルヌプ甚に䜿いたした。 CSSにただ欠けおいる機胜の堎合。ルヌプロゞックの䞀郚をHTMLプリプロセッサに移動したしたがこれにより、生成されるコヌドの量が枛り、HTMLずCSSの䞡方を倉曎する必芁がなくなるため、倚くの堎合、Sassルヌプを䜿甚したす。これらには、倀のリストの生成、募配を調敎するための倀の䜜成、関数を操䜜するずきのポむントのpolygon()リストの䜜成、倉換のリストの䜜成などが含たれたす。



以䞋は、プリプロセッサを䜿甚しおいく぀かのHTML芁玠を䜜成するずきに以前に行ったであろうこずの䟋です。どのプリプロセッサでもかたいたせんが、Pugを遞択したした。



- let n = 12;

while n--
  .item


次に$n、Sassで倉数を䜜成しこの倉数はHTMLず同じ倀である必芁がありたす、それを䜿甚しおルヌプを開始したす。ここで、各芁玠の配眮に䜿甚される倉換を生成したす。



$n: 12;
$ba: 360deg/$n;
$d: 2em;

.item {
  position: absolute;
  top: 50%; left: 50%;
  margin: -.5*$d;
  width: $d; height: $d;
  /*    */

  @for $i from 0 to $n {
    &:nth-child(#{$i + 1}) {
      transform: rotate($i*$ba) translate(2*$d) rotate(-$i*$ba);
      &::before { content: '#{$i}' }
    }
  }
}


これの欠点は、芁玠の数が倉曎された堎合、PugコヌドずSassコヌドの䞡方の倀を倉曎する必芁があるこずです。さらに、コヌドには倚くの繰り返しがありたす。





䞊蚘のコヌドから生成されたCSSコヌド



今、私は別のアプロヌチを取りたした。぀たり、Pugを䜿甚しお、カスタムプロパティずしおむンデックスを生成し、宣蚀で䜿甚したすtransform。



Pugが凊理する予定のコヌドは次のずおりです。



- let n = 12;

body(style=`--n: ${n}`)
  - for(let i = 0; i < n; i++)
    .item(style=`--i: ${i}`)


Sassコヌドは次のずおりです。



$d: 2em;

.item {
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -.5*$d;
  width: $d;
  height: $d;
  /*    */
  --az: calc(var(--i)*1turn/var(--n));
  transform: rotate(var(--az)) translate(2*$d) rotate(calc(-1*var(--az)));
  counter-reset: i var(--i);

  &::before { content: counter(i) }
}


ここでこのコヌドを詊すこずができたす。





ルヌプ



を䜿甚しお生成およびスタむル蚭定された芁玠このアプロヌチを採甚するず、自動生成されるCSSの量が倧幅に削枛されたした。





䞊蚘のコヌドから生成されたCSS



しかし、虹のようなものを䜜成したい堎合は、Sassルヌプなしでは実行できたせん。



@function get-rainbow($n: 12, $sat: 90%, $lum: 65%) {
  $unit: 360/$n;
  $s-list: ();

  @for $i from 0 through $n {
    $s-list: $s-list, hsl($i*$unit, $sat, $lum)
  }

  @return $s-list
}

html { background: linear-gradient(90deg, get-rainbow()) }


ここにありたす。この䟋の䜜業バヌゞョンは。





マルチカラヌの背景



もちろん、これはPug倉数を䜿甚しお生成できたすが、このアプロヌチはCSS倉数の動的な性質に勝る利点はなく、ブラりザヌに送信されるコヌドの量を枛らすこずはありたせん。結果ずしお、私が慣れおいるものをあきらめるこずは私には意味がありたせん。



私は、䞉角関数など、SassおよびCompassの組み蟌みの数孊関数をよく䜿甚したす。最近、これらの機胜はCSS仕様の䞀郚ですが、すべおのブラりザヌがただそれらをサポヌトしおいるわけではありたせん。 Sassにはこれらの機胜はありたせんが、Compassにはありたす。そのため、私はCompassをよく䜿甚したす。



そしおもちろん、私はこの皮の独自の関数をSassで䜜成できたす。 Compassが逆䞉角関数をサポヌトする前に、私はこれを最初に行いたした。私は本圓にこれらの関数が必芁なので、テむラヌシリヌズを䜿甚しお自分で䜜成したした。しかし、最近のコンパスにはそれらの機胜がありたす。それらは私が自分で曞いたものよりも優れおいお生産的です。



私はアヌティストではなくプログラマヌであるため、数孊関数は私にずっお非垞に重芁です。私のCSSの倀は通垞、数孊的な蚈算から生成されたす。これらはいく぀かの「魔法の数字」、たたは玔粋に審矎的な圹割を果たすものではありたせん。それらの䜿甚䟋は、次の正芏たたは準正芏ポリゎンのリストを生成するこずです。clip-path..。これは、たずえば、アバタヌやステッカヌなど、圢状が長方圢ずは異なるものを䜜成するずきに䜿甚されたす。



頂点が円䞊にある通垞のポリゎンに぀いお考えおみたす。次の䟋のスラむダヌをドラッグするず、ここで実隓できたす。これにより、頂点の数が異なる圢状のポむントがどこに配眮されおいるかを確認できたす。





3぀の頂点を持぀圢状



これは、察応するSassコヌドがどのように芋えるかです。



@mixin reg-poly($n: 3) {
  $ba: 360deg/$n; //  
  $p: (); //   ,  

  @for $i from 0 to $n {
    $ca: $i*$ba; //  
    $x: 50%*(1 + cos($ca)); //  x  
    $y: 50%*(1 + sin($ca)); //  y  
    $p: $p, $x $y //       
  }

  clip-path: polygon($p) //       clip-path 
}


ここではルヌプやその他の構造を䜿甚しおいるこずに泚意しおください。これらは玔粋なCSSで䜿甚するには非垞に䞍䟿です。



この䟋のもう少し高床なバヌゞョンで$oaは、各頂点に察応するコヌナヌに同じオフセットを远加しおポリゎンを回転させる必芁がありたす。これは、次の䟋で確認できたす。星はここで生成され、同様の方法で配眮されたすが、垞に偶数の頂点がありたす。この堎合、奇数のむンデックスを持぀各頂点は、半埄がメむンの円$f*50%よりも小さい円䞊に配眮されたす。





星



あなたはそのような面癜い星を䜜るこずができたす。





星珍しいテンプレヌトを䜿甚しお䜜成された



境界線border付きのステッカヌを䜜成できたす。ではこの䟋、ステッカヌは、単䞀のHTML芁玠から䜜成され、カスタマむズのために䜿甚されるテンプレヌトをborder䜿甚しお䜜成されたclip-pathサスルヌプず数孊を。実際、ここにはたくさんの蚈算がありたす。





耇雑な境界線のあるステッカヌ



もう1぀の䟋は、カヌドの背景を䜜成する方法です。ここでは、ルヌプ内で、モゞュラス挔算子ず指数関数を䜿甚しお、ディザリング効果を暡倣しお背景を䜜成したす。





ディザリングの効果



これは、CSS倉数が頻繁に䜿甚される堎所でもありたす。



次に、スラむダヌのようなものをスタむリングするずきに同じ宣蚀を䜕床も曞く必芁がないように、ミックスむンを䜿甚するこずを怜蚎できたす。ブラりザヌが異なれば、そのようなコントロヌルの内郚コンポヌネントのスタむルを蚭定するために異なる疑䌌芁玠を䜿甚するため、さたざたな疑䌌芁玠を䜿甚しお倖芳を制埡するコンポヌネントごずにスタむルを定矩する必芁がありたす。



残念ながら、CSSでは、魅力的に聞こえたすが、次のコヌドのようなものを配眮するこずはできたせん。



input::-webkit-slider-runnable-trackinput::-moz-range-trackinput::-ms-track { /*   */ }


それは動䜜したせん。少なくずも1぀のセレクタヌが認識されない堎合、このルヌルセット党䜓は無芖されたす。たた、この䟋では3぀のセレクタヌすべおの存圚をブラりザヌが認識しおいないため、これらのスタむルはどのブラりザヌにも適甚されたせん。



スタむリングを機胜させたい堎合は、次のようなこずを行う必芁がありたす。



input::-webkit-slider-runnable-track { /*   */ }
input::-moz-range-track { /*   */ }
input::-ms-track { /*   */ }


しかし、これは同じスタむルがコヌドに3回珟れるずいう事実に぀ながる可胜性がありたす。たた、たずえばtrackプロパティを倉曎する必芁がある堎合background、これは、、 in ::-webkit-slider-runnable-track、::-moz-range-trackおよびinのスタむルを線集する必芁があるこずを意味したす::-ms-track。



この問題に察する唯䞀の正しい解決策は、ミックスむンを䜿甚するこずです。スタむルはコンパむルされたコヌドで繰り返されたす。スタむルがないずできないためですが、少なくずも、゚ディタヌで同じコヌドを3回入力する必芁はありたせん。



@mixin track() { /*   */ }

input {
  &::-webkit-slider-runnable-track { @include track }
  &::-moz-range-track { @include track }
  &::-ms-track { @include track }
}


結果



私が匕き出すこずができる䞻な結論はこれですサスむンは私たちがただなしではできないこずです。



Sassを䜿甚しおいたすか






All Articles