Bootstrapのナビゲーションでoffcanvasにする時のメモ


んー。通常のnavbarのときにサイドからメニューを出す際に、offcanvasを使ってできないかなと思って、サンプルのoffcanvasから代用して諸々作り変えた感じです。

説明とかはしてないのでご了承ください。

## HTML

基本的に1ソースでスマホからPCまでのレイアウトを作成してるので、ちょっと無茶な部分もあるかもしれません。

```html
<nav class="navbar navbar-default navbar-fixed-top">
	<div class="container row-offcanvas row-offcanvas-right">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle" data-toggle="offcanvas">
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="sr-only">MENU</span>
			</button>
			<a href="#" class="navbar-brand">LOGO</a>
		</div>
		<!-- /.navbar-header -->

		<div class="sidebar-offcanvas" id="sidebar" role="navigation">
			<div class="visible-xs offcanvas-header">MENU</div>
			<ul class="nav navbar-nav gnavi">
				<li><a href="#">Link</a></li>
				<li><a href="#">Link</a></li>
				<li><a href="#">Link</a></li>
				<li><a href="#">Link</a></li>
				<li><a href="#">Link</a></li>
			</ul>
			<div class="navbar-position"><!-- PC用の調整用タグ -->
				<ul class="nav navbar-nav nav-head">
					<li><a href="#">Link</a></li>
					<li><a href="#">Link</a></li>
					<li><a href="#">Link</a></li>
				</ul>
				<ul class="nav-info">
					<li class="tel-box">
						<span class="tel">012-345-6789</span>
					</li>
					<li class="infobox">
						<p class="text-1">テキスト</p>
						<p class="text-2">テキスト</p>
						<p class="text-3">テキスト</p>
					</li>
				</ul>
				
				<!-- 独自でCSS作ってあります。ほぼWordPressのtwentyfifteenのCSSから内容を把握できます。URLからアイコン呼び出しとか -->
				<ul class="social social-icon">
					<li><a href="https://www.facebook.com/" target="_blank"><span class="sr-only">facebook</span></a></li>
					<li><a href="https://www.twitter.com/" target="_blank"><span class="sr-only">twitter</span></a></li>
					<li><a href="https://www.instagram.com/" target="_blank"><span class="sr-only">instagram</span></a></li>
				</ul>
				<button type="button" class="navbar-close" data-toggle="offcanvas">
					<span class="btn-close">CLOSE</span>
				</button>
			</div>
		</div>
		<!-- /.collapse.navbar-collapse -->
	</div>
</nav>
```

---

## CSS(Scss)

Scssを使用しています。

```scss
@media screen and (max-width: $screen-xs-max) {
	.row-offcanvas {
		position: relative;
		transition: transform .25s ease-out;
		&-right {
			right: 0;
		}
		&-left {
			left: 0;
		}
		
		// Toggle Button
		.navbar-toggle {
			.icon-bar {
				transition: transform .5s ease-out;
			}
		}
		&.active {
			.navbar-toggle {
				padding-top: 14px;
				.icon-bar {
					&:nth-child(1) {
						margin-bottom: -2px;
						transform: rotateZ(45deg);
					}
					&:nth-child(2) {
						margin-top: 0;
						margin-bottom: 0;
						height: 0;
						opacity: 0;
					}
					&:nth-child(3) {
						margin-top: -2px;
						transform: rotateZ(-45deg);
					}
				}
				.sr-only {
					margin-top: 11px;
				}
			}
		}
	}

	.row-offcanvas-right {
		.sidebar-offcanvas {
			right: -240px;
			border-left: 1px solid #454545;
		}
		&.active {
			transform: translateX(-240px);
		}
	}

	.row-offcanvas-left {
		.sidebar-offcanvas {
			left: -240px;
			border-right: 1px solid #454545;
		}
		&.active {
			transform: translateX(240px);
		}
	}

	.offcanvas-header {
		cursor: default;
		position: absolute;
		top: 0;
		z-index: 5;
		width: 100%;
		height: 50px;
		padding: 0 15px;
		line-height: 50px;
		font-weight: bold;
		font-size: 114%;
		color: #fff;
		letter-spacing: 5px;
		text-align: center;
		text-shadow: 0 -1px 0 rgba(#000, 1);
		background-color: #e3e3e3;
		border-bottom: 1px solid #fff;
		user-select: none;
	}
	.sidebar-offcanvas {
		position: absolute;
		top: 0;
		width: 240px;
		height: 100%;
		height: 100vh;
		padding-top: 50px;
		padding-bottom: 100px;
		overflow: auto;
		-webkit-overflow-scrolling: touch;
		background-color: #f0f0f0;
		.navbar-nav {
			margin-left: 0;
			margin-right: 0;
		}
	}
	.offcanvas-blank {
		position: fixed;
		top: 0;
		left: 0;
		right: 0;
		z-index: 1001;
		width: 100%;
		height: 100%;
		height: 100vh;
		background-color: rgba(#000, .7);
	}
}
```

## JavaScript(jQuery)

```javascript:jQuery
$('[data-toggle="offcanvas"]').on('click', function() {
	$('.row-offcanvas').toggleClass('active');

	// .row-offcanvasがactiveになったらマスクレイヤーを追加する
	if ($('.row-offcanvas').hasClass('active'))
	{
		$('<div/>', {
			'class': 'offcanvas-blank',
			'data-toggle': 'offcanvas',
			click: function() {
				$('.row-offcanvas').removeClass('active');
				$(this).remove();
			}
		}).appendTo('body');
	}
	else
	{
		$('.offcanvas-blank').remove();
	}
});
```