🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Sass

Sassは、プログラミング風のコードでCSSを生成できるスタイルシート言語です。 scss ファイルを、変換(コンパイル)してCSSファイルを作成します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1673閲覧

メディアクエリを用いてsassの変数を画面幅ごとに変更してレイアウトを制御したい

Silky

総合スコア34

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Sass

Sassは、プログラミング風のコードでCSSを生成できるスタイルシート言語です。 scss ファイルを、変換(コンパイル)してCSSファイルを作成します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2019/09/25 15:57

編集2019/09/25 16:08

メディアクエリを用いてsassの変数を画面幅ごとに変更してレイアウトを制御したいです。
下記の図のように、画面幅ごとに、下記を変更します。

*1行に表示されるアイテムの数
*アイテム間の幅

イメージ説明

上記を実現するため、2点質問があります。

①メディアクエリを用いてsassの変数を、画面幅ごとに変更したいです。
下記のようにやってみたのですが、うまくいきません。
(※メディアクエリにはmixinを使用しています。全体的なソースは下にあります。)
メディアクエリを用いてsassの変数を、画面幅ごとに変更する方法はありますか?

  &__item { //item同士のmargin横の幅 $mw-item: 30px; //1行当たりのitemの個数 $item-num: 3; //①メディアクエリによって上記の変数の値を変更したい------------------- @include tab { $mw-item: 15px; $item-num: 2; } @include sp { $mw-item: 10px; $item-num: 1; } //calc(100%/1行当たりの個数 - (item同士margin幅 * 1行当たりの個数-1) / 1行当たりの個数 flex-basis: calc(100% / #{$item-num} - #{$mw-item} * (#{$item-num} - 1) / #{$item-num}); margin: 0 $mw-item 20px 0;

②また、nth-child()の括弧内にも変数を用いて、下記のようにしたいです
$item-num=3なら、3n
$item-num=2なら、2n
nth-child($item-num*n)は試したのですが、出来ませんでした。

//② 下記のように直接書くのではなく、$item-num(1行当たりのitemの個数)を用いて記述したい------------------- // $item-num * n...のような感じ。。。 &:nth-child(3n) { margin-right: 0; } // ----------------------------------------------------------------------------

全体的なソースは下記の通りとなります。

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>The Company</title> <link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css"> <link rel="stylesheet" href="css/styles.css"> </head> <body> <div class="wrapper"> <section class="card section" id="card"> <div class="card__inner inner"> <ul class="card__lists"> <li class="card__item"> <img src="img/card_img01.jpg" alt="" class="card__item-img"> <p class="card__item-ttl">タイトルタイトル</p> <p class="card__item-txt">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p> </li> <li class="card__item"> <img src="img/card_img01.jpg" alt="" class="card__item-img"> <p class="card__item-ttl">タイトルタイトル</p> <p class="card__item-txt">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p> </li> <li class="card__item"> <img src="img/card_img01.jpg" alt="" class="card__item-img"> <p class="card__item-ttl">タイトルタイトル</p> <p class="card__item-txt">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p> </li> <li class="card__item"> <img src="img/card_img01.jpg" alt="" class="card__item-img"> <p class="card__item-ttl">タイトルタイトル</p> <p class="card__item-txt">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p> </li> <li class="card__item"> <img src="img/card_img01.jpg" alt="" class="card__item-img"> <p class="card__item-ttl">タイトルタイトル</p> <p class="card__item-txt">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p> </li> <li class="card__item"> <img src="img/card_img01.jpg" alt="" class="card__item-img"> <p class="card__item-ttl">タイトルタイトル</p> <p class="card__item-txt">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p> </li><!-- card__item --> </ul><!-- card__lists --> </div><!-- card__inner --> </section><!-- card --> </div><!-- wrapper --> </body> </html>

CSSについては、2種類貼っておきます。
(※ソースは長くなってしまいましたが、見ていただきたい部分は「card」の部分のみとなります。)

★標題の通りsassの変数を使用しようと試みたversion(うまくいってません)

//----------------------------------------------------- // 変数 //----------------------------------------------------- $c-section: #efefef; $w-pc: 1086px; // PC $w-tab: $w-pc - 1; // タブレット $w-sp: 767px; // スマホ //----------------------------------------------------- // mixin //----------------------------------------------------- @mixin pc { @media (min-width: ($w-pc)) { @content; } } @mixin tab { @media (max-width: ($w-tab)) { @content; } } @mixin sp { @media (max-width: ($w-sp)) { @content; } } //----------------------------------------------------- // 共通 //----------------------------------------------------- html { font-size: 62.5%; } body { font-size: 1.4rem; font-family: "Yu Gothic Medium", "游ゴシック Medium", YuGothic, "游ゴシック体", "ヒラギノ角ゴ Pro W3", "メイリオ", sans-serif; background-color: $c-section; color: #333333; } li { list-style: none; } a { text-decoration: none; } .wrapper { overflow: hidden; } .inner { margin: 0 auto; max-width: 100%; padding: 0 15px; width: $w-pc; @include pc { padding: 0; } } //----------------------------------------------------- // ★ card (!質問該当セクションはここです!) ★ //----------------------------------------------------- .card { &__lists { display: flex; flex-wrap: wrap; } &__item { //item同士のmargin横の幅 $mw-item: 30px; //1行当たりのitemの個数 $item-num: 3; //①メディアクエリによって上記の変数の値を変更したい------------------- @include tab { $mw-item: 15px; $item-num: 2; } @include sp { $mw-item: 10px; $item-num: 1; } //calc(100%/1行当たりの個数 - (item同士margin幅 * 1行当たりの個数-1) / 1行当たりの個数 flex-basis: calc(100% / #{$item-num} - #{$mw-item} * (#{$item-num} - 1) / #{$item-num}); margin: 0 $mw-item 20px 0; // ---------------------------------------------------------------- padding: 16px 16px 28px; background-color: white; border-radius: 4px; //② 下記のように直接書くのではなく、$item-num(1行当たりのitemの個数)を用いて記述したい------------------- // $item-num * n...のような感じ。。。 &:nth-child(3n) { margin-right: 0; } // ---------------------------------------------------------------------------- &-img { width: 100%; } &-ttl { font-size: 2rem; font-weight: bold; margin: 26px 0 20px; } &-txt { font-size: 1.6rem; font-weight: bold; line-height: 1.5; } } }

★sassの変数を使用しなかったversion(正常に動きます)

//----------------------------------------------------- // 変数 //----------------------------------------------------- $c-section: #efefef; $w-pc: 1086px; // PC $w-tab: $w-pc - 1; // タブレット $w-sp: 767px; // スマホ //----------------------------------------------------- // mixin //----------------------------------------------------- @mixin pc { @media (min-width: ($w-pc)) { @content; } } @mixin tab { @media (max-width: ($w-tab)) { @content; } } @mixin sp { @media (max-width: ($w-sp)) { @content; } } //----------------------------------------------------- // 共通 //----------------------------------------------------- html { font-size: 62.5%; } body { font-size: 1.4rem; font-family: "Yu Gothic Medium", "游ゴシック Medium", YuGothic, "游ゴシック体", "ヒラギノ角ゴ Pro W3", "メイリオ", sans-serif; background-color: $c-section; color: #333333; } li { list-style: none; } a { text-decoration: none; } .wrapper { overflow: hidden; } .inner { margin: 0 auto; max-width: 100%; padding: 0 15px; width: $w-pc; @include pc { padding: 0; } } //----------------------------------------------------- // ★ card (!質問該当セクションはここです!) ★ //----------------------------------------------------- .card { &__lists { display: flex; flex-wrap: wrap; } &__item { // ①の部分---------------------------------------------- flex-basis: calc(100% / 3 - 30px * (3 - 1) / 3); margin: 0 30px 20px 0; @include tab { flex-basis: calc(100% / 2 - 20px * (2 - 1) / 2); margin: 0 20px 20px 0; } @include sp { flex-basis: calc(100% / 1 - 20px * (1 - 1) / 1); margin: 0 0 40px 0; } // ---------------------------------------------------------------- padding: 16px 16px 28px; background-color: white; border-radius: 4px; // ②の部分---------------------------------------------------------------- @include pc { &:nth-child(3n) { margin-right: 0; } } @include tab { &:nth-child(2n) { margin-right: 0; } } // ---------------------------------------------------------------- &-img { width: 100%; } &-ttl { font-size: 2rem; font-weight: bold; margin: 26px 0 20px; } &-txt { font-size: 1.6rem; font-weight: bold; line-height: 1.5; } } }

長くなって申し訳ありませんが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

x_x

2019/09/26 09:12

Sass が CSS を書き出すための仕組みに過ぎず、端末がアクセスする前に完了していることは理解しているでしょうか?
Silky

2019/09/26 11:18

コメントありがとうございます! 正直あまり理解できていないです。。。 SASSがコンパイルされてCSSとして書き出された時点は、「端末がアクセスする前」ということですか? 今回の件で、画面幅に応じて変数の値を変えるのはうまくいかないっていう事象はなんとなくわかった(理由は理解していない)んですが、 もし、「端末がアクセスする前」にSASSがCSSに変換されているのであれば、 そもそも変数がどうこうというより、メディアクエリ自体が成り立たないのではないでしょうか? 例えばpcサイズだとwidth:100px、スマホサイズだとwidth:50pxとしても、 SASSがCSSに変換される時点は「端末がアクセスする前」なので、まだ画面幅がわかっていない状態なのではないでしょうか?
Lhankor_Mhy

2019/10/04 10:54

> メディアクエリ自体が成り立たないのではないでしょうか? メディアクエリはCSSの機能なのでコンパイル後にも残りますが、Sassの変数はコンパイル後に消えます。
Silky

2019/10/07 16:12

ご返信遅くなってすみません。 コメントをありがとうございます! なるほど!つまりSASSの変数はコンパイル後に消えるので、幅に合わせて柔軟に変数の値を変えようという考えは不可能ということですね。。 ありがとうございます!
guest

回答1

0

自己解決

SassはCSSを書き出すための仕組みに過ぎず、端末がアクセスする前に完了している。

つまり、Sassの変数はコンパイル後に消えるので、ブラウザ幅に合わせてsassの変数の値を変えるということはできないことが分かりました。
解決とさせていただきます。

ありがとうございました。

投稿2019/10/07 16:14

Silky

総合スコア34

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問