マッスル・メモリー

筋肉エンジニアのブログ

railsでsvgにスタイルを当てる方法

svgファイルを読み込むhelperを作成する

# app/helpers/application_helper.rb
def embedded_svg(filename, options={})
    file = File.read(Rails.root.join('app', 'assets', 'images', filename))
    doc = Nokogiri::HTML::DocumentFragment.parse file
    svg = doc.at_css 'svg'
    if options[:class].present?
      svg['class'] = options[:class]
    end
    doc.to_html.html_safe
end

helperをviewに記述する

/ hoge.html.slim
.svg_wrapper
  = embedded_svg('twitter_comment.svg', class: 'comment_svg')

すると以下のようなhtmlになる

<div class="svg_wrapper"><!--?xml version="1.0" encoding="utf-8"?-->
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->

<svg class="comment_svg" version="1.1" id="_x32_" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" style="width: 256px; height: 256px; opacity: 1;" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve">
<style type="text/css">
</style>
<g>
    <path class="st0" d="M339.602,46.658H172.398C77.173,46.658,0,123.849,0,219.048c0,95.225,77.173,172.416,172.398,172.416h122.568
      c24.641,0,32.324,11.437,32.324,20.799c0,13.849-7.189,26.831-24.606,39.248c-10.793,7.684-2.314,13.831,6.147,13.831
      C418.878,465.342,512,345.282,512,219.048C512,123.849,434.81,46.658,339.602,46.658z"></path>
</g>
</svg>
</div>

cssを当てる

.svg_wrapper {
  height: 50rem;
  padding: 30rem;

  .comment_svg {
    width: 1rem !important;
    height: 1rem !important;

    &:hover {
      fill: red;
    }
  }
}

ここで注意なのが、svgのhtmlを確認すると

style="width: 256px; height: 256px; opacity: 1;"

のようにスタイルが当たっている場合があるので、svgファイルのスタイルが優先されてしまう。

このような場合は、これらの記述を消すか、以下のように

width: 1rem !important;
height: 1rem !important;

で優先する必要がある。

すると以下のようにsvgにスタイルを当てることができる。

Image from Gyazo