Quantcast
Channel: CSSタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8647

[Vue.js] v-bind:style で background-image がバインドできなかったら

$
0
0

よくあるのは値( url())の指定方法がちょっと特殊だというもの。
Vue.jsでbackground-imageを指定する - Qiita

しかしそれでも上手く行かなかった。

原因

URLに ( )が含まれていた。

See the Pen Vue style binding test 1 by ふくい 👨‍💻 (@var_fukui) on CodePen.

もっと詳しく

URLには encodeURIをかましているので問題ないと思いこんでいたが、実はこの関数、

encodeURI は下記以外の全ての文字をエスケープします。

エスケープされないもの:

A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #

参考:encodeURI() - JavaScript | MDN
RFC2396 という基準に沿っているので ( )をエンコードしてくれない。

この話自体は割と有名かもしれないが、問題は v-bind:style で ( )付きの URL を background-imageに設定してしまうと、要素の style 属性に background-imageプロパティが設定されないという事。

nonstyle.png

↑ style 属性が空なので、style 属性ごとごっそり削除されている。

解決策

  • 画像 URL に ()を使わない
  • RFC3986 準拠( ! ' ( ) *も対象)の encodeURIを自分で定義する
fixedEncodeURI.js
functionfixedEncodeURI(str){returnencodeURI(str).replace(/[!'()*]/g,function(c){return'%'+c.charCodeAt(0).toString(16);});}

参考:encodeURIComponent() - JavaScript | MDN

そもそも際どい文字はファイル名として使わないのがベターですが、サービスのユーザーが直接アップロードする形式のアプリなんかだとファイル名そのままにしちゃってること多いですよね。
何かの助けになれば幸いです。

$Thank$ $you.$


Viewing all articles
Browse latest Browse all 8647

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>