自分のためのメモ

ハンバーガーメニューで背景をクリックしても閉じたい

×ボタン以外の背景をクリックしても閉じたい

<!-- ハンバーガーメニューコード例 -->
<div class="hmn flex">
        <span class="anime"></span>
</div>

<!-- 表示・非表示対象のメニューコンテンツコード例 -->
<div id="overlay_close_trigger" class="overlay">
    <nav id="global" class="cont_box">
            <!-- WPメニューの場合 -->
            <?php wp_nav_menu( array(
                'theme_location' => 'gnav' ) );
            ?>
	</nav>
</div>
jQuery(function($){

$(function () {
		//メニューアイコンクリックでクラス操作
		$('.hmn').on('click', tClass);

		//ポップアップ時にクリックした対象の親要素に#globalがなければ(#globalより外側なら)閉じる
		$('#overlay_close_trigger').on('click', function(event) {
			if (!$(event.target).closest('#global').length) {
				tClass();
			}
		});

		function tClass() {
			$('body').toggleClass('mnopen'); 
			$('html').toggleClass('fixed'); //背景スクロール対策
		}

});

});

メニュー展開時の背景スクロールを拒否したい場合は、jQuery下部にあるように
クラスを付与し、CSS側で

html {
    &.fixed {
        overflow: hidden;
        height: 100vh;
    }
}

で回避できる。

【補足】メニュー関連CSS

/* 基本設定 */
.anime {
    transition: all .3s;
}
.flex {
    display: flex; 
    flex-wrap:nowrap; 
    justify-content:center; 
    align-items:flex-start; 
    align-content:flex-start;
}
.cont_box {
    width: 90%;
    margin: 0 auto;
}
/* メニュー独自 */
.hmn {
    background: #000;
    width: 80px;
    height: 70px;
    align-items: center;
    flex-wrap: nowrap;
    justify-content: center;
    z-index: 3;
    span {
        display: inline-block;
        background: #fff;
        width: 35px;
        height: 2px;
        position: relative;
        &::before {
            content: "";
            background: #fff;
            height: 2px;
            width: 35px;
            position: absolute;
            bottom: 10px;
            transition: .3s;
        }
        &::after {
            content: "";
            background: #fff;
            height: 2px;
            width: 35px;
            position: absolute;
            top: 10px;
            transition: .3s;
        }
    }
}

.overlay {
    position: fixed;
    top:0;
    right: 0;
    bottom: 0;
    left: 0;
    background-color: rgba(0, 0, 0, 0.95);
    opacity: 0;
    pointer-events: none;
    transition: .6s all;
    nav#global {
        opacity: 0;
        
    }
}

.mnopen {
    .overlay {
        opacity: 1;
        pointer-events: auto;
        z-index: 2;
        background-color: rgba(255, 255, 255, 0.95);
        nav#global {
            justify-content: center;
            transform: translate(-50%, -50%);
            top: 50%;
            left: 50%;
            position: absolute;
            border: solid 1px #000;
            box-shadow: 2px 2px 3px #ddd;
            background: #fff;
            padding: 3em 2em;
            opacity: 1;
            transition:opacity .5s;
            box-sizing: border-box;
            li {
                margin-bottom: 0.7em;
                text-align: center;
                &:last-child {
                    margin-bottom: 0;
                }
                a {
                    display: inline-block;
                    @extend .nl;
                    text-align: center;
                    box-sizing: border-box;
                    width: 80%;
                }
            }
        }
    }
    .hmn {
        span {
            background: #000;
            &::before {
                transform: rotate(45deg);
                width: 40px;
                top: 0;
                background: #fff;
                left: -2px;
            }
            &::after {
                transform: rotate(-45deg);
                width: 40px;
                bottom: 0;
                top: auto;
                background: #fff;
                left: -2px;
            }
        }
    }
}

【2023_11_28追記】中の要素はスクロールさせたい場合

以下のように、高さを指定してやりoverflowでOK(bodyなどの背景がfixの場合)

.test .inner {
    position: fixed;
    width: 100%;
    height: 100vh;
    height: calc(var(--vh, 1vh) * 100 - 75px);
    overflow-y: scroll;
    -webkit-overflow-scrolling: touch;
}