背景
- 雑にコード書いて自分で解説しながらHTMLとCSSとJS少しを勉強する。
モーダルの構造・要件
- 以下3つのレイヤーからなる。
- ウィンドウ
- 背景
- ダイアログ
1. ウィンドウ
- モーダルを開く前に表示されているレイヤー。
- モーダルはこのレイヤーを覆うように表示されることになる。
今回は body
タグがこれに相当する。
2. 背景
- モーダルを開くボタンを押すと、ベースのレイヤーを覆うように表示される薄暗いレイヤー。
- 背景を押すと、モーダルは閉じられる仕様になっていることが多い。
-
overlay
と呼ばれることもある。
今回は .modal
というクラスで表す。
3. ダイアログ
- 背景の上に表示されるレイヤー。
- ここに文章やボタンが表示される。
- 閉じるボタンが併せて表示されていることが多い。
今回は .modal-content
というクラスで表す。
参考リンク
- 【Javascript】Javascript/Cssでモーダルを作ってみた
- Modal (モーダル) - Bootstrap
- Modals - Materialize
-
モーダルとは?モーダルウィンドウの使い方を徹底解説
- 近年ではUXの観点から、モーダルよりもアコーディオンが推奨みたいな話も書いてあるが一旦スルー。
実装と解説
HTML
<body>
<div class="container">
<!-- モーダルを開くボタン -->
<a class="js-modal-open" href="javascript:void(0);">
<span>モーダルを開く</span>
</a>
</div>
<!-- モーダル -->
<div class="modal" id="modal">
<div class="modal-content" id="modal-content">
<button class="modal-content__btn-close js-modal-close" type="button">
<img alt="閉じる" src="icon_close.svg">
</button>
<div class="modal-content__body">
<div>
<p>
これがモーダルの中身の文章です。
</p>
<button class="js-modal-close" type="button">
閉じる
</button>
</div>
</div>
</div>
</div>
</body>
CSS(SCSS)
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
z-index: 11;
width: 100%;
height: 100%;
background-color: rgba(#000, 0.7);
overflow: auto;
}
.modal-content {
position: relative;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 12;
margin: 30px 20px;
&__btn-close {
position: absolute;
top: -10px;
right: -10px;
z-index: 12;
}
&__body {
padding: 20px;
max-width: 100%;
max-height: 100%;
margin: 0 auto;
background-color: #fff;
border-radius: 10px;
overflow: scroll;
}
}
modal
-
display: none;
- 完全にその場にない扱いにする。
- display:none と visibility:hidden の違い
- 【CSS】displayの使い方を総まとめ!inlineやblockの違いは?
-
CSSの display: inline、display: block、display: inline-block をマスターしよう!
-
block
: widthやheight、marginやpaddingを指定できる。h1、p、divなど。 -
inline
: blockの中で用いられ、要素を横並びにできる。a、span、strongなど。- 例: ulの中でliを横並びにする。
-
inline-block
: widthやheight、marginやpaddingを指定でき、要素を横並びにできる。- 例: ナビゲーションバー、ソーシャルボタン、ページネーションのスタイルを調整し、横並びにする。
-
-
position: fixed;
- ウィンドウ全体を基準として要素を配置する。
-
CSSのpositionを総まとめ!absoluteやfixedの使い方は?
-
absolute
: 親要素の位置を基準として要素を配置する。 -
relative
: 通常の表示位置を基準として要素を配置する。
-
-
top: 0; left: 0;
- 基準の左上( = 基準の上からの距離が
0px
、基準の左からの距離が0px
の位置)に要素を配置する。
- 基準の左上( = 基準の上からの距離が
-
width: 100%;
、height: 100%;
- 親要素の幅に対する比率。
- CSSのwidth(幅)とheight(高さ)の指定方法をマスターしよう
-
[CSS]ビューポート(vw, vh)とパーセント(%)、レスポンシブに適した単位の賢い使い分け方法
-
vw
: ビューポートの幅に対する比率。- 例: ビューポート幅
320px
のiPhone 5Sの場合、10vw
: 320/10 =32px
。
- 例: ビューポート幅
-
vh
: ビューポートの高さに対する比率。 - ビューポート: ブラウザのスクロールバーを含んだサイズのこと。
- もしページが長く、スクロールバーが表示されているのであれば、ビューポートの幅はhtml要素の幅より大きくなる。
- ビューポート > html > body。
-
-
overflow: auto;
- コンテンツがパディングボックスに収まる場合 →
overflow: visible;
と同じ。 - コンテンツがパディングボックスから溢れる場合 →
overflow: scroll;
と同じ。 - overflow - MDN Web Docks
-
【CSS】overflowの使い方:hiddenやscrollの違いは?
-
visible
: 初期値。はみ出た場合ははみ出たまま表示する。 -
scroll
: はみ出た部分が隠れ、スクロールにより表示できる。
-
- コンテンツがパディングボックスに収まる場合 →
modal-content
-
position: relative;
- 現在の表示位置から相対的に要素の位置を動かす。
-
top: 0; right: 0; bottom: 0; left: 0;
-
top
とbottom
を同時に0
に指定すると要素は縦いっぱいに広がる。 -
left
とright
を同時に0
に指定すると要素は横いっぱいに広がる。 - CSSのpositionを総まとめ!absoluteやfixedの使い方は?
#2. positionとセットで使うtop・bottom・left・right
-
&__btn-close
-
&
はSassの親参照セレクタで、出力結果はmodal-content_btn-close
となる。 top: -10px; right: -10px;
- 基準の上からの距離が
-10px
、基準の右からの距離が-10px
の位置- = 上側に
10px
、右側10px
に突き抜ける。 - 【CSS】意外と難しい「position」の使い方を詳しく解説してみた
- = 上側に
&__body
-
border-radius: 2px;
- 正円の円弧となる半径を指定する。
-
border
プロパティーの指定がなくても大丈夫。 - 今さら聞けない!? CSSのborder-radiusで様々な角丸に挑戦!
- 【13-1】borderと borderのショートハンド#borderのプロパティ一覧
JavaScript(jQuery)
// ダイアログを開くボタンをクリックした時
$('.modal-open').on('click', () => {
$('body').css({ 'overflow': 'hidden' });
$('#modal').show();
$('#modal-content').show();
});
// ダイアログの外側をクリックした時
$('#modal').off('click').on('click', e => {
if (e.target !== $('#modal')[0]) { return }
$('body').css({ 'overflow': '' });
$('#modal').hide();
$('#modal-content').hide();
});
// ダイアログの閉じるボタンをクリックした時
$('#modal-content').off('click').on('click', '.js-modal-close', () => {
$('body').css({ 'overflow': '' });
$('#modal').hide();
$('#modal-content').hide();
});
-
$('body').css({ 'overflow': 'hidden' });
-
body
のコンテンツがスクロールされないように'overflow': 'hidden'
に変更している。
-
-
.show()
、.hide()
-
css('display', 'block') // デフォルトに戻す
、css('display', 'none')
と同じ。
-
-
.off()
- 調査範囲内の
on
メソッドによって設定されたイベント発生時の処理を「すべて解除」する。- [.off( ) - 設計力を学ぶデザインドリル jQuery入門] (https://www.jquerystudy.info/reference/events/off.html)
-
unbind
、undelegate
、die
を表す。 ※ 要再調査。- jQuery の on() と off() を理解する
- jQuery 1.7の on() off()について調べてみた
-
jQueryのclickとbindとliveとdelegateとonの違い - Qiita
- JavaScriptのイベントの伝搬について詳しい。
- 調査範囲内の
HTML・CSSの前提知識集
-
コーディング規約について
-
HTML側
- JavaScriptで操作したい要素は
id
属性で指定。-
こんなHTMLとCSSのコーディング規約で書きたい
#JavaScript からアクセスする ID とクラス- JavaScriptで同じ操作をしたい要素が複数ある場合は、
js-*
プレフィックスを付けたclass
属性を指定。
- JavaScriptで同じ操作をしたい要素が複数ある場合は、
-
こんなHTMLとCSSのコーディング規約で書きたい
-
class
属性は最初にくる。id
属性は二番目にくる。
- JavaScriptで操作したい要素は
-
CSS側
-
-
CSSプロパティの記述順について
-
【CSS】CSSプロパティの記述順について考えてみた
- mozilla.org Base Styles というルールがかつては存在していたらしい。が、ネット上のものは大体同じ模様。
-
メンテナブルCSS
- 1.位置情報系(position, top, right, z-index, display, float等)
- 2.サイズ(width, height, padding, margin)
- 3.文字系(font, line-height, letter-spacing, color- text-align等)
- 4.背景(background, border等)
- 5.その他(animation, transition等)
-
【CSS】CSSプロパティの記述順について考えてみた
-
CSSのボックスモデルについて
-
Sassについて
-
BEMについて
-
MindBEMding
- BEM(Block、Element、Modifier)
- Block: 高レベルに抽象化されたもの。コンポーネント。
- 例:
.site-search{}
- 例:
- Element: Blockをサポートする子孫をあらわす。
- 例:
.site-search__field{}
、.site-search__button{}
- 例:
- Modifier: Blockの異なる状態をあらわす。
- 例:
.site-search--full{}
- 今回はハイフン(
-
)1つでModifierをあらわすことにする。
- 例:
- Block: 高レベルに抽象化されたもの。コンポーネント。
- BEM(Block、Element、Modifier)
-
BEMのBlockはElementを入れ子にせずにコンポーネント化しよう
-
BEMはElementの中にBlockを作っても問題ありません。
-
HTMLが増えるとBlockの単位が大きくなってしまうので、新たにBlockを作るのがおすすめです。
-
- 一番詳しいCSS設計規則BEMのマニュアル
- 細かすぎるけど伝わってほしい私的BEMプラクティス30(ぐらい)
-
Get BEM#FAQ
- 公式のFAQ。
-
BEMによるフロントエンドの設計 第1回 基本概念とルール
-
Blockはどこにでも置くことができ、Blockの中にBlockを含めることも可能です。ただし、CSSではBlockを入れ子にしてスタイルを指定してはいけません。
-
-
MindBEMding
<!-- BEMを使った例 -->
<form class="site-search site-search--full">
<input type="text" class="site-search__field">
<input type="Submit" value ="Search" class="site-search__button">
</form>
おまけ(発展)
-
HTMLのアクセシビリティについて
-
CSSの構造化について
# Sassを採用した場合のFLOCSSによるディレクトリ構成
├── foundation
│ ├── _base.scss
│ └── _reset.scss
├── layout
│ ├── _footer.scss
│ ├── _header.scss
│ ├── _main.scss
│ └── _sidebar.scss
└── object
├── component
│ ├── _button.scss
│ ├── _dialog.scss
│ ├── _grid.scss
│ └── _media.scss
├── project
│ ├── _articles.scss
│ ├── _comments.scss
│ ├── _gallery.scss
│ └── _profile.scss
└── utility
├── _align.scss
├── _clearfix.scss
├── _margin.scss
├── _position.scss
├── _size.scss
└── _text.scss