メディアクエリを使用して、要素のサイズに基づいて要素のサイズを変更したいと思いますdiv
。画面サイズはdiv
、Webページ内のウィジェットのように使用され、サイズが異なる可能性があるため、使用できません。
アップデート
現在、これについて作業が行われているようです: https ://github.com/ResponsiveImagesCG/cq-demos
メディアクエリを使用して、要素のサイズに基づいて要素のサイズを変更したいと思いますdiv
。画面サイズはdiv
、Webページ内のウィジェットのように使用され、サイズが異なる可能性があるため、使用できません。
現在、これについて作業が行われているようです: https ://github.com/ResponsiveImagesCG/cq-demos
CSSワーキンググループは、提案、概念実証、ディスカッション、およびより広範なWeb開発者コミュニティによるその他の貢献により、10年近くの作業を経て、コンテナクエリを将来のエディションに書き込むために必要な基礎を最終的に築きました。 CSS封じ込め仕様!このような機能がどのように機能し、使用されるかについての詳細は、ミリアム・スザンヌの詳細な 説明をご覧ください。
うまくいけば、そのようなシステムの堅牢なクロスブラウザ実装が見られるまで、それほど長くはかからないでしょう。大変な待ち時間でしたが、循環依存や無限ループ、またはあなたが持っているもののために、CSSの克服できない制限として受け入れなければならないものではなくなったことを嬉しく思います(これらはまだいくつかの側面で潜在的な問題です提案された設計ですが、CSSWGが道を見つけると信じています)。
メディアクエリは、ページ内の要素に基づいて機能するようには設計されていません。これらは、デバイスまたはメディアタイプに基づいて機能するように設計されています(したがって、メディアクエリと呼ばれる理由)。width
、、height
およびその他の寸法ベースのメディア機能はすべて、画面ベースのメディアのビューポートまたはデバイスの画面のいずれかの寸法を参照します。ページ上の特定の要素を参照するために使用することはできません。
ページ上の特定の要素のサイズに応じてスタイルを適用する必要がある場合は、メディアクエリの代わりにdiv
、JavaScriptを使用してその要素のサイズの変化を監視する必要があります。div
または、フレックスボックスなどのこの回答の最初の公開以降に導入された最新のレイアウト手法や、カスタムプロパティなどの標準を使用すると、メディアや要素のクエリは必要ない場合があります。Djaveが例を示しています。
この目標を達成するために、JavaScriptシムを作成しました。必要に応じて確認してください。これは概念実証ですが、注意が必要です。これは初期バージョンであり、まだいくつかの作業が必要です。
iframe内のメディアクエリは、要素クエリとして機能できます。私はこれをうまく実装しました。このアイデアは、Zurbによるレスポンシブ広告に関する最近の投稿から生まれました。Javascriptはありません!
レイアウトの観点からは、最新の技術を使用することが可能です。
ヘイドンピカリングによって構成されています(私は信じています)。彼はここでプロセスを詳しく説明します:http ://www.heydonworks.com/article/the-flexbox-holy-albatross
Chris Coyierがそれをピックアップし、ここでデモを実行します:https ://css-tricks.com/putting-the-flexbox-albatross-to-real-use/
a
問題を言い換えると、以下に同じコンポーネントが3つあり、それぞれが、、b
およびのラベルが付いた3つのオレンジ色のdivで構成されていc
ます。
次の2つのブロックは、水平方向の部屋に制限されているため、垂直方向に表示されますが、上部のコンポーネント3ブロックは水平方向に配置されます。
flex-basis
CSSプロパティとCSS変数を使用してこの効果を作成します。
.panel{
display: flex;
flex-wrap: wrap;
border: 1px solid #f00;
$breakpoint: 600px;
--multiplier: calc( #{$breakpoint} - 100%);
.element{
min-width: 33%;
max-width: 100%;
flex-grow: 1;
flex-basis: calc( var(--multiplier) * 999 );
}
}
Heydonの記事は1000語で詳細に説明されているので、読むことを強くお勧めします。
他の回答で述べたように、コンテナクエリが来ています。それには完全な仕様があり、その使用法はMDNで詳しく説明されています。
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries
そして、まだそれをサポートしていないブラウザを高速化するためのポリフィルがあります:
https://github.com/GoogleChromeLabs/container-query-polyfill
ここにそれの素敵な小さな概要ビデオがあります:
@BoltClockが受け入れられた回答に書いたように、これは現在CSSだけでは不可能ですが、JavaScriptを使用することで回避できます。
この種の問題を解決するために、コンテナクエリ(別名要素クエリ)prolyfillを作成しました。他のスクリプトとは少し動作が異なるため、要素のHTMLコードを編集する必要はありません。あなたがしなければならないのは、スクリプトを含めて、CSSで次のように使用することです。
.element:container(width > 99px) {
/* If its container is at least 100px wide */
}
私は数年前に同じ問題に遭遇し、私の仕事に役立つプラグインの開発に資金を提供しました。プラグインをオープンソースとしてリリースしたので、他の人もプラグインの恩恵を受けることができます。Githubでプラグインを入手できます:https ://github.com/eqcss/eqcss
ページ上の要素について知ることができることに基づいて、さまざまなレスポンシブスタイルを適用する方法がいくつかあります。EQCSSプラグインでCSSに記述できる要素クエリを次に示します。
@element 'div' and (condition) {
$this {
/* Do something to the 'div' that meets the condition */
}
.other {
/* Also apply this CSS to .other when 'div' meets this condition */
}
}
では、EQCSSを使用したレスポンシブスタイルではどのような条件がサポートされていますか?
px
%
px
%
px
%
px
%
EQCSS要素クエリ内では、スタイルをより具体的に適用できる3つの特別なセレクターを使用することもできます。
$this
(クエリに一致する要素)$parent
(クエリに一致する要素の親要素)$root
(ドキュメントのルート要素、<html>
)要素クエリを使用すると、個別にレスポンシブなデザインモジュールからレイアウトを構成できます。各モジュールには、ページでの表示方法についての「自己認識」が少しあります。
EQCSSを使用すると、1つのウィジェットを幅150ピクセルから幅1000ピクセルまで見栄えよくするように設計できます。その後、任意のテンプレート(任意のサイト)を使用して、そのウィジェットを任意のページの任意のサイドバーに自信を持ってドロップできます。
質問は非常にあいまいです。BoltClockが言うように、メディアクエリはデバイスのサイズしか知りません。ただし、メディアクエリをディセンダーセレクターと組み合わせて使用して、調整を実行できます。
.wide_container { width: 50em }
.narrow_container { width: 20em }
.my_element { border: 1px solid }
@media (max-width: 30em) {
.wide_container .my_element {
color: blue;
}
.narrow_container .my_element {
color: red;
}
}
@media (max-width: 50em) {
.wide_container .my_element {
color: orange;
}
.narrow_container .my_element {
color: green;
}
}
他の唯一の解決策はJSを必要とします。
純粋にcssを使用して目的を達成できると私が考える唯一の方法は、ウィジェットに流動的なコンテナーを使用することです。コンテナの幅が画面のパーセンテージである場合は、メディアクエリを使用して、コンテナの幅に応じてスタイルを設定できます。これで、各画面のサイズについて、コンテナのサイズがわかります。たとえば、コンテナの画面幅を50%にすることにしたとします。次に、画面幅が1200ピクセルの場合、コンテナが600ピクセルであることがわかります。
.myContainer {
width: 50%;
}
/* you know know that your container is 600px
* so you style accordingly
*/
@media (max-width: 1200px) {
/* your css for 600px container */
}
メディアクエリについても考えていましたが、次のことがわかりました。
次のよう<div>
に、のパーセンテージ値を使用してラッパーを作成するだけです。padding-bottom
div {
width: 100%;
padding-bottom: 75%;
background:gold; /** <-- For the demo **/
}
<div></div>
その結果、<div>
高さはコンテナの幅の75%に等しくなります(アスペクト比4:3)。
この手法は、メディアクエリや、ページレイアウトに関するアドホックな知識と組み合わせて、さらにきめ細かい制御を行うこともできます。
私のニーズにはそれで十分です。これはあなたのニーズにも十分かもしれません。
ResizeObserverAPIを使用できます。それはまだ初期の段階であるため、まだすべてのブラウザーでサポートされているわけではありません(ただし、それを支援できるいくつかのポリフィルがあります)。
このAPIを使用すると、DOM要素のサイズを変更するときにイベントリスナーをアタッチできます。
私の場合、divの最大幅を設定することでそれを行いました。したがって、小さいウィジェットの場合は影響を受けず、大きいウィジェットはmax-widthスタイルのためにサイズ変更されます。
// assuming your widget class is "widget"
.widget {
max-width: 100%;
height: auto;
}