web-dev-qa-db-ja.com

CSS3グラデーションにノイズを追加できますか?

CSSのグラデーションにノイズを追加することは可能ですか?

放射状グラデーションのコードは次のとおりです。

body {
    color: #575757;
    font: 14px/21px Arial, Helvetica, sans-serif;
    background-color: #2f3b4b;
    background: -moz-radial-gradient(center 45deg, circle closest-corner, #2f3b4b 0%, #3e4f63 100%);
    background: -webkit-gradient(radial, center center, 10, center center, 900, from(#2f3b4b), to(#3e4f63));
}

その上にノイズを加え、テクスチャを与えるために何を追加しますか?

45
austin

Cssには、背景に「ノイズ」を追加する現在の方法はありません。

別の解決策は、グラフィックエディターで透明なノイズpngを作成することです。次に、そのグラフィックを背景として<div>に適用します。次に、<div>の全領域に<body>を配置する必要があります。これにより、ノイズのあるグラデーションが表示されます。

22
Ben Rowe

これは、これを実装する最も手間のかからない最良の方法です。これは純粋にCSSであり、非常に簡単に実行でき、余分なファイルはありません-何もありません。 OK、それは可能な限り最良の方法ではありませんが、非常にうまく機能し、非常に信頼性が高く(非常に古いブラウザーでテストしても失敗しません)、非常に高速にロードされます。

数か月前に見つけて、それを使用してから、このコードをコピーしてCSSに貼り付けてください。

background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAUVBMVEWFhYWDg4N3d3dtbW17e3t1dXWBgYGHh4d5eXlzc3OLi4ubm5uVlZWPj4+NjY19fX2JiYl/f39ra2uRkZGZmZlpaWmXl5dvb29xcXGTk5NnZ2c8TV1mAAAAG3RSTlNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAvEOwtAAAFVklEQVR4XpWWB67c2BUFb3g557T/hRo9/WUMZHlgr4Bg8Z4qQgQJlHI4A8SzFVrapvmTF9O7dmYRFZ60YiBhJRCgh1FYhiLAmdvX0CzTOpNE77ME0Zty/nWWzchDtiqrmQDeuv3powQ5ta2eN0FY0InkqDD73lT9c9lEzwUNqgFHs9VQce3TVClFCQrSTfOiYkVJQBmpbq2L6iZavPnAPcoU0dSw0SUTqz/GtrGuXfbyyBniKykOWQWGqwwMA7QiYAxi+IlPdqo+hYHnUt5ZPfnsHJyNiDtnpJyayNBkF6cWoYGAMY92U2hXHF/C1M8uP/ZtYdiuj26UdAdQQSXQErwSOMzt/XWRWAz5GuSBIkwG1H3FabJ2OsUOUhGC6tK4EMtJO0ttC6IBD3kM0ve0tJwMdSfjZo+EEISaeTr9P3wYrGjXqyC1krcKdhMpxEnt5JetoulscpyzhXN5FRpuPHvbeQaKxFAEB6EN+cYN6xD7RYGpXpNndMmZgM5Dcs3YSNFDHUo2LGfZuukSWyUYirJAdYbF3MfqEKmjM+I2EfhA94iG3L7uKrR+GdWD73ydlIB+6hgref1QTlmgmbM3/Lex5GI1Ux1RWpgxpLuZ2+I+IjzZ8wqE4nilvQdkUdfhzI5QDWy+kw5Wgg2pGpeEVeCCA7b85BO3F9DzxB3cdqvBzWcmzbyMiqhzuYqtHRVG2y4x+KOlnyqla8AoWWpuBoYRxzXrfKuILl6SfiWCbjxoZJUaCBj1CjH7GIaDbc9kqBY3W/Rgjda1iqQcOJu2WW+76pZC9QG7M00dffe9hNnseupFL53r8F7YHSwJWUKP2q+k7RdsxyOB11n0xtOvnW4irMMFNV4H0uqwS5ExsmP9AxbDTc9JwgneAT5vTiUSm1E7BSflSt3bfa1tv8Di3R8n3Af7MNWzs49hmauE2wP+ttrq+AsWpFG2awvsuOqbipWHgtuvuaAE+A1Z/7gC9hesnr+7wqCwG8c5yAg3AL1fm8T9AZtp/bbJGwl1pNrE7RuOX7PeMRUERVaPpEs+yqeoSmuOlokqw49pgomjLeh7icHNlG19yjs6XXOMedYm5xH2YxpV2tc0Ro2jJfxC50ApuxGob7lMsxfTbeUv07TyYxpeLucEH1gNd4IKH2LAg5TdVhlCafZvpskfncCfx8pOhJzd76bJWeYFnFciwcYfubRc12Ip/ppIhA1/mSZ/RxjFDrJC5xifFjJpY2Xl5zXdguFqYyTR1zSp1Y9p+tktDYYSNflcxI0iyO4TPBdlRcpeqjK/piF5bklq77VSEaA+z8qmJTFzIWiitbnzR794USKBUaT0NTEsVjZqLaFVqJoPN9ODG70IPbfBHKK+/q/AWR0tJzYHRULOa4MP+W/HfGadZUbfw177G7j/OGbIs8TahLyynl4X4RinF793Oz+BU0saXtUHrVBFT/DnA3ctNPoGbs4hRIjTok8i+algT1lTHi4SxFvONKNrgQFAq2/gFnWMXgwffgYMJpiKYkmW3tTg3ZQ9Jq+f8XN+A5eeUKHWvJWJ2sgJ1Sop+wwhqFVijqWaJhwtD8MNlSBeWNNWTa5Z5kPZw5+LbVT99wqTdx29lMUH4OIG/D86ruKEauBjvH5xy6um/Sfj7ei6UUVk4AIl3MyD4MSSTOFgSwsH/QJWaQ5as7ZcmgBZkzjjU1UrQ74ci1gWBCSGHtuV1H2mhSnO3Wp/3fEV5a+4wz//6qy8JxjZsmxxy5+4w9CDNJY09T072iKG0EnOS0arEYgXqYnXcYHwjTtUNAcMelOd4xpkoqiTYICWFq0JSiPfPDQdnt+4/wuqcXY47QILbgAAAABJRU5ErkJggg==);

次に、背景色を追加します

background-color:#0094d0;

デモ: JSFiddle

ソース: https://coderwall.com/p/m-uwvg

66
tim.baker

目新しさのために、データURIを使用しない純粋なCSSノイズを以下に示します(ただし、Webkitでのみ機能するようです)。

#box {
  width:250px;
  height:250px;
  position:relative;
  background-size:55px 10px;
  background-repeat: repeat;
  background-image: -webkit-repeating-radial-gradient(1% 21%, closest-corner, rgba(255,0,255,.5), rgba(0,255,255,.5), rgba(0,0,0,1) 1.7%), -webkit-repeating-radial-gradient(51% 51%, closest-corner, rgba(255,255,255,1), rgba(255,255,255,1), rgba(0,255,0,1) 10%); 
}
#box::before {
  content:'';
  width:100%;
  height:100%;
  position:absolute;
  mix-blend-mode:exclusion;
  background-size:12px 22px;
  background-repeat: repeat;
  background-image: -webkit-repeating-radial-gradient(61% 21%, closest-corner, rgba(255,255,255,1), rgba(0,255,0,.5), rgba(3,0,255,1) 20%),  -webkit-repeating-radial-gradient(91% 51%, closest-corner, rgba(255,255,255,1), rgba(255,255,1,.5), rgba(055,255,255,1) 20%);
  left:0;
  z-index:998;
}
#box::after {
  content:'';
  width:100%;
  height:100%;
  position:absolute;
  mix-blend-mode:exclusion;
  background-size:15px 13px;
  background-repeat: repeat;
  background-image: -webkit-repeating-radial-gradient(21% 21%, closest-corner, rgba(255,255,255,1), rgba(0,0,255,.5), rgba(3,0,255,1) 20%);
  left:0;
  top:0;
  z-index:999;
}
<div id="box"></div>
12
fanfare

SVGフィルターとCSSグラデーションを使用したテクスチャ(ノイズ)の作成

グラデーションにノイズが必要ですか?あなたは幸運です!

Perlin noise は勾配ノイズの一種です。 SVG標準では、Perlin関数を実装する _<feTurbulence>_ というフィルタープリミティブが指定されています。雲や大理石などの人工的なテクスチャを合成することができます。これは希望するノイズです。

ステップ1:SVGグラフィックを定義する

_noise.svg_という小さなSVGファイルを作成します。

_<svg
  xmlns='http://www.w3.org/2000/svg'
  xmlns:xlink='http://www.w3.org/1999/xlink'
  width='300' height='300'>

    <filter id='n' x='0' y='0'>
            <feTurbulence
              type='fractalNoise'
              baseFrequency='0.75'
              stitchTiles='stitch'/>
    </filter>

    <rect width='300' height='300' fill='#fff'/>
    <rect width='300' height='300' filter="url(#n)" opacity='0.80'/>
</svg>
_

この図は、2つの長方形を定義しています。最初のものは単色で塗りつぶされています。 2つ目は、ノイズフィルタが適用された半透明です。 2番目の長方形は、ノイズ効果を提供するために最初の長方形にオーバーレイされます。

SVGオプション

  1. 最初の、そして最も明白なのは、グラフィックの寸法を変更できることです。ただし、CSS _background-repeat_プロパティを使用して要素を埋めることができるため、300×300で十分です。

  2. フィルターのtype属性には、フィルター関数を指定するfractalNoiseまたはturbulenceを指定できます。どちらも視覚的には異なりますが、私の意見では、ノイズフィルターはもう少し微妙です。

  3. フィルターのbaseFrequency属性の範囲はそれぞれ0.5〜0.9で、細かいテクスチャーのコースを提供します。私の意見では、この範囲はどちらのフィルターにも視覚的に最適です。

  4. 最初の長方形のfillは、異なるベースカラーを提供するために変更できます。ただし、後で、基本的にこの色と半透明のCSSグラデーションを組み合わせて、色も定義します。ですから、ここから白が良い出発点です。

  5. 2番目の四角形のopacityの範囲は0.2〜0.9で、フィルターの強度を設定します。値を大きくすると強度が上がります。

この時点で、前述のオプションを微調整し、CSSを介してこのノイズグラフィックを背景画像として設定し、1日と呼ぶことができます。ただし、OPのようなグラデーションが必要な場合は、手順2に進みます。

ステップ2:CSSグラデーションを適用する

_background-image_ プロパティを使用して、SVGノイズグラフィックを要素の背景として設定し、 gradient をオーバーレイできます。この例では、ノイズグラフィックを身体全体に適用し、 linear gradient をオーバーレイします。

_body {
    /* white to black linear noise gradient spanning from top to bottom */
    background:
      linear-gradient(rgba(255,255,255,.5), rgba(0,0,0,.5)),
      url('noise.svg');
}
_

linear-gradient()関数は、noise.svgの上にスタックされる擬似画像を作成します。結果は、ノイズが透けて見える半透明のグラデーションです。

CSSオプション

  1. まず、最も明白なのは、定義されたグラデーションの色を変更できることです。ただし、グラデーションのない単色が必要な場合は、2つの終点の色を等しくします。利点は、サイト全体またはプロジェクト間でグラデーションを使用してもしなくても、同じノイズグラフィックを使用できることです。

  2. *-gradient() functions で作成された複数の画像は、ノイズグラフィックにオーバーレイでき、3つ以上の色パラメーターと角度を単一のグラデーション関数で指定して、あらゆる種類のクールなビジュアル。

  3. グラデーションパラメーターの不透明度。 rgba()およびhsla()-定義された色を強調し、ノイズレベルを下げるために増やすことができます。繰り返しますが、0.2〜0.9は理想的な範囲です。

結論

これは、高度にカスタマイズ可能で非常に軽量な(〜400バイト)ソリューションであり、任意の色またはグラデーションのノイズを簡単に定義できます。ここにはいくつかのノブがありますが、これはほんの始まりにすぎません。 _<feGaussianBlur>__<feColorMatrix>_ など、他のSVGフィルタープリミティブがあり、追加の結果を提供できます。

10
Clint Pachl

はい。現在、ノイズテクスチャに対するCSSベースのアプローチはありません。ただし、(画像ベースではなく)プログラムによるアプローチに苦労している場合は、HTML5キャンバスを使用してみてください。 JavaScriptを使用してノイズを生成する方法に関するチュートリアルがここにあります-> HTML5キャンバスでのノイズの作成

ただし、Canvasアプローチを実行すると、A)JavaScriptはインタープリター言語であり、B)JSを使用したグラフィックスの書き込みは非常に遅いため、訪問者のエクスペリエンスが大幅に遅くなります。

したがって、HTML5を使用してポイントを獲得しようとしているのでない限り、私はイメージに固執します。作成が速くなり、ユーザーが読み込むのが速くなり、外観をより細かく制御できるようになります。

8
derrylwc

これは真のノイズとはみなされませんが、純粋なCSS3アプローチでは、パターンジェネレーターでよく使用される複数の繰り返し線形バックグラウンドセレクターを使用します。

以下に例を示します。

背景、角度、色のストップ、透明度の適切な組み合わせにより、合理的なノイズのような効果が得られるはずです:)

とにかく正しい方向にあなたを設定することを願っています...

7
Andrew Odri

CSSのみを使用してノイズテクスチャを生成することはできません(たとえそうであったとしても、コードトリックのごまかしが必要です)。この種の効果をすぐに提供する新しいCSS3プロパティはありません。より迅速な解決策は、Photoshopなどのグラフィックエディターを使用して行うことです。

2
BoltClock

radial-gradientdivが1つだけの画像なしの方法を見つけました。

まず、放射状グラデーションの例を示します。必要な座標で円を作成するとします。最初の円はx=120y=80、2番目の円はx=20y=20です。以下に記述する関数をよりよく理解するために、この例を検討できます。

.a {
border:1px solid blue;
  width:500px;
  height:200px;
  background: radial-gradient(circle at 120px 80px, red 0px 10px, transparent 10px 100px);
}

.b {
border:1px solid red;
  width:500px;
  height:200px;
  background: radial-gradient(circle at 20px 20px, blue 0px 10px, transparent 10px 100px);
}
<div class="a"></div>
<div class="b"></div>

数千のライングラデーション用の@mixin関数を作成します。

SCSS関数:

@mixin gradient($color, $width, $height, $noiseCount) {
  $value: ();
  @for $i from 1 through $noiseCount {
    $gradient: radial-gradient(
      circle at #{random($width)}px #{random($height)}px,
      $color 0px,
      $color 1px,
      transparent 1px,
      transparent 100%
    );
    $value: append($value, $gradient, comma);
  }
  background: $value;
}

使用法:

div {
  width:400px;
  height: 150px;
  @include gradient(#ffad3e, 400, 150, 2500);
}

結果

%値に従ってノイズを作成したい場合は?

このためにこの関数を使用できます。

@mixin gradient($color, $width, $height, $noiseCount) {
  $value: ();
  @for $i from 1 through $noiseCount {
    $gradient: radial-gradient(
      circle at #{(random($width * 10)) / 10}% #{random($height)}px,
      $color 0px,
      $color 1px,
      transparent 1px,
      transparent 100%
    );
    $value: append($value, $gradient, comma);
  }
  background: $value;
}

div {
  width:100%;
  height: 150px;
  @include gradient(#ffad3e, 100, 150, 2500);
}

結果

0
dgknca