メディアクエリを使用して、div
要素が含まれている要素のサイズに基づいて要素のサイズを変更したいと思います。画面サイズdiv
は、Webページ内のウィジェットのように使用されるだけで、サイズが異なるため、使用できません。
更新
これで現在行われている作業があるようです:https : //github.com/ResponsiveImagesCG/cq-demos
メディアクエリを使用して、div
要素が含まれている要素のサイズに基づいて要素のサイズを変更したいと思います。画面サイズdiv
は、Webページ内のウィジェットのように使用されるだけで、サイズが異なるため、使用できません。
これで現在行われている作業があるようです:https : //github.com/ResponsiveImagesCG/cq-demos
回答:
いいえ、メディアクエリは、ページ内の要素に基づいて機能するようには設計されていません。これらは、デバイスまたはメディアタイプに基づいて機能するように設計されています(そのため、これらはメディアクエリと呼ばれています)。width
、height
、および他の寸法ベースのメディアは、すべての画面ベースのメディアにおけるビューポートまたはデバイスの画面のいずれかの寸法を指しています。ページ上の特定の要素を参照するために使用することはできません。
div
ページ上の特定の要素のサイズに応じてスタイルを適用する必要がある場合div
は、メディアクエリではなく、JavaScriptを使用してその要素のサイズの変化を観察する必要があります。
@element
クエリが必要です。W3Cはのための韻/理由にいくつかの良いドキュメントがある@media
クエリを:w3.org/TR/css3-mediaqueries/#width(このリンクは幅を議論するセクションに移動します---メディアタイプの幅ではなく、内に含まれる要素)
この目標を達成するために、JavaScriptシムを作成しました。必要に応じて確認してください。これは概念実証ですが、注意してください。これは初期のバージョンであり、まだいくつかの作業が必要です。
min-width
属性の更新が必要な要素。min-width
更新が可能なcss-classリスト、マークされた要素を手動で書き込む必要がありますか?
これは、@ BoltClockが受け入れられた回答に書き込んだため、CSSだけでは現在不可能ですが、JavaScriptを使用して回避できます。
この種の問題を解決するために、コンテナークエリ(別名要素クエリ)を作成しました。他のスクリプトとは少し異なりますので、要素の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つのウィジェットを150px幅から1000px幅まで見栄えよくデザインできます。その後、任意のテンプレート(任意のサイト)を使用して、任意のページの任意のサイドバーにそのウィジェットを確実にドロップできます。
レイアウトの観点からは、最新のテクニックを使用することが可能です。
Heydon Pickeringによって作成された(私は信じています)。彼はここでプロセスを詳しく説明します:http : //www.heydonworks.com/article/the-flexbox-holy-albatross
Chris Coyierがそれをピックアップし、ここでデモを行います:https ://css-tricks.com/putting-the-flexbox-albatross-to-real-use/
問題を説明し直すと、同じコンポーネントが3つ表示されa
、それぞれがb
とのラベルが付いた3つのオレンジのdivで構成されていc
ます。
2番目の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語で詳細に説明されているので、読むことを強くお勧めします。
質問は非常にあいまいです。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%にするとします。次に、画面幅が1200pxの場合、コンテナは600pxであることがわかります
.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)になります。
この手法は、さらに詳細な制御のために、メディアクエリやページレイアウトに関するちょっとした特別な知識と組み合わせることができます。
それは私のニーズには十分です。あなたのニーズにもこれで十分かもしれません。
ResizeObserver API を使用できます。それはまだ初期の段階なので、まだすべてのブラウザーでサポートされていません(しかし、それを支援するいくつかのポリフィルがあります)。
基本的に、このAPIでは、DOM要素のサイズ変更にイベントリスナーをアタッチできます。
私の場合、divの最大幅を設定することでそれを行いました。したがって、小さいウィジェットの場合は影響を受けず、大きいウィジェットはmax-widthスタイルのためにサイズ変更されます。
// assuming your widget class is "widget"
.widget {
max-width: 100%;
height: auto;
}
.widget
ウィジェットのdivのクラスとしての単なるサンプルです。