質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Sass

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

CSS

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

gulp

gulpは、Node.jsをベースとしたタスク自動化ツールの一つ。ストリームでファイルを処理することが特徴です。CSSプリプロセッサの使用時のコンパイルや、CSS・JavaScriptファイルの圧縮・結合などを自動的に行うことができます。

Q&A

解決済

1回答

3277閲覧

gulpとPostCSSを使って、Sassのメディアクエリをまとめようとしています。小さな画面サイズから大きな画面サイズへと順にメディアクエリを出力したいのですが、順序が崩れてしまいます。

cheshire-cat

総合スコア73

Sass

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

CSS

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

gulp

gulpは、Node.jsをベースとしたタスク自動化ツールの一つ。ストリームでファイルを処理することが特徴です。CSSプリプロセッサの使用時のコンパイルや、CSS・JavaScriptファイルの圧縮・結合などを自動的に行うことができます。

0グッド

0クリップ

投稿2021/07/19 03:35

CSSを記述するときはSassを使っています。そしてメディアクエリを多用しており、今回作ったサイトでは同じ画面サイズのメディアクエリがあちこちに存在する状況になっています。

このメディアクエリを簡潔にするため、gulpとPostCSSを使って同じ画面サイズのメディアクエリを1つにまとめようとしています。

わたしがCSSを記述するときの順序ですが、わたしは基本的にモバイルファーストで作成しています。
つまり最初にスマホ画面のCSSを作成し、その後、メディアクエリで徐々に大画面のCSSを作る方針をとっています。

わたしのサイトで使ったメディアクエリは次の通りです(style.scssファイルに記述します)。

CSS

1// style.scssファイルの記述 2@media (max-width: 374px) {} 3@media (min-width: 768px) {} 4@media (min-width: 992px) {} 5@media (min-width: 1200px) {} 6@media (min-width: 1366px) {}

このCSSから推測できるように、わたしは画面サイズの基準を375pxとしてサイトを作っています。
そのためメディアクエリを設定するときも基本的にmin-widthを使うことになるのですが、小さなスマホ画面に対応するため、例外的に@media (max-width: 374px) {}を使っている個所もあります。

さてこのようにメディアクエリを設定したのですが、最初に書いたようにこれらのメディアクエリはCSSファイルのあちこちに必要に応じて点在しています。
そこでgulpとPostCSSでメディアクエリをまとめたのですが、次のような順で出力されました(style.cssファイルに出力されます)。

CSS

1// style.cssファイルの出力 2@media (min-width: 768px) {} 3@media (min-width: 1366px) {} 4@media (min-width: 992px) {} 5@media (max-width: 374px) {} 6@media (min-width: 1200px) {}

しかしこのような出力順になったため、1366px以上のときの設定が、@media (min-width: 992px) {}や@media (min-width: 1200px) {}によって打ち消されてしまいました。

また@media (max-width: 374px) {}の記述が@media (min-width: 992px) {}と@media (min-width: 1200px) {}の間に挟まれているのも気になります。

今回はこの位置に@media (max-width: 374px) {}がきても影響はなかったのですが、@media (max-width: ●px) {}のサイズやプロパティの設定によってはmin-widthに挟まれるとデザインが崩れる可能性があります。

そのため@media (max-width: ●px) {}と@media (min-width: ●px) {}を併用するにしても、デザインが崩れない順に出力したいと考えています。

今回の場合だと、メディアクエリの出力順を

@media (max-width: 374px) {}
@media (min-width: 768px) {}
@media (min-width: 992px) {}
@media (min-width: 1200px) {}
@media (min-width: 1366px) {}

としたいのですが、どのようにすればいいのでしょうか。
よろしくお願いします。

わたしとしてはてっきりPostCSSを使うと自然に小画面~大画面となるようにメディアクエリが設定されると思っていたのですが、やはりgulpfile.jsの設定が十分ではないということでしょうか。

念のためわたしの使ったpackage.jsonとgulpfile.jsのコードを記載します。

json

1{ 2 "name": "mediaqueryfiles", 3 "version": "1.0.0", 4 "description": "このフォルダは、Sassのメディアクエリをまとめるために作られたフォルダです。", 5 "main": "index.js", 6 "scripts": { 7 "test": "echo \"Error: no test specified\" && exit 1" 8 }, 9 "keywords": [], 10 "author": "", 11 "license": "ISC", 12 "devDependencies": { 13 "autoprefixer": "^10.3.0", 14 "css-declaration-sorter": "^6.0.3", 15 "css-mqpacker": "^7.0.0", 16 "gulp": "^4.0.2", 17 "gulp-postcss": "^9.0.0", 18 "gulp-sass": "^5.0.0", 19 "node-sass": "^6.0.1", 20 "sass": "^1.35.2" 21 } 22}

js

1// gulpプラグインの読み込み 2var gulp = require("gulp"); 3var sass = require('gulp-sass')(require('sass')); 4var postcss = require("gulp-postcss"); 5var mqpacker = require("css-mqpacker"); // メディアクエリをまとめる 6var cssdeclsort = require("css-declaration-sorter"); // プロパティ順の分類 7 8// scssの監視タスクを作成する 9gulp.task("default", function () { 10 // scssファイルを監視 11 return gulp.watch("scss/*.scss", function () { 12 // scssの更新があった場合の処理 13 // scssファイルを取得 14 return ( 15 gulp 16 .src("scss/*.scss") 17 // Sassのコンパイルを実行 18 .pipe( 19 sass({ 20 outputStyle: "expanded", // expandedとして圧縮する 21 }) 22 // Sassのコンパイルエラーを表示 23 // (これがないと自動的に止まってしまう) 24 .on("error", sass.logError) 25 ) 26 // sassの後に指定 27 .pipe(postcss([cssdeclsort({ order: "concentric-css" })])) // concentric-cssでソートする(ボックスモデルの外側からソートする) 28 .pipe(postcss([mqpacker()])) 29 // cssフォルダー以下に保存 30 .pipe(gulp.dest("css")) 31 ); 32 }); 33});

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

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

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

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

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

guest

回答1

0

ベストアンサー

node-css-mqpacker は min-width クエリにおける幾つかの単位でのみソート機能が利用出来ます。もし動作をカスタマイズしたい場合は自身で sort 関数を作成する必要があります。

sort

Currently, this option only supports min-width queries with specific units (ch, em, ex, px, and rem). If you want to do more, you need to create your own sorting function and pass it to this module like this:

しかし今回の場合は、 node-css-mqpacker の拡張に位置する sort-css-media-queries を利用することで質問者さんの実現したい動作が行えます。その結果、使用したディレクトリ構造や各ファイル内容は次のようになります。より詳細な動作は質問者さんでカスタマイズしてみてください。

ディレクトリ構造

./ ├ scss │ └ style.scss ├ gulpfile.js └ package.json

package.json

JSON

1{ 2 "name": "mediaqueryfiles", 3 "version": "1.0.0", 4 "description": "このフォルダは、Sassのメディアクエリをまとめるために作られたフォルダです。", 5 "main": "index.js", 6 "scripts": { 7 "test": "echo \"Error: no test specified\" && exit 1" 8 }, 9 "keywords": [], 10 "author": "", 11 "license": "ISC", 12 "devDependencies": { 13 "autoprefixer": "^10.3.0", 14 "css-declaration-sorter": "^6.0.3", 15 "css-mqpacker": "^7.0.0", 16 "gulp": "^4.0.2", 17 "gulp-postcss": "^9.0.0", 18 "gulp-sass": "^5.0.0", 19 "node-sass": "^6.0.1", 20 "sass": "^1.35.2" 21 }, 22 "dependencies": { 23 "sort-css-media-queries": "^2.0.3" 24 } 25}

gulpfile.js

JavaScript

1var gulp = require("gulp"); 2var sass = require('gulp-sass')(require('sass')); 3var postcss = require("gulp-postcss"); 4var mqpacker = require("css-mqpacker"); // メディアクエリをまとめる 5var sortCSSmq = require("sort-css-media-queries"); 6var cssdeclsort = require("css-declaration-sorter"); // プロパティ順の分類 7 8// scssの監視タスクを作成する 9gulp.task("default", function () { 10 // scssファイルを監視 11 return gulp.watch("scss/*.scss", function () { 12 // scssの更新があった場合の処理 13 // scssファイルを取得 14 return ( 15 gulp 16 .src("scss/*.scss") 17 // Sassのコンパイルを実行 18 .pipe( 19 sass({ 20 outputStyle: "expanded", // expandedとして圧縮する 21 }) 22 // Sassのコンパイルエラーを表示 23 // (これがないと自動的に止まってしまう) 24 .on("error", sass.logError) 25 ) 26 // sassの後に指定 27 .pipe(postcss([cssdeclsort({order: "concentric-css"})])) // concentric-cssでソートする(ボックスモデルの外側からソートする) 28 .pipe(postcss([mqpacker({sort: sortCSSmq.desktopFirst})])) 29 // cssフォルダー以下に保存 30 .pipe(gulp.dest("css")) 31 ); 32 }); 33});

style.scss

SCSS

1@media (min-width: 1366px) { 2 div { 3 height: 1366px; 4 } 5} 6 7@media (min-width: 992px) { 8 div { 9 height: 992px; 10 } 11} 12 13p { 14 color: #abc; 15} 16 17@media (max-width: 374px) { 18 div { 19 h1 { 20 font-weight: lighter; 21 font-size: 30px; 22 } 23 24 width: 374px; 25 } 26} 27 28@media (min-width: 768px) { 29 div { 30 width: 768px; 31 } 32} 33 34@media (min-width: 992px) { 35 div { 36 width: 992px; 37 } 38 39 h1 { 40 font-weight: bold; 41 font-size: 20px; 42 } 43} 44 45h1 { 46 font-weight: inherit; 47 font-size: 50px; 48} 49 50@media (min-width: 1200px) { 51 div { 52 width: 1200px; 53 } 54} 55 56@media (min-width: 768px) { 57 div { 58 height: 768px; 59 min-height: 450px; 60 } 61} 62 63@media (min-width: 1366px) { 64 h2 { 65 color: red; 66 } 67 div { 68 width: 1366px; 69 } 70} 71 72@media (max-width: 374px) { 73 div { 74 height: 374px; 75 } 76} 77 78@media (min-width: 1200px) { 79 div { 80 height: 1200px; 81 } 82}

style.css(出力)

CSS

1p { 2 color: #abc; 3} 4h1 { 5 font-weight: inherit; 6 font-size: 50px; 7} 8@media (max-width: 374px) { 9 div { 10 width: 374px; 11 } 12 div h1 { 13 font-weight: lighter; 14 font-size: 30px; 15 } 16 div { 17 height: 374px; 18 } 19} 20@media (min-width: 768px) { 21 div { 22 width: 768px; 23 } 24 div { 25 height: 768px; 26 min-height: 450px; 27 } 28} 29@media (min-width: 992px) { 30 div { 31 height: 992px; 32 } 33 div { 34 width: 992px; 35 } 36 37 h1 { 38 font-weight: bold; 39 font-size: 20px; 40 } 41} 42@media (min-width: 1200px) { 43 div { 44 width: 1200px; 45 } 46 div { 47 height: 1200px; 48 } 49} 50@media (min-width: 1366px) { 51 div { 52 height: 1366px; 53 } 54 h2 { 55 color: red; 56 } 57 58 div { 59 width: 1366px; 60 } 61}

投稿2021/07/20 06:04

s8_chu

総合スコア14731

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

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

cheshire-cat

2021/07/26 11:13

ありがとうございました。Sassのソートが分からず、悩んでいました。自分なりに改良して使ってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問