SASSでは次のことができます:
!pink = #ff43a7
!darker_pink = !pink - #333333
Rubyでも同じようにしたいです。
16 進数は、値の前に を付けることで Ruby で表すことができます0x
。
pink = 0xff43a7
darker_pink = pink - 0x333333
def color(hex)
"#%06x" % hex
end
.container {
color: <%= color pink %>;
border: 1px solid <%= color darker_pink %>;
}
.container {
color: #ff43a7;
border: 1px solid #cc1074;
}
Sass で色を加算/減算する基本的なアプローチはナンセンスであり、グレー調整を使用する場合にのみ実際に機能します。そのため、Sass 3 では、人々が色について考える方法に密接に対応する HSL ドメインでの操作を完全にサポートしています。
Sass は Ruby で記述されているため、少なくともコードを読んで何が起こっているかを確認できます。
ここにColor クラスと、それらを操作する関数があります。
それは本当に重要なコードです。なぜSassを使わないのですか?
Sass ライブラリが既にある場合は、そのオブジェクトをインスタンス化して操作できます。
例えば:
red = Sass::Script::Color.new([255, 0, 0])
gray = Sass::Script::Color.new([128, 128, 128])
red.lightness < gray.lightness # => true
#00FF00
16 進数の文字列をオブジェクトに変換する組み込みの方法が必要ですが、表示されないため、次のColor
関数を作成しました。
# @param color_string - hex string, like '#22FF22'. MUST be 6 characters,
# because I don't feel like dealing with the use-case for 3. :)
def color_from_hex_string(color_string)
# Drop the leading '#', if any
color_string = color_string[1..-1] if color_string.start_with?('#')
raise ArgumentError.new('Hex string must be 6 characters') unless color_string.length == 6
# Turn into array of 2-digit decimal numbers.
# Eg, '808080' becomes [128, 128, 128]; '#ff0000' becomes [255, 0, 0]
rgb_array = color_string.split('').each_slice(2).map do |slice|
slice.join('').to_i(16).to_s(10)
end
# Use that to build a new Color object
color = Sass::Script::Color.new(rgb_array)
# Set this option so it won't complain (?)
color.options = {:style => :compressed}
return color
end
セットの色をさまざまな色相に分散させたいというものに出会いました。HSV から RGB を取得する方法がわからなかったため、SASS ソースはあまり役に立ちませんでした。
カラージェムには、私が必要としていたものがありました。
私はこのヘルパーを書きました:
def region_color(index, size)
h = (index.to_f / (size - 1).to_f)
Color::HSL.from_fraction(h, 0.95, 0.3).html
end
@ drawownward と @lpsquiggle の希望に従って、@ macek の回答を絞り込むには:
次のように、2 つのヘルパーを作成できます。
def color(color)
"#%06x" % color
end
def darker_color(color)
x = color.match(/0x(..)(..)(..)/)
r = x[1].sub(/[0-3]/, '5')
g = x[2].sub(/[0-3]/, '5')
b = x[3].sub(/[0-3]/, '5')
rgb = "0x#{r}#{g}#{b}"
"#%06x" % (rgb.hex - 0x444444)
end
利点: 低い値 (ここでは 0 から 3 の間) で色の 16 進数を定義した場合、これらは減算の前に積み上げられるため、後で折り返して c、d になるのではなく、最終的に 0 になります。 、e、または f (これにより、予期しない色が得られます)。これは各 #rrggbb ペアの最初の値に対してのみ行われるため、#313131 は #0d0d0d になります。これは技術的には正しくありませんが、#fdfdfd よりもはるかに優れているため、十分な妥協点のように思えます。他の場合にそれらの 2 番目の値を保持します。
Erb テンプレートでは、次のように記述します。
.container {
color: <%= color pink %>;
border: 1px solid <%= darker_color pink %>;
}
それ以外の:
.container {
color: <%= color pink %>;
border: 1px solid <%= color darker_pink %>;
}
それが誰かを助けることを願っています。