【问题标题】:using sass color functions without sass engine在没有 sass 引擎的情况下使用 sass 颜色函数
【发布时间】:2013-07-14 22:28:35
【问题描述】:

我想在一个类中使用 Sass 颜色函数,而不使用 Sass 引擎。我已经在项目中使用了 sass gem,所以我认为捎带会很简单:

class Rectangle
  include Sass::Script::Functions
  def color
    Sass::Script::Color.new([0x82, 0x39, 0x06])
  end
  def render
    #haml engine executed with context of self
    #so that within temlate i could call
    #  %stop{offset: '0%', stop: {color: lighten(color)}}
  end
end

更新:参见上面的#render,我想在Rectangle 实例的上下文中呈现的haml 模板中调用lighten(color)

但我得到一个未定义的方法assert_type 错误。 assert_type 方法在 Sass::Script::Functions::EvaluationContext 类中定义。 (github file)

irb 中玩耍,只是为了得到接近我想要的东西,看起来像这样:

require 'sass'
eval_context = Sass::Script::Functions::EvaluationContext.new({})
#yes the Sass::Script::Number.new(10) is requried, a simple 10 will not work
color = eval_context.rgb(Sass::Script::Number.new(10), Sass::Script::Number.new(10), Sass::Script::Number.new(10))
eval_context.lighten(color, Sass::Script::Number.new(10))

这太疯狂了——我错过了什么吗?

【问题讨论】:

    标签: ruby sass


    【解决方案1】:

    Sass::Script::Parser.parse('lighten(#333, 10)', 0, 0).perform(Sass::Environment.new)

    【讨论】:

    • 这正是我想要的。这个答案已经3年了。有没有其他方法可以实现这一目标?还是这个?
    【解决方案2】:

    更新

    既然我更了解你的问题,何不直接重写功能。

    require 'sass'
    
    class Rectangle
      include Sass::Script
    
      def color
        @color ||= Sass::Script::Color.new([0x82, 0x39, 0x06])
      end
    
      def lighten(ammount)
        hsl = color.hsl.dup
        hsl[2] += ammount
        @color = Sass::Script::Color.new(hue: hsl[0], saturation: hsl[1], lightness: [2])
      end
    end
    
    rec = Rectangle.new
    rec.lighten(20)
    

    旧答案

    你没有疯,你只是加入了错误的部分。

    此代码按预期运行。请注意,我从包含中删除了 ::Functions

    require 'sass'
    
    class Rectangle
      include Sass::Script
    
      def color
        color = Sass::Script::Color.new([0x82, 0x39, 0x06])
        puts color.class
      end
    end
    
    rec = Rectangle.new
    rec.color
    

    【讨论】:

    • 对不起 - 我想我真正的问题埋在我的代码 cmets 中。我想打电话给 rec.lighten(rec.color, 10) - 我会更新我的问题。我也可以在您的代码中引发错误:如果您从 #color 方法中删除 puts 语句并将最后一行替换为 puts rec.color
    • 谢谢。在puts 上仍然有错误,或者更确切地说是在#to_s 上。 #to_s 需要工作,因为这就是 haml 模板所调用的。要解决此问题,@color 变量需要将选项设置为某个值。 @color.options={} 似乎有效。我会接受你的回答,我只是希望 sass 更加模块化 - 它似乎与“引擎”非常相关
    • 嗯,Sass 的核心是一个 CSS 引擎。以这种方式使用它的目的是什么?
    • 操纵颜色。我绝对肯定还有另一个 gem 可以做到这一点,但就像我说的,我已经加载了 sass gem...
    • fyi Color.new 需要 hsl 的哈希参数,否则它们被视为 rgb 值@color = Sass::Script::Color.new(hue: hsl[0], saturation: hsl[1], lightness: hsl[2])
    猜你喜欢
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多