CSS @mediaルールをインラインで配置することは可能ですか?


293

バナー画像をHTML5アプリに動的に読み込む必要があり、画面の幅に合わせていくつかの異なるバージョンが必要です。電話の画面幅を正確に決定できないため、これを行うには、divの背景画像を追加し、@ mediaを使用して画面幅を決定し、正しい画像を表示するしかありません。

例えば:

 <span style="background-image:particular_ad.png; @media (max-width:300px){background-image:particular_ad_small.png;}"></span>

これは可能ですか、それとも誰か他の提案がありますか?


3
答えに失望しましたか?このコメントを参照してください。役立つかもしれません。
rinogo 2018

回答:


284

いいえ、@mediaルールとメディアクエリはproperty: value宣言しか含めることができないため、インラインスタイル属性には存在できません。スペックプットこと:

style属性の値は、CSS 宣言ブロックのコンテンツの構文と一致する必要があります

特定のメディアでのみ要素にスタイルを適用する唯一の方法は、スタイルシートに別のルールを使用することです。つまり、そのためのセレクターを用意する必要があります。

ダミーのspanセレクターは次のようになりますが、非常に具体的な要素をターゲットにしている場合は、より具体的なセレクターが必要になります。

span { background-image: url(particular_ad.png); }

@media (max-width: 300px) {
    span { background-image: url(particular_ad_small.png); }
}

70
<style>HTMLにタグを挿入することもできます。これは、background-imageがデータベースから動的にプルされる場合に必要なアプローチです。明らかに、外部スタイルシートでは、そのための適切な場所ではありません。
Jake Wilson

1
@Jakobud:ええ、スタイルシートがどこにあるかは問題ではありませんが、重要なのは、インラインスタイル属性ではなく、CSSでのみこれを実行できることです。
BoltClock

3
<script>メールが転送されるときにタグがメールクライアントによって削除されることが多いため、人々はメールにインラインスタイルを使用する傾向があることを将来の探検家に注意してください。これは、メディアクエリがないことを意味します。私は現在、この状況のベストプラクティスを探していますが、友好的な意見にすぎません。
TCannadySF 2016年

3
max-widthはem、ではなくsで設定してくださいpx。そうすれば、ズームしたときにもうまく機能します。
Silas S. Brown

2
@Silas S. Brown:それは私の問題ではありません。私は質問で使用されているものを反映しています。
BoltClock

137

問題

いいえ、メディアクエリはこの方法では使用できません

<span style="@media (...) { ... }"></span>

解決

ただし、オンザフライで応答可能な特定の動作を提供したい場合styleは、属性ではなくマークアップを使用できます。

えい

<style scoped>
.on-the-fly-behavior {
    background-image: url('particular_ad.png'); 
}
@media (max-width: 300px) {
    .on-the-fly-behavior {
        background-image: url('particular_ad_small.png');
    }
}
</style>
<span class="on-the-fly-behavior"></span>

CodePenで動作しているコードを確認する

たとえば私のブログでは<style><head>直後にマークアップを挿入します<link>、CSSの宣言のます。これには、実際のコンテンツのtextareaの横に提供されるtextareaのコンテンツが含まれており、artitleを書き込んだときにその場で追加のクラスを作成します。

注:scoped属性はHTML5仕様の一部です。あなたがそれを使用しない場合、バリデーターはあなたを非難しますが、ブラウザーは現在、実際の目的をサポートしていません:スコープのコンテンツ<style>すぐに親要素とその要素の子要素のみ。<style>要素が<head>マークアップ内にある場合、スコープは必須ではありません。


更新:私は常にモバイルの最初の方法でルールを使用することをお勧めしますので、以前のコードは次のようになります:

<style scoped>
/* 0 to 299 */
.on-the-fly-behavior {
    background-image: url('particular_ad_small.png'); 
}
/* 300 to X */
@media (min-width: 300px) { /* or 301 if you want really the same as previously.  */
    .on-the-fly-behavior {   
        background-image: url('particular_ad.png');
    }
}
</style>
<span class="on-the-fly-behavior"></span>

10
これはbackground-image、ページの読み込み時に動的にを変更できるため、承認された回答よりも優れた回答です。
Jake Wilson

7
スコープは原則的にすばらしいように見えますが、Chromeはいくつかのバージョンで予備サポートを削除し、Firefoxのみがサポートを提供しています。
Anthony McLin 2015

1
Scopedは、使用できないようにする.on-the-fly-behaviorために使用されていますが、ナビゲーターによって単語が「無視」されている場合は問題ありません。<style>は、すべてのナビゲーターの<body>で使用できます。これは単なるw3c検証要件です。
Bruno Lesieur 2015年

4
けれどもは、scopedそれが正式に任意のブラウザでサポートされていない華麗なソリューションです。うまくいけば、すぐに変わるでしょう。
ケンシャープ

1
これは別の質問です。電子メールの主な目的はクライアント電子メールによる読み取りであり、多くのクライアント電子メールは埋め込み<style>media queriesまたはすべてのHTML / CSS機能をサポートしていないためです。したがって、実際には問題はそれよりも大きなものです。すべてのクライアントメール(Gmailを含む)で同じように表示されるメールをHTML4とCSS2機能のみ(Outlookの一部のハックを使用)で作成できることを知っていますが、この場合のメディアクエリはありません。
Bruno Lesieur 2016年

15

インラインスタイルには現在、宣言(property: valueペア)以外のものを含めることはできません。

ドキュメントのセクションで、style適切なmedia属性を持つ要素を使用できheadます。


13

はい。画像タグを使用している場合は、メディアクエリをinline-cssで記述できます。異なるデバイスサイズでは、異なる画像を取得できます。

<picture>
    <source media="(min-width: 650px)" srcset="img_pink_flowers.jpg">
    <source media="(min-width: 465px)" srcset="img_white_flower.jpg">
    <img src="img_orange_flowers.jpg" alt="Flowers" style="width:auto;">
</picture>

これはCSS background-image:url()には適用されません
Jonas Eberle

10

あなたが使用している場合は、ブートストラップ応答ユーティリティまたはブレークポイントに応じて表示/非表示のdiv要素にできます同様の代替を、いくつかの要素を使用して、最も適切なを表示することも可能です。すなわち

 <span class="hidden-xs" style="background: url(particular_ad.png)"></span>
 <span class="visible-xs" style="background: url(particular_ad_small.png)"></span>

3
美しい回避策-メディアクエリに基づいてdivを非表示、divを表示-唯一の欠点は、両方の画像を引き続き読み込むため、両方をクライアントに送信することです。
マイケルC.ゲイツ

4
重複したコンテンツは、メンテナンスやSEOには適していません。
Bruno Lesieur

1
残念ながら、これは偽の友達です!私もこのソリューションについて考えましたが、小さなデバイスに提供し、ダウンロードするためにバイトを節約するために、より小さな画像が必要です。この技術は正反対ん
A. D'アルフォンソ

8

現在、スタイル属性のメディアクエリは使用できません。ただし、JavaScriptを使用して動的に設定する必要がある場合。JSを介してそのルールを挿入することもできます。

document.styleSheets[0].insertRule("@media only screen and (max-width : 300px) { span { background-image:particular_ad_small.png; } }","");

これは、スタイルがスタイルシートにあるかのようです。したがって、特異性に注意してください。


それが可能になるときのアイデアはありますか?
SuperUberDuper 2016年

1
そうなるとは思いません。しかし、私はワーキンググループがしているすべてのことを知りません。
Type-Style


7

私はこれをテストしようとしましたが、うまくいかなかったようですが、なぜAppleがそれを使用しているのか興味があります。私はちょうどhttps://linkmaker.itunes.apple.com/us/にいて、「大きなボタン」ラジオボタンを選択した場合に生成されるコードで、インラインメディアクエリを使用していることに気付きました。

<a href="#" 
    target="itunes_store" 
    style="
        display:inline-block;
        overflow:hidden;
        background:url(#.png) no-repeat;
        width:135px;
        height:40px;
        @media only screen{
            background-image:url(#);
        }
"></a>

注:読みやすくするために改行を追加し、元の生成コードを縮小


3
私はなぜ/どのようにAppleがそれも使用しているのか知りたいのです
Douglas.Sesar

1
引用符で囲まれたコードは、指定されたリンクに存在しません(少なくとも私にとっては、米国外にいるため、おそらく別のコンテンツが表示されます)。その上、これは本当に答えという別の質問のように思えます。
Mark Amery 2015年

1
バグレポートを提出しましたが、削除されたと思います。itunesaffiliate.phgsupport.com/hc/en-us/requests/14201
davidcondrey

4

あなたはimage-set()を使うことができます

<div style="
  background-image: url(icon1x.png);
  background-image: -webkit-image-set(  
    url(icon1x.png) 1x,  
    url(icon2x.png) 2x);  
  background-image: image-set(  
    url(icon1x.png) 1x,  
    url(icon2x.png) 2x);">


これは(質問で概説されているように)サイズに基づいて機能しませんが、ズーム係数に基づいて機能するため、27インチ2560x1440画面の小さな画面の画像が得られる場合があります。それはあなたが望むものかもしれません-あるいは多分そうではありません。
JanBühler2017

4

はい、window.matchMediaでJavaScriptを使用できます

  1. 赤いテキスト用のデスクトップ

  2. 緑色のテキスト用のタブレット

  3. 青色のテキスト用のモバイル

//isat_style_media_query_for_desktop_mobile_tablets
var tablets = window.matchMedia("(max-width:  768px)");//for tablet devices
var mobiles = window.matchMedia("(max-width: 480px)");//for mobile devices
var desktops = window.matchMedia("(min-width: 992px)");//for desktop devices



isat_find_device_tablets(tablets);//apply style for tablets
isat_find_device_mobile(mobiles);//apply style for mobiles
isat_find_device_desktops(desktops);//apply style for desktops
// isat_find_device_desktops(desktops,tablets,mobiles);// Call listener function at run time
tablets.addListener(isat_find_device_tablets);//listen untill detect tablet screen size
desktops.addListener(isat_find_device_desktops);//listen untill detect desktop screen size
mobiles.addListener(isat_find_device_mobile);//listen untill detect mobile devices
// desktops.addListener(isat_find_device_desktops);

 // Attach listener function on state changes

function isat_find_device_mobile(mob)
{
  
// isat mobile style here
var daynight=document.getElementById("daynight");
daynight.style.color="blue";

// isat mobile style here

}

function isat_find_device_desktops(des)
{

// isat mobile style here

var daynight=document.getElementById("daynight");
daynight.style.color="red";
 
//  isat mobile style here
}

function isat_find_device_tablets(tab)
{

// isat mobile style here
var daynight=document.getElementById("daynight");
daynight.style.color="green";

//  isat mobile style here
}


//isat_style_media_query_for_desktop_mobile_tablets
    <div id="daynight">tricky style for mobile,desktop and tablet</div>


3

インラインメディアクエリは、SassのBreakpointなどを使用することで可能です。

このブログ投稿は、インラインメディアクエリが個別のブロックよりも管理しやすいことを説明するのに役立ちます。ブレークポイントはありません

インラインメディアクエリに関連するのは、「要素クエリ」のアイデアです。興味深い読み物は次のとおりです。

  1. 要素のメディアクエリに関する考察
  2. メディアクエリはハックです
  3. メディアクエリは答えではありません:要素クエリポリフィル
  4. 他にブロックする場合

1

ルールをprint.cssファイルに追加する場合、@ mediaを使用する必要はありません。

一部の要素に背景色を付けるために使用するスマートなforeachでそれを公開しました。

<script type='text/javascript'>
  document.styleSheets[3].insertRule(" #caldiv_<?smarty $item.calendar_id ?> { border-color:<?smarty $item.color ?> }", 1);
</script>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.