レスポンシブでのメディアクエリを考えるとき、いつもこれという感じがしなかったのですが、モバイルからPCへと共通のデザインが多いときに限り、納得のいくスマートな記述ができました。
というわけで、今回は入力フォームを例にモバイルファーストでレスポンシブ+フレキシブルレイアウトの表示を行ってみます。
html
わかりやすくするためにヘッダーとフッターを記述しました。また、dlとtableで同じ内容の入力を記述しています。
<header> ヘッダー </header> <div class="form"> <dl> <dt> お名前 </dt> <dd> <input type="text" id="name" name="name" class="w100pc"> </dd> </dl> <table> <tbody> <tr> <th>お名前</th> <td><input type="text" id="t-name" name="t-name" class="w100pc"></td> </tr> </tbody> </table> </div> <footer> フッター </footer>
css
モバイルファーストでSPのスタイルを先に記述し、PC用のスタイルを「@media screen and (min-width: 321px)」に記述しています。
/* SP ----------------------------------------------------------------- */ dl, dt, dd, ul, li { margin: 0; padding: 0; } input[type="text"], th, td { padding: 5px 10px; box-sizing: border-box; } li { display: inline-block; list-style-type: none; } header, footer { max-width: 1000px; margin: 20px auto; padding: 20px; background: #EFEFEF; } .form { max-width: 1000px; margin: 0 auto; } dl { margin-bottom: 20px; } table { width: 100%; table-layout: fixed; border-top: 1px solid #CCC; border-collapse: collapse; } table th, table td { display: block; width: 100%; text-align: left; box-sizing: border-box; border: 1px solid #CCC; } table th { border-top: none; border-bottom: none; background: #eee; } .w100pc { width: 100%; } /* PC ----------------------------------------------------------------- */ @media screen and (min-width: 321px) { dl { display: flex; justify-content: center; align-items: center; } dl dt { flex: 0 0 75px; } dl dd { flex-grow: 1; } table th, table td { display: table-cell; width: auto; border: 1px solid #CCC; } table th { width: 75px; } }
解説1
header、footer、formに「max-width: 1000px;」で最大の幅を1000pxとし、「margin」の「auto」で内容を中央に表示しています。これはフレキシブルと言われるレイアウトで、最大の幅を決めたレスポンシブ表示を行っています。
header, footer { max-width: 1000px; margin: 20px auto; padding: 20px 0; background: #EFEFEF; } .form { max-width: 1000px; margin: 0 auto; }
解説2
「@media screen and (min-width: 321px)」のメディアクエリで横幅が321px以上をPC側のスタイルと定義し、入力フォームの表示を横にしています。
@media screen and (min-width: 321px) { dl { display: flex; justify-content: center; align-items: center; } dl dt { flex: 0 0 100px; } dl dd { flex-grow: 1; } table th, table td { display: table-cell; width: auto; border: 1px solid #CCC; } table th { width: 100px; } }
サンプル
横幅が321px以上の時に入力フォームの表示を横にしています。また、最大の幅を1000pxとしているのでそれ以上は伸びません。
まとめ
- モバイルファーストはSPのスタイルを先に記述し、メディアクエリでPC用のスタイルを後に記述する。
- フレキシブルレイアウトはmax-widthで最大の幅を決める。
共通するデザインが多いモバイルファーストの場合は、メディアクエリはmin-widthの「以上」と、一方の記述(PC側)だけでよいと思いました。
コメント