(function (window) { 'use strict'; var document = window.document; var $ = window.jQuery; var $window = $(window); var $document = $(document); var mediaQueryString = 'screen and (min-width: 864px)'; var mediaQueryList = window.matchMedia(mediaQueryString); // ------------------------------------------------------------------------ // Google カスタム検索 placeholder 属性削除 // ------------------------------------------------------------------------ $(function () { var $searchPc = $document.find('.header-main-nav-search-text'); var $searchSp = $document.find('.header-sub-nav-search-text'); function remove() { $searchPc.removeAttr('placeholder'); $searchSp.removeAttr('placeholder'); } $searchPc.on('blur', remove); $searchSp.on('blur', remove); remove(); }); // ------------------------------------------------------------------------ // グローバルメニュー // ------------------------------------------------------------------------ $(function () { var $buttons = $document.find('.js-main-menu-button'); var openClassName = 'is-open'; $buttons.each(function () { var $button = $(this); var id = $button.attr('data-main-menu-for'); var $content = $document.find('#' + id); function toggle(event) { event.preventDefault(); if ($content.hasClass(openClassName)) { $button.removeClass(openClassName); $content.removeClass(openClassName); } else { $button.addClass(openClassName); $content.addClass(openClassName); } } $button.on('click', toggle); }); }); // ------------------------------------------------------------------------ // グローバルメニュー メガドロップダウン // ------------------------------------------------------------------------ $(function () { var $globalMenu = $document.find('.js-global-menu'); var $buttons = $globalMenu.find('.js-global-menu-button'); var $contents = $globalMenu.find('.js-global-menu-content'); var openClassName = 'is-open'; $buttons.each(function () { var $button = $(this); var selector = $button.attr('href') || $button.attr('data-global-menu-for'); var $sameButtons = $buttons.filter('[href="' + selector + '"], [data-global-menu-for="' + selector + '"]'); var $otherButtons = $buttons.not($sameButtons); var $content = $globalMenu.find(selector); var $otherContents = $contents.not($content); function setContentPosition() { var top = $globalMenu.outerHeight(); $content.css({ top: top + 'px' }); } function toggle(event) { event.preventDefault(); if ($content.hasClass(openClassName)) { $sameButtons.removeClass(openClassName); $content.removeClass(openClassName); } else { $sameButtons.addClass(openClassName); $content.addClass(openClassName); $otherButtons.removeClass(openClassName); $otherContents.removeClass(openClassName); setContentPosition(); } } $window.on('resize', setContentPosition); setContentPosition(); $button.on('click', toggle); }); }); // ------------------------------------------------------------------------ // ページ内アンカー アニメーションスクロール // ------------------------------------------------------------------------ $document.on('click', '.js-page-anchor', function (event) { var anchor = event.currentTarget; var $anchor = $(anchor); var selector = $anchor.attr('href'); var $target = $document.find(selector); var targetOffset; var targetOffsetTop; event.preventDefault(); if ($target.length <= 0) { $target = $(document.body); } targetOffset = $target.offset(); targetOffsetTop = targetOffset.top || 0; $document.find('html, body').animate({ scrollTop: targetOffsetTop }, { duration: 300 }); }); // ------------------------------------------------------------------------ // 高さ揃え // ------------------------------------------------------------------------ $(function () { $document.find('.js-match-height').matchHeight(); }); // ------------------------------------------------------------------------ // カルーセル // ------------------------------------------------------------------------ $(function () { var $carouselRoot = $document.find('.js-carousel'); $carouselRoot.on('init reinit', function (event, slick) { var $root = slick.$slider; var $dotsRoot = slick.$dots; var $pauseButtonWrapper = $('
  • '); var $pauseButton = $(''); // 一時停止・再生ボタンの設定 $pauseButton.on('click', function () { if (slick.paused) { $root.slick('slickPlay'); $pauseButton.text('一時停止'); $pauseButton.removeClass('slick-play'); } else { $root.slick('slickPause'); $pauseButton.text('再生'); $pauseButton.addClass('slick-play'); } }); // 一時停止・再生ボタンの追加 $pauseButtonWrapper.append($pauseButton); $dotsRoot.append($pauseButtonWrapper); }); $carouselRoot.on('destroy', function () { var $dotsRoot = $carouselRoot.find('.slick-dots'); var $pauseButtonWrapper = $dotsRoot.find('.slick-pause-wrapper'); var $pauseButton = $pauseButtonWrapper.find('.slick-pause'); // 一時停止・再生ボタンの削除 $pauseButton.off('click'); $pauseButtonWrapper.remove(); // 念のため参照を切ってガベージコレクトを発動させる $pauseButton = null; $pauseButtonWrapper = null; $dotsRoot = null; }); // 初期化 $carouselRoot.slick({ autoplay: true, autoplaySpeed: 5000, prevArrow: '', nextArrow: '', dots: true, pauseOnDotsHover: true, speed: 300 }); }); // ------------------------------------------------------------------------ // タブ・アコーディオン // ------------------------------------------------------------------------ $(function () { var $roots = $document.find('.js-tab-accordion'); $roots.each(function () { var $root = $(this); var $tabRoot = $root.find('.js-tabs'); var $tabs = $tabRoot.find('.js-tab'); var $contents = $root.find('.js-tab-content'); function buildTab(index) { if (!index) { index = 0; } $root.tabs({ active: index, classes: { 'ui-tabs-active': 'ui-tabs-active is-active' } }); } function destroyTab() { var tabInstance = $root.tabs('instance'); var index = 0; if (tabInstance) { index = $root.tabs('option', 'active'); $root.tabs('destroy'); } return index; } function buildAccordion(index) { if (!index) { index = 0; } $tabRoot.accordion({ active: index, animate: false, classes: { 'ui-accordion-header-active': 'ui-accordion-header-active is-active', 'ui-accordion-content-active': 'ui-accordion-content-active is-active' }, header: '> .js-tab-wrapper > .js-tab', heightStyle: 'content' }); } function destroyAccordion() { var accordionInstance = $tabRoot.accordion('instance'); var index = 0; if (accordionInstance) { index = $tabRoot.accordion('option', 'active'); $tabRoot.accordion('destroy'); } return index; } function changeNodeAccordionToTab() { $root.append($contents); } function changeNodeTabToAccordion() { $tabs.each(function (index) { var $tab = $(this); var $content = $contents.eq(index); $tab.after($content); }); } function change(mql) { var index; if (mql.matches) { // アコーディオン → タブ index = destroyAccordion(); changeNodeAccordionToTab(); buildTab(index); } else { // タブ → アコーディオン index = destroyTab(); changeNodeTabToAccordion(); buildAccordion(index); } } mediaQueryList.addListener(change); change(mediaQueryList); }); }); // ------------------------------------------------------------------------ // トグル(SP のみ) // ------------------------------------------------------------------------ $(function () { var $roots = $document.find('.js-toggle-sp'); var openClassName = 'is-open'; $roots.each(function () { var $root = $(this); var $buttons = $root.find('.js-toggle-sp-button'); function toggleByEvent(event) { var eventType = event.type; event.preventDefault(); if ('click' === eventType || ('keydown' === eventType && 13 === event.keyCode && !event.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ) ) { if ($root.hasClass(openClassName)) { $root.removeClass(openClassName); } else { $root.addClass(openClassName); } } } function change(mql) { if (mql.matches) { // 無効化 $buttons.off('click keydown', toggleByEvent); } else { // 有効化 $buttons.on('click keydown', toggleByEvent); } } mediaQueryList.addListener(change); change(mediaQueryList); }); }); // ------------------------------------------------------------------------ // ページ TOP アンカー fixed スクロール // ------------------------------------------------------------------------ $(function () { var $root = $document.find('.js-page-top-root'); var $item = $root.find('.js-page-top'); var fixedClassName = 'footer-page-top-fixed'; function change() { var itemOffset = $item.offset(); var itemOffsetTop = itemOffset.top; var itemOuterHeight = $item.outerHeight(); var itemOffsetBottom = Math.floor(itemOffsetTop + itemOuterHeight); var rootOffset = $root.offset(); var rootOffsetTop = rootOffset.top; var rootOuterHeight = $root.outerHeight(); var rootOffsetBottom = Math.floor(rootOffsetTop + rootOuterHeight); var windowScrollTop = $window.scrollTop(); // BUG: jQuery 3.2.1 // $window.height() ではロケーションバーの高さが考慮されない // window.innerHeight 直取りなら、ロケーションバーの状態 // (表示・非表示)にあわせたビューポート高さが取得できる var windowHeight = window.innerHeight; var windowScrollBottom = windowScrollTop + windowHeight; var nowFixed = $item.hasClass(fixedClassName); var fixed = false; if (itemOffsetBottom < rootOffsetBottom) { // 通常時 fixed = true; } else if (windowScrollBottom < itemOffsetBottom) { // ビューポート下辺とアイテム下辺の接触時 fixed = true; } if (fixed) { if (!nowFixed) { $item.addClass(fixedClassName); } } else { if (nowFixed) { $item.removeClass(fixedClassName); } } } $window.on('resize', change); $window.on('scroll', change); change(); }); // ------------------------------------------------------------------------ // 全て選択 // ------------------------------------------------------------------------ $(function () { var $allCheckers = $document.find('.js-checkbox-all-checker'); var $allTargets = $document.find('.js-checkbox-all-checker-target'); $allCheckers.each(function () { var $allChecker = $(this); var name = $allChecker.attr('name'); var $targets = $allTargets.filter('[name="' + name + '"]'); function changeAllChecker() { var $notCheckedTargets; var $checkedTargets; if ($allChecker.is(':checked')) { $notCheckedTargets = $targets.filter(':not(:checked)'); $notCheckedTargets.prop('checked', true); $notCheckedTargets.trigger('change'); } else { $checkedTargets = $targets.filter(':checked'); $checkedTargets.prop('checked', false); $checkedTargets.trigger('change'); } } $allChecker.on('change', changeAllChecker); changeAllChecker(); $targets.on('change', function () { var $checkedTargets = $targets.filter(':checked'); if ($targets.length === $checkedTargets.length) { $allChecker.prop('checked', true); } else { $allChecker.prop('checked', false); } }); }); }); // ------------------------------------------------------------------------ // 絞り込み // ------------------------------------------------------------------------ $(function () { var $fieldButtonRoot = $document.find('.js-narrowing-button-field-root'); var $fieldButtons = $fieldButtonRoot.find('.js-narrowing-button-field'); var $purposeButtonRoot = $document.find('.js-narrowing-button-purpose-root'); var $purposeButtons = $purposeButtonRoot.find('.js-narrowing-button-purpose'); var $itemRoot = $document.find('.js-narrowing-item-root'); var $items = $itemRoot.find('.js-narrowing-item'); var $errorMessage = $document.find('.js-narrowing-error'); var DATA_KEY = 'NARROWING_ITEMS'; var CHANGE_END_EVENT_TYPE = 'filter-change-end'; // アイテムデータ初期化 $items.each(function () { var $item = $(this); var fieldString = $item.attr('data-filter-field'); var purposeString = $item.attr('data-filter-purpose'); var fields = fieldString.split(' '); var nfields = fields.length; var f; var purposes = purposeString.split(' '); var npurposes = purposes.length; var p; var data = { fields: {}, purposes: {} }; for (f = 0; f < nfields; f++) { data.fields[fields[f]] = true; } for (p = 0; p < npurposes; p++) { data.purposes[purposes[p]] = true; } $item.data(DATA_KEY, data); }); // アイテムデータ変更にともなうアイテム表示切替 $itemRoot.on(CHANGE_END_EVENT_TYPE, function () { var noFields = $fieldButtons.filter(':checked').length <= 0; var noPurposes = $purposeButtons.filter(':checked').length <= 0; $items.each(function () { var $item = $(this); var data = $item.data(DATA_KEY); var fields = data.fields; var purposes = data.purposes; var fieldKey; var fieldValue; var fieldTypes = []; var fieldResult = false; var purposeKey; var purposeValue; var purposeTypes = []; var purposeResult = false; // 「分野」を抽出 for (fieldKey in fields) { if (fields.hasOwnProperty(fieldKey)) { fieldValue = fields[fieldKey]; // 選択中の「分野」を確保 if (fieldValue) { fieldTypes.push(fieldKey); } } } // 「用途」を抽出 for (purposeKey in purposes) { if (purposes.hasOwnProperty(purposeKey)) { purposeValue = purposes[purposeKey]; // 選択中の「用途」を確保 if (purposeValue) { purposeTypes.push(purposeKey); } } } if (noFields) { // 「分野」未選択なら表示候補とする fieldResult = true; } else if (1 <= fieldTypes.length) { // 「分野」が1つでもあれば表示候補とする fieldResult = true; } if (noPurposes) { // 「用途」未選択なら表示候補とする purposeResult = true; } else if (1 <= purposeTypes.length) { // 「用途」が1つでもあれば表示候補とする purposeResult = true; } // 「分野」と「用途」が揃ったとき、アイテムを表示 // ただし、「分野」と「用途」が全て未選択の場合を除く if (fieldResult && purposeResult && !(noFields && noPurposes)) { $item.show(); } else { $item.hide(); } }); }); // アイテム表示切替終了後の処理 // ※必ず「アイテムデータ変更にともなうアイテム表示切替」の後に定義すること $itemRoot.on(CHANGE_END_EVENT_TYPE, function () { var $matchHeightTargets = $document.find('.js-match-height'); // 高さ揃えが関わっているため、手動アップデート $matchHeightTargets.matchHeight({ remove: true }); // 可視要素だけに絞らないと、うまく適用できない $matchHeightTargets.filter(':visible').matchHeight(); if ($items.filter(':visible').length <= 0) { $errorMessage.show(); } else { $errorMessage.hide(); } }); // 「分野」の初期チェック状況に基づくアイテムデータ初期化 $fieldButtons.each(function () { var $fieldButton = $(this); var fieldType = $fieldButton.val(); var checked = $fieldButton.prop('checked'); var $targetItems = $items.filter('[data-filter-field~="' + fieldType + '"]'); $targetItems.each(function () { var $targetItem = $(this); var data = $targetItem.data(DATA_KEY); data.fields[fieldType] = checked; }); $itemRoot.trigger(CHANGE_END_EVENT_TYPE); }); // 「用途」の初期チェック状況に基づくアイテムデータ初期化 $purposeButtons.each(function () { var $purposeButton = $(this); var purposeType = $purposeButton.val(); var checked = $purposeButton.prop('checked'); var $targetItems = $items.filter('[data-filter-purpose~="' + purposeType + '"]'); $targetItems.each(function () { var $targetItem = $(this); var data = $targetItem.data(DATA_KEY); data.purposes[purposeType] = checked; }); $itemRoot.trigger(CHANGE_END_EVENT_TYPE); }); // 「分野」のチェック変更にともなうアイテムデータ変更 $fieldButtons.on('change', function (event) { var fieldButton = event.currentTarget; var $fieldButton = $(fieldButton); var fieldType = $fieldButton.val(); var checked = $fieldButton.prop('checked'); var $targetItems = $items.filter('[data-filter-field~="' + fieldType + '"]'); $targetItems.each(function () { var $targetItem = $(this); var data = $targetItem.data(DATA_KEY); data.fields[fieldType] = checked; }); $itemRoot.trigger(CHANGE_END_EVENT_TYPE); }); // 「用途」のチェック変更にともなうアイテムデータ変更 $purposeButtons.on('change', function (event) { var purposeButton = event.currentTarget; var $purposeButton = $(purposeButton); var purposeType = $purposeButton.val(); var checked = $purposeButton.prop('checked'); var $targetItems = $items.filter('[data-filter-purpose~="' + purposeType + '"]'); $targetItems.each(function () { var $targetItem = $(this); var data = $targetItem.data(DATA_KEY); data.purposes[purposeType] = checked; }); $itemRoot.trigger(CHANGE_END_EVENT_TYPE); }); }); }(this));