url()の値を引用することは本当に必要ですか?


235

スタイルシートで次のどれを使用すればよいですか?

/* Example #1: */ background-image: url(image.png);
/* Example #2: */ background-image: url("image.png");
/* Example #3: */ background-image: url('image.png');

W3Cは正しい方法として何を指定していますか?


回答:


243

W3Cは、引用はオプションであり、3つの方法はすべて合法であると述べています。

引用符の開始と終了は同じ文字である必要があります。

URLに特殊文字が含まれている場合は、引用符を使用するか、文字をエスケープする必要があります(以下を参照)。

構文と基本的なデータ型

URI値の形式は、「url(」、オプションの空白、オプションの単一引用符( ')または二重引用符( ")文字、URI自体の順に続き、その後にオプションの単一引用符(')または二重引用符が続きます。 ( ")文字の後にオプションの空白が続き、その後に ')'が続きます。2つの引用文字は同じでなければなりません。

特殊文字のエスケープ:

括弧、空白文字、一重引用符( ')、二重引用符( ")など、引用符で囲まれていないURIに表示される一部の文字は、結果のURI値がURIトークンになるように円記号でエスケープする必要があります:' \( '、 '\)'。


9
一部の古いブラウザでは、引用符で囲まれたURL、つまりIE Macで問題が発生する場合があります。
mveerman

5
bic72が言ったことに加えて、一部の古いブラウザーは、CSSで引用符で囲まれたURLに直面したときに二重の要求も行います。最初に「myfile.png」を要求し、次にmyfile.pngを要求します。そのため、それらを使用しないようにします。
Pebbl 2012年

FWIWリンク先の仕様は、2番目の見積もりを投稿してから書き直されているようです。現在、コンマはエスケープする必要がないようです。
Ben

@pebbl-そうです、古いブラウザにはMac上のChromeの最新バージョンが含まれています
Daniel Beardsley 2013

7
CSS 3の最新の編集者草案(2015年5月)、それ以上の引用符を許可していないようです:dev.w3.org/csswg/css-syntax(チェックurl-token鉄道スキーマ)を、現在の勧告候補(2014年2月)を行いながら:w3.org/TRを/ css-syntax-3引用符の代わりにエスケープシーケンスの使用を促進したいと思います
Simon Mourier

34

最新の標準で推奨されており、エッジケースが少ないため、引用符を使用することをお勧めします。

最新の編集者によるCSSの値とモジュールのドラフトレベル3(2015年12月18日)によると

URLはリソースへのポインタであり、で示される機能表記<url>です。aの構文は次のとおり<url>です。
<url> = url( <string> <url-modifier>* )

引用符で囲まれていないバージョンは、従来の理由でのみサポートされていますおり、特別な解析ルール(エスケープシーケンスなど)が必要であるため、扱いにくく、URL修飾子をサポートしていません。

つまり、 url(...)構文は関数表記であり、文字列とurl-modifierをパラメーターとして受け取ります。(文字列トークンを生成する)引用符表記を使用すると、より標準に準拠し、複雑さが軽減されます。

トップの回答における@SimonMourierのコメントは間違っています。なぜなら、彼は間違った仕様を探したからです。このurl-token型は、従来の特別な解析ルールでのみ導入されているため、引用符とは関係ありません。


「引用符で囲まれていないバージョンは、従来の理由でのみサポートされています[..]」ソース?
Semmel

5
drafts.c​​sswg.org/css-values-3/#ref-for-url-value-7「注:従来の引用符なしの<url>構文の特別な解析ルールは、次のことを意味します...」
sodatea

私はそれを読んだが、この部分を見逃していたに違いない-ありがとう!いずれにせよ-非常に貴重なアドバイス。これは受け入れられるべき答えです!
センメル2017

参照されているドキュメントの2020バージョンには、「引用符で囲まれていないバージョンはレガシーの理由でのみサポートされている」とは記載されていないようです。
Jahmic

11

W3 CSS 2.1仕様の内容は次のとおりです。

URI値の形式は、「url(」、オプションの空白、オプションの単一引用符( ')または二重引用符( ")文字、URI自体の順に続き、その後にオプションの単一引用符(')または二重引用符が続きます。 ( ")文字の後にオプションの空白が続き、その後に ')'が続きます。2つの引用文字は同じでなければなりません。

出典:http : //www.w3.org/TR/CSS21/syndata.html#uri

したがって、提案した3つの例はすべて正しいですが、使用する文字が少ないため、結果のCSSファイルが小さくなり、帯域幅の使用量が少なくなるため、最初に選択した例を選択します。

これは重要ではないように思えるかもしれませんが、トラフィックの多いWebサイトは帯域幅と多くのCSSファイルを節約することを好み、その中のURL参照はファイルを小さくするオプションを選択することには意味があります... 利点ないのにそうしないで

注:URLに括弧、コンマ、空白文字、一重引用符、または二重引用符が含まれている場合は、文字をエスケープする必要がある場合があります。これにより、引用符を使用するよりもURLが長くなる可能性があります(エスケープの必要性が少なくなります)。したがって、エスケープのオーバーヘッドによってURLが引用符を使用するよりも長くならない場合にのみ、引用符のないURLでCssファイルを提供することができます(これは非常にまれです)。

しかし、私は人間がこれらのエッジケースを考慮することを期待しません... Cssオプティマイザがこれを処理します...(しかし、実際にcssオプティマイザ:Pを作成している場合は、これらすべてについて知っておく必要があります)


5
なぜこれが反対票を投じたのかわからない。トラフィックの多いサイトでは、このようなアイデアが1年の間に大きな違いを生みます。
Joisey Mike、2011

7
↑疑わしい。CSSごとにいくつのURLがありますか?多すぎない程度に。そして、あなたはそれぞれに2バイト(ASCIIまたはUTF-8で)を節約しました。さらに、バックスラッシュを使用する必要がある場合があるため、実際にはURLを長くすることができます。Webのサイズを小さくする方法は他にもたくさんあります...
kralyk

1
明らかにそれは多くの節約ではありませんが、アンドレアとジョイジーはまだ正しいです。極端な例として、Googleはホームページから1バイトを削除するだけでかなりの帯域幅を節約できます;)
Pebbl

2
@kralyk ...したがって、不要な場合は引用符を使用しないのが最善です...したがって、2つ以上の括弧、コンマ、空白文字、一重引用符または二重引用符を含むURLがある場合は引用符を使用することをお勧めします。しかし、Cssファイルで遭遇したことはありません...そして、私は絶対にないと確信しています:)(回答を更新しました)
Andrea Zilio

18
ソースコードから個々の文字を最適化することに関心を持つプログラマーは、ボートを完全に見逃しています-何も最適化することはほとんどありません。とにかく、私はいつも二重引用符を使います。私は一貫性のある人です。
ChaseMoskal 2013

6

W3Cによれば、3つの方法が合法です。名前に特殊文字が含まれている場合(スペースとして)、2番目または3番目を使用する必要があります。


3

例2または3が最適です。

W3Cから: URI値の形式は、 'url('、オプションの空白、オプションの単一引用符( ')、または二重引用符( ")文字、URI自体、オプションの単一引用符(')の順になります。または、二重引用符( ")文字の後にオプションの空白が続き、その後に ')'が続きます。2つの引用文字は同じでなければなりません。

同じ説明から、適切な文字がエスケープされていれば、例1でも問題ありません。


1

私が持っていた:

a.pic{
    background-image: url(images/img (1).jpg);
}

ファイル名の閉じ括弧が規則に違反していることを理解するのにしばらく時間がかかりました。

したがって、これは必須ではありませんが、引用が古いブラウザであまりよく理解されていなくても、かなり複雑な動的に生成されたページでいくつかの頭痛を軽減できます。


0

Google CSSコーディングスタイルによると

URI値には引用符を使用しないでください(url())。

例外:@charsetルールを使用する必要がある場合は、二重引用符を使用してください。単一引用符は使用できません。


2
@DávidHorváth:私はあなたが間違っていると言っているわけではありませんが、悪い慣習とはどういう意味ですか?
Sam Dutton
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.