SCSSとクロスプラットフォームグラデーション(まあ、ほぼ)

すべての良い一日。

SCSSを使用して1つの経験を共有したいと思います。 普遍的なグラディエント生成を行うことは(一度だけではなく、どういうわけか私の手が届かないために)私にとって必要でした。 ユニバーサル、これは複数のグラデーションを連続して設定する機能であり、ブラウザのプレフィックスをサポートする必要があります(これを行う)。

HabrとGoogleに対するこの種のソリューションの検索では結果が得られなかったため、自分で対処する必要がありました。 ケースの詳細。



クロスブラウザグラデーションのルールを正しく書き留める方法を思い出せなかったので、常にオンラインサービスをグーグルで検索しました (たとえば、このwww.colorzilla.com/gradient-editor )。 ロードするとすぐに、グラデーションのコードを取得します。



background: #1e5799; /* Old browsers */ background: -moz-linear-gradient(left, #1e5799 0%, #2989d8 50%, #207cca 51%, #7db9e8 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, right top, color-stop(0%,#1e5799), color-stop(50%,#2989d8), color-stop(51%,#207cca), color-stop(100%,#7db9e8)); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(left, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(left, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(left, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* IE10+ */ background: linear-gradient(to right, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#7db9e8',GradientType=1 ); /* IE6-9 */
      
      







先を見据えて、私はすぐにフィルターを言います: IEの場合、およびSafari4 +の-webkit-gradientは、実装できないために見逃さなければなりませんでした(まあ、または実装する方法が見つかりませんでした)。 したがって、タイトルは「ほぼ」誇示します。 上記から、次のようなものが得られます。



 background: #1e5799; /* Old browsers */ background: -moz-linear-gradient(left, #1e5799 0%, #2989d8 50%, #207cca 51%, #7db9e8 100%); /* FF3.6+ */ background: -webkit-linear-gradient(left, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(left, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(left, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* IE10+ */ background: linear-gradient(to right, #1e5799 0%,#2989d8 50%,#207cca 51%,#7db9e8 100%); /* W3C */
      
      







これは私が実装したものであり、その結果、色と位置からグラデーションの配列を設定する必要があり、出力では上記のルールを取得します。 実際には配列自体:



 $gradientOptions: rgba(225,225,225,0) 0%, rgba(225,225,225,1) 10%, rgba(225,225,225,1) 90%, rgba(225,225,225,0) 100%; @include linearGradient(#fff, $gradientOptions , left);
      
      







上記のレコードの構造を(試行錯誤によって)詳細に検討した結果、2つの繰り返し部分を区別できます。



 background: -*-linear-gradient(left, #1e5799 0%, #2989d8 50%, #207cca 51%, #7db9e8 100%);
      
      







そして



 #1e5799 0%, #2989d8 50%, #207cca 51%, #7db9e8 100%
      
      







「背景:線形勾配(右に、#1e5799 0%、#2989d8 50%、#207cca 51%、#7db9e8 100%);」の場合、例外を作成しますが、それでも色設定行が繰り返されます。

以下は、一般的なコードを出力する関数です。



 $browsersPrefix: moz o webkit ms; @mixin linearGradient($oldColor, $gradientList, $direction) { background: $oldColor; $directionRevers:null; @if $direction == left { $directionRevers: right; } @else if $direction == right { $directionRevers: left; } @else if $direction == top { $directionRevers: bottom; } @else if $direction == bottom { $directionRevers: top; } @include buildGradientLine($gradientList); @each $prefix in $browsersPrefix { background:-#{$prefix}-linear-gradient($direction, $resultLine); } background: linear-gradient(to $directionRevers, $resultLine); }
      
      







簡単な説明: $directionRevers



変数は、方向がどこから始まるかを示すブラウザーソリューションとは異なり、グラデーションがどちらの側に向かうかを示すW3C標準に準拠したルールにのみ必要です。 ああ、コードには4つの方向しかありませんが、より柔軟なソリューションが必要な場合は、コードを簡単に作成できます。 @each



は、 $browsersPrefix



変数で以前に指定されたプレフィックスを反復処理し、必要なコードを表示します。



欠落している行は、 @include buildGradientLine($gradientList)



および$resultLine



変数です。 行@include buildGradientLine($gradientList)



は、単に「色の線」を形成し、変数$resultLine



はそれが含まれています。



 $resultLine:null; @mixin buildGradientLine($gradientList) { $resultLine:null; @for $i from 1 through length($gradientList) { $colors: nth($gradientList, $i); $color: nth($colors, 1); $position: nth($colors, 2); $resultLine: $resultLine $color $position; @if $i != length($gradientList) { $resultLine: $resultLine#{','} } } }
      
      







まず、 $resultLine:null



をグローバル変数として宣言すると、平均的なプログラマーにはロジックが明確になります(ただし、学生には明らかなはずですが、何でも起こり得ます)。 ところで、コードのこの部分に問題がありました。 ループの代わりに、通常の@each



を使用した結果、同じ結果になりましたが、行の最後に、グラデーションを表示したくない最後のコンマがありました。 ここで @for



@for



のソリューション。 コードのこのトリッキーな部分を誰が気にしているのか:



 $colors: nth($gradientList, $i); $color: nth($colors, 1); $position: nth($colors, 2);
      
      







説明: $colors: nth($gradientList, $i);



配列全体からループ内の値のペアを選択し、 $color: nth($colors, 1); $position: nth($colors, 2)



$color: nth($colors, 1); $position: nth($colors, 2)



は、それぞれ変数の色と位置に書き込みます。



そして、それはほとんどクロスブラウザのグラデーションであることが判明しました。 色の位置としてパーセンテージを使用してみましたが、ピクセルで動作するはずです。主なことは見逃さないことです。 RGBAも満たしています。 デモは添付されていません。今はこの時間がないので、時間があります。間違いなく追加します。



PS:コードは既成のソリューションから挿入されたので、変数の名前が目を痛めることがあります。 スペル、句読点など、あなた自身がどこで知っているかについて。



All Articles