1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

1
Posted at

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

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

HTML

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

<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を使用しています。

@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)

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();
	}
});
1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?