1import { fixedBodyOn, fixedBodyOff } from './modules/m_fixedBody.js'; 2 3// ã°ãã¼ãã«å¤æ°ã®å®ç¾© 4let MAINSLIDER_INDEX = 0; 5let BEFORE_RESIZE_WIDTH = window.innerWidth; 6let mainSliderInstance = null; // ã¡ã¤ã³ã¹ã©ã¤ãã¼ã®ã¤ã³ã¹ã¿ã³ã¹ãä¿æ 7let imageExpandedSliderInstance = null; // ã¢ã¼ãã«ã¹ã©ã¤ãã¼ã®ã¤ã³ã¹ã¿ã³ã¹ãä¿æ 8const SP_BREAKPOINT = 768; // PCåãæ¿ããã¬ã¼ã¯ãã¤ã³ã (768px以ä¸ã§PC) 9 10// ---------------------------------------------------- 11// ã¦ã¼ãã£ãªãã£é¢æ° 12// ---------------------------------------------------- 13 14// ç»åã®srcãèæ¯ç»åã«è¨å®ãã (ããã¼ãºã¼ã ç¨) 15function insertImgSrc(sliderElement) { 16 const mainSlides = sliderElement.querySelectorAll(".swiper-slide"); 17 mainSlides.forEach((elm) => { 18 const img = elm.querySelector("img"); 19 if (!img || !(elm instanceof HTMLElement)) return; 20 elm.style.backgroundImage = `url('${img.getAttribute("src")}')`; 21 }); 22} 23 24// ãã¦ã¹ãªã¼ãã¼ã§ç»åããºã¼ã ããã (PCã§ã®ã¿ä½¿ç¨) 25function zoomImage(sliderElement) { 26 const slides = sliderElement.querySelectorAll(".swiper-slide"); 27 slides.forEach((elm) => elm.addEventListener("mousemove", (event) => { 28 const zoomElm = event.currentTarget; 29 if (!zoomElm || !(zoomElm instanceof HTMLElement) || window.innerWidth < SP_BREAKPOINT) return; // SPã§ã¯ç¡å¹ 30 31 let offsetX = 0; 32 let offsetY = 0; 33 34 if (event instanceof MouseEvent) { 35 offsetX = event.offsetX; 36 offsetY = event.offsetY; 37 } 38 39 const x = (offsetX / zoomElm.offsetWidth) * 100; 40 const y = (offsetY / zoomElm.offsetHeight) * 100; 41 zoomElm.style.backgroundPosition = `${x}% ${y}%`; 42 })); 43} 44 45// ---------------------------------------------------- 46// ð ã¢ã¼ãã«ãªã¼ãã³å¦çãç¬ç«ãã颿°ã¨ãã¦å®ç¾© (Swiper.on('click') ããå¼ã°ãã) 47// ---------------------------------------------------- 48function handleModalOpen(event) { 49 const mainSliderElement = document.querySelector('#js-main-slider'); 50 if (!mainSliderElement) return; 51 52 // ã¯ãªãã¯ãããè¦ç´ ã .swiper-slide å ã® img è¦ç´ ãç¢ºèª 53 const clickedImg = event.target.closest('.swiper-slide img'); 54 if (!clickedImg) return; 55 56 fixedBodyOn(); 57 58 const expandedModal = document.querySelector('[data-modal-role="image-expanded"]'); 59 if (expandedModal) { 60 expandedModal.style.display = 'block'; 61 } 62 63 const swiperSlide = clickedImg.closest(".swiper-slide"); 64 if (!swiperSlide) return; 65 66 // ã¹ã©ã¤ãã¤ã³ããã¯ã¹ã®è¨ç®: data-index屿§ããåå¾ 67 const IMAGE_INDEX = parseInt(swiperSlide.getAttribute('data-index'), 10) || 0; 68 69 // ã¢ã¼ãã«å ã¹ã©ã¤ãã¼ã®åæå 70 const imageExpandedSliderElm = document.querySelector(".js-imageExpandedSlider"); 71 if (imageExpandedSliderElm && imageExpandedSliderElm.classList.contains('swiper')) { 72 73 // æ¢åã®ã¤ã³ã¹ã¿ã³ã¹ãããã°ç ´æ£ãã¦ããåçæ 74 if (imageExpandedSliderInstance !== null) { 75 imageExpandedSliderInstance.destroy(true, true); 76 } 77 78 imageExpandedSliderInstance = new Swiper(imageExpandedSliderElm, { 79 initialSlide: IMAGE_INDEX, 80 loop: true, 81 effect: "fade", 82 zoom: { maxRatio: 4 }, 83 preventClicks: false, 84 preventClicksPropagation: false, 85 navigation: { 86 nextEl: '.js-expanded-slider-arrow--next', 87 prevEl: '.js-expanded-slider-arrow--prev', 88 }, 89 on: { 90 slideChange: function() { 91 const currentSlideNumber = this.realIndex + 1; 92 const formattedCurrent = String(currentSlideNumber).padStart(2, '0'); 93 const currentSlideExpanded = document.querySelector('#numberSlidesExpanded .current-slide'); 94 if (currentSlideExpanded) { currentSlideExpanded.innerHTML = formattedCurrent; } 95 }, 96 beforeInit: function() { 97 const numOfSlidesExpanded = this.wrapperEl.querySelectorAll(".swiper-slide").length; 98 const formattedTotal = String(numOfSlidesExpanded).padStart(2, '0'); 99 const totalSlidesExpanded = document.querySelector('#numberSlidesExpanded .total-slides'); 100 if (totalSlidesExpanded) { totalSlidesExpanded.innerHTML = formattedTotal; } 101 } 102 }, 103 }); 104 } 105} 106 107 108// ---------------------------------------------------- 109// Swiperåæåã»ç ´æ£ãå¶å¾¡ããã¡ã¤ã³é¢æ° 110// ---------------------------------------------------- 111function initMainSlider() { 112 const mainSliderElement = document.querySelector('#js-main-slider'); 113 114 if (!mainSliderElement || !mainSliderElement.classList.contains('swiper')) return; 115 116 const currentWidth = window.innerWidth; 117 118 // æ¢åã®ã¤ã³ã¹ã¿ã³ã¹ãåå¨ããå ´åãç ´æ£ãã 119 if (mainSliderInstance !== null) { 120 mainSliderInstance.destroy(true, true); 121 mainSliderInstance = null; 122 } 123 124 const bar = document.querySelector('.main-slider .progressbar_in'); 125 const speed = 3000; 126 127 // å ±éã® Swiper è¨å®ãªãã¸ã§ã¯ã 128 const commonSwiperConfig = { 129 initialSlide: MAINSLIDER_INDEX, 130 loop: true, 131 preventClicks: false, 132 preventClicksPropagation: false, 133 navigation: { 134 nextEl: '.main-slider .js-main-slider-arrow--next', 135 prevEl: '.main-slider .js-main-slider-arrow--prev', 136 }, 137 on: { 138 slideChangeTransitionStart: function () { 139 // ã«ã¹ã¿ã ããã°ã¬ã¹ãã¼ã®ãªã»ãã 140 if (bar) { 141 bar.style.transitionDuration = '0s'; 142 bar.style.transform = 'scaleX(0)'; 143 } 144 }, 145 slideChangeTransitionEnd: function () { 146 // ã«ã¹ã¿ã ããã°ã¬ã¹ãã¼ã®éå§ 147 if (bar) { 148 bar.style.transitionDuration = speed + 'ms'; 149 bar.style.transform = 'scaleX(1)'; 150 } 151 }, 152 slideChange: function() { 153 // ã¹ã©ã¤ãçªå·æ´æ° (0åã) 154 const currentSlideNumber = this.realIndex + 1; 155 const formattedCurrent = String(currentSlideNumber).padStart(2, '0'); 156 157 const currentSlideElement = document.querySelector('#numberSlides .current-slide'); 158 if (currentSlideElement) { currentSlideElement.innerHTML = formattedCurrent; } 159
160 // MAINSLIDER_INDEXã®æ´æ° 161 MAINSLIDER_INDEX = this.realIndex; 162 163 // variation__panel--item ã®ã¯ãªãã¯å¦ç (å ã³ã¼ãã®ãã¸ãã¯ãç¶æ) 164 const targetSelector = `.variation__panel--1 .variation__panel--item[data-panel-index="${this.realIndex}"]`; 165 const targetPanel = document.querySelector(targetSelector); 166 if (targetPanel) { targetPanel.click(); } 167 }, 168 beforeInit: function() { 169 // ç·ã¹ã©ã¤ãæ°æ´æ° (0åã) 170 const numOfSlides = this.wrapperEl.querySelectorAll(".swiper-slide").length; 171 const formattedTotal = String(numOfSlides).padStart(2, '0'); 172 173 const totalSlidesElement = document.querySelector('#numberSlides .total-slides'); 174 if (totalSlidesElement) { totalSlidesElement.innerHTML = formattedTotal; } 175 }, 176 // ð PCã§ã®ã¹ã¯ã¤ãã«ãã誤ã¯ãªãã¯ãé²ããããSwiperã®å é¨ã¯ãªãã¯ã¤ãã³ããä½¿ç¨ 177 click: function(swiper, event) { 178 // ã¹ã¯ã¤ãä¸ã§ãªãå ´åãã¢ã¼ãã«ãªã¼ãã³ã®å¦çãå®è¡ 179 if (!swiper.animating && !swiper.isMoving && !swiper.isSwiping) { 180 handleModalOpen(event); 181 } 182 }, 183 } 184 }; 185 186 let mainSliderConfig = {}; 187 188 // PCç¨è¨å® (>= 768px) 189 if (currentWidth >= SP_BREAKPOINT) { 190 mainSliderConfig = { 191 ...commonSwiperConfig, 192 effect: "slide", // PCã§ã¯é常ã¹ã©ã¤ã 193 slidesPerView: "auto", 194 spaceBetween: 0, 195 centeredSlides: true, 196 // autoplay: false, (ç¡å¹) 197 }; 198 } 199 // SPç¨è¨å® (< 768px) 200 else { 201 mainSliderConfig = { 202 ...commonSwiperConfig, 203 effect: "cards", // SPã§ã¯cardsã¨ãã§ã¯ã 204 cardsEffect: { 205 slideShadows: false 206 }, 207 slidesPerView: 1, // SPã¯1æè¡¨ç¤ºãæç¤º 208 spaceBetween: 0, 209 watchSlidesProgress: true, 210 watchSlidesVisibility: true, 211 autoplay: { 212 delay: 3000, 213 disableOnInteraction: false, 214 }, 215 }; 216 } 217 218 // Swiperã¤ã³ã¹ã¿ã³ã¹ã®çæ 219 mainSliderInstance = new Swiper(mainSliderElement, mainSliderConfig); 220 221 // åæåå¾ã®ã¦ã¼ãã£ãªãã£é¢æ°å®è¡ 222 insertImgSrc(mainSliderElement); 223 zoomImage(mainSliderElement); 224} 225 226 227// ---------------------------------------------------- 228// DOMContentLoaded ã¤ãã³ããªã¹ãã¼ (ã¡ã¤ã³å¦ç) 229// ---------------------------------------------------- 230document.addEventListener('DOMContentLoaded', function() { 231 232 // ==================================================== 233 // 1. DOMè¦ç´ ã®åç § (VIEW MORE & SP ãã£ãã·ã§ã³) 234 // ==================================================== 235 const itemWrappers = document.querySelectorAll('.concept-story-inner'); 236 const viewMoreButton = document.getElementById('js-view-more-button'); 237 const imageWraps = document.querySelectorAll('.concept-story-inner .concept_story_img_wrap'); 238 239 const mainSliderElement = document.querySelector('#js-main-slider'); // Swiperè¦ç´ 240 241 const loadCount = 3; // 1åãããã®è¿½å è¡¨ç¤ºä»¶æ° 242 243 // ==================================================== 244 // 2. VIEW MORE æ©è½ã®ãã¸ã㯠245 // ==================================================== 246 if (viewMoreButton && itemWrappers.length > 0) { 247 248 const getHiddenItems = () => { 249 return Array.from(itemWrappers).filter(item => item.classList.contains('is-hidden')); 250 }; 251 252 viewMoreButton.addEventListener('click', function() { 253 const hiddenItems = getHiddenItems(); 254 const itemsToShow = hiddenItems.slice(0, loadCount); 255 256 itemsToShow.forEach(item => { 257 item.classList.remove('is-hidden'); 258 }); 259 260 const remainingHidden = getHiddenItems().length; 261 262 if (remainingHidden === 0) { 263 this.style.display = 'none'; 264 this.setAttribute('aria-hidden', 'true'); 265 } 266 }); 267 } 268 269 // ==================================================== 270 // 3. SPã¿ããæã®ãã£ãã·ã§ã³è¡¨ç¤ºãã¸ã㯠271 // ==================================================== 272 273 imageWraps.forEach(function(wrapper) { 274 wrapper.addEventListener('click', function() { 275 const windowWidth = window.innerWidth; 276 277 if (windowWidth <= SP_BREAKPOINT) { 278 this.classList.toggle('is-caption-open'); 279 280 imageWraps.forEach(function(otherWrapper) { 281 if (otherWrapper !== wrapper) { 282 otherWrapper.classList.remove('is-caption-open'); 283 } 284 }); 285 } 286 }); 287 }); 288 289 document.addEventListener('click', function(e) { 290 const windowWidth = window.innerWidth; 291 292 if (windowWidth <= SP_BREAKPOINT) { 293 const isInsideWrapper = e.target.closest('.concept_story_img_wrap'); 294 295 if (!isInsideWrapper) { 296 imageWraps.forEach(function(wrapper) { 297 wrapper.classList.remove('is-caption-open'); 298 }); 299 } 300 } 301 }); 302 303 // ==================================================== 304 // 4. ã¡ã¤ã³ã¹ã©ã¤ãã¼åæå (ãã©ã³ãã¹ã©ã¤ãã¼) 305 // ==================================================== 306 initMainSlider(); 307 308 // ==================================================== 309 // 6. ã¢ã¼ãã«ã¯ãã¼ãºå¦ç 310 // ==================================================== 311 document.querySelectorAll(".js-modalclose").forEach(closeButton => { 312 closeButton.addEventListener('click', function() { 313 fixedBodyOff(); 314 315 const modal = this.closest('.card-modal'); 316 if (modal) { 317 modal.style.display = 'none'; 318 } 319 320 // ã¢ã¼ãã«ãéããã¨ãã«ã¹ã©ã¤ãã¼ã¤ã³ã¹ã¿ã³ã¹ãç ´æ£ 321 if (imageExpandedSliderInstance) { 322 imageExpandedSliderInstance.destroy(true, true); 323 imageExpandedSliderInstance = null; 324 } 325 }); 326 }); 327 328 // ==================================================== 329 // 7. ãªãµã¤ãºã¤ãã³ãå¦ç 330 // ==================================================== 331 window.addEventListener('resize', () => { 332 // ãªãµã¤ãºæã®ä¸è¦ãªååæåãé²ã 333 if (window.innerWidth !== BEFORE_RESIZE_WIDTH) { 334 BEFORE_RESIZE_WIDTH = window.innerWidth; 335 336 // ç»é¢å¹ ãå¤ãã£ãã¨ãã« Swiper ãååæå 337 initMainSlider(); 338 } 339 }); 340 341 // ==================================================== 342 // 8. ã¹ã¯ãã¼ã«æ¤ç¥ã«ãããããã¼å¦ç 343 // ==================================================== 344 345 const headerScrolled = document.querySelector('header'); 346 347 if (headerScrolled) { 348 const handleScroll = () => { 349 // window.innerHeight ã使ç¨ãã¦é¾å¤å¤å® 350 headerScrolled.classList.toggle('scrolled', window.scrollY > window.innerHeight); 351 }; 352 // 1. ãã¼ã¸èªã¿è¾¼ã¿æã«ä¸åº¦ãå³åº§ã«ãã§ãã¯ãå®è¡ 353 handleScroll(); 354 // 2. ã¹ã¯ãã¼ã«ãããã³ã«ãã§ãã¯ãå®è¡ 355 window.addEventListener('scroll', handleScroll); 356 } 357 // ==================================================== 358 359 360 // ==================================================== 361 // 9. åç»æ¡å¤§å¦ç (座æ¨è¨ç®ã«ããè¶ é«éã¢ãã¡ã¼ã·ã§ã³ç) 362 // ==================================================== 363 const fsVideoOpenBtn = document.querySelector('.js-button--full-screen-video-open'); 364 const targetContainer = document.querySelector('.js-target--full-screen-video'); 365 const fsVideoCloseBtn = document.querySelector('.js-button--full-screen-video-close'); 366 367 let placeholder = document.createElement('div'); 368 placeholder.className = 'video-placeholder'; 369 370 if (fsVideoOpenBtn && targetContainer && fsVideoCloseBtn) { 371 372 const handleResize = () => { 373 if (targetContainer.classList.contains('is-expanded')) { 374 // ã¢ã¹ãã¯ãæ¯ãã§ãã¯ã«ããå¼·å¶æ¨ªåãã¯ã©ã¹ã®ä»ä¸ (ã¿ãã¬ãã対çãªã©) 375 if (window.innerHeight > window.innerWidth) { 376 targetContainer.classList.add('is-force-landscape'); 377 } else { 378 targetContainer.classList.remove('is-force-landscape'); 379 } 380 } 381 }; 382 383 // --- éãå¦ç --- 384 fsVideoOpenBtn.addEventListener('click', function() { 385 if (window.innerWidth >= 1025) return; // PCã§ã¯ç¡å¹å 386 387 const rect = targetContainer.getBoundingClientRect(); 388 389 // ãã¬ã¼ã¹ãã«ãã¼ã®è¨ç½® 390 placeholder.style.width = targetContainer.offsetWidth + 'px'; 391 placeholder.style.height = targetContainer.offsetHeight + 'px'; 392 if(targetContainer.parentNode) { 393 targetContainer.parentNode.insertBefore(placeholder, targetContainer); 394 } 395 396 // åæä½ç½®è¨å® (fixed & transform: none ã®ããã®åº§æ¨) 397 targetContainer.style.position = 'fixed'; 398 targetContainer.style.top = rect.top + 'px'; 399 targetContainer.style.left = rect.left + 'px'; 400 targetContainer.style.width = rect.width + 'px'; 401 targetContainer.style.height = rect.height + 'px'; 402 targetContainer.style.zIndex = '99999';
403 targetContainer.style.transition = 'none'; 404 405 document.body.appendChild(targetContainer); 406 targetContainer.offsetHeight; // Force Reflow 407 408 // ã¢ãã¡ã¼ã·ã§ã³ON 409 targetContainer.style.transition = ''; 410 411 requestAnimationFrame(() => { 412 targetContainer.classList.add('is-expanded'); 413 targetContainer.style.top = ''; 414 targetContainer.style.left = ''; 415 targetContainer.style.width = ''; 416 targetContainer.style.height = ''; 417 handleResize(); 418 }); 419 420 fixedBodyOn(); 421 window.addEventListener('resize', handleResize); 422 }); 423 424 // --- éããå¦ç --- 425 fsVideoCloseBtn.addEventListener('click', function() { 426 const destRect = placeholder.getBoundingClientRect(); 427 const videoEl = targetContainer.querySelector('video'); 428 429 // åç»ã¿ã°ã®ã¢ãã¡ã¼ã·ã§ã³ãããªãï¼0ç§ï¼ãã«å¼·å¶è¨å® 430 if(videoEl) { 431 videoEl.style.transition = 'none'; 432 } 433 434 // ã¯ã©ã¹åé¤ï¼ããã§åç»ã¯å³åº§ã«0度ã»coverã®ç¶æ ã«æ»ãï¼ 435 targetContainer.classList.remove('is-expanded'); 436 targetContainer.classList.remove('is-force-landscape'); 437 438 // ã³ã³ããèªä½ã®ç§»åã¢ãã¡ã¼ã·ã§ã³ã¯ 0.1s (CSSã®è¨å®) ã§å®è¡ 439 targetContainer.style.transition = ''; 440 targetContainer.style.top = destRect.top + 'px'; 441 targetContainer.style.left = destRect.left + 'px'; 442 targetContainer.style.width = destRect.width + 'px'; 443 targetContainer.style.height = destRect.height + 'px'; 444 445 fixedBodyOff(); 446 window.removeEventListener('resize', handleResize); 447 448 // 0.1ç§å¾ã«å¾çä»ã 449 setTimeout(() => { 450 if (placeholder.parentNode) { 451 targetContainer.style = ''; // ã¹ã¿ã¤ã«å ¨è§£é¤ 452 453 // 次ã«éãã¨ãã®ããã«ãvideoã®transitionè¨å®ï¼noneï¼ãæ¶ãã¦å ã«æ»ã 454 if(videoEl) { 455 videoEl.style.transition = ''; 456 } 457 458 placeholder.parentNode.insertBefore(targetContainer, placeholder); 459 placeholder.parentNode.removeChild(placeholder); 460 } 461 }, 100); 462 }); 463 } 464 465 // ==================================================== 466 // 10. é³å£°åãæ¿ãå¦ç 467 // ==================================================== 468 const soundToggleBtn = document.querySelector('.js-sound-toggle'); 469 // targetContainerãã»ã¯ã·ã§ã³9ã§å®ç¾©æ¸ã¿åæ 470 const videoEl = targetContainer ? targetContainer.querySelector('video') : null; 471 472 if (soundToggleBtn && videoEl) { 473 soundToggleBtn.addEventListener('click', function(e) { 474 e.stopPropagation(); // 親è¦ç´ ã¸ã®ãããªã³ã°é²æ¢ï¼å¿µã®ããï¼ 475 476 // ãã¥ã¼ãç¶æ ãå転 477 videoEl.muted = !videoEl.muted; 478 479 // ã¯ã©ã¹ã®ä»ãæ¿ãã«ãã表示åãæ¿ã 480 if (videoEl.muted) { 481 // OFF (Muted) 482 soundToggleBtn.classList.add('is-muted'); 483 soundToggleBtn.classList.remove('is-unmuted'); 484 } else { 485 // ON (Unmuted) 486 soundToggleBtn.classList.remove('is-muted'); 487 soundToggleBtn.classList.add('is-unmuted'); 488 } 489 }); 490 } 491 492});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.