미디어위키:Gadget-Vector.js: 두 판 사이의 차이
식물 vs 좀비 위키
태그: 편집 취소 되돌려진 기여 |
편집 요약 없음 태그: 수동 되돌리기 |
||
| 354번째 줄: | 354번째 줄: | ||
var SEARCH_DOWN_OFFSET = 5; | var SEARCH_DOWN_OFFSET = 5; | ||
var CONTENT_TOP = 24; | var CONTENT_TOP = 24; | ||
var MAX_BACKGROUND_SHIFT = 72; | |||
var touchStartY = null; | |||
var backgroundShift = 0; | |||
var resetTimer = 0; | |||
function | function getCactionsParts() { | ||
var menu = document.getElementById('p-cactions'); | |||
if (!menu) { | |||
return null; | |||
} | |||
return { | |||
menu: menu, | |||
label: | |||
document.getElementById('p-cactions-label') || | |||
menu.querySelector( | |||
'label, .vector-menu-heading, button' | |||
), | |||
checkbox: | |||
menu.querySelector( | |||
'input.vector-menu-checkbox, input[type="checkbox"]' | |||
), | |||
content: menu.querySelector('.vector-menu-content') | |||
}; | |||
} | |||
function setCactionsOpen(open) { | |||
var parts = getCactionsParts(); | |||
if (!parts) { | |||
return; | |||
} | |||
parts.menu.classList.toggle('pvz-cactions-open', open); | |||
parts.menu.classList.toggle( | |||
'vector-menu-dropdown-active', | |||
open | |||
); | |||
if (parts.checkbox) { | |||
parts.checkbox.checked = open; | |||
} | |||
if (parts.label) { | |||
parts.label.setAttribute( | |||
'aria-expanded', | |||
open ? 'true' : 'false' | |||
); | |||
} | |||
if (parts.content) { | |||
parts.content.setAttribute( | |||
'aria-hidden', | |||
open ? 'false' : 'true' | |||
); | |||
} | |||
} | |||
function handleCactionsClick(event) { | |||
var parts = getCactionsParts(); | |||
var label; | |||
if (!parts) { | |||
return; | |||
} | |||
label = event.target.closest('#p-cactions-label'); | |||
if (label) { | |||
event.preventDefault(); | |||
event.stopImmediatePropagation(); | |||
setCactionsOpen( | |||
!parts.menu.classList.contains( | |||
'pvz-cactions-open' | |||
) | |||
); | |||
return; | |||
} | |||
if ( | |||
parts.menu.classList.contains('pvz-cactions-open') && | |||
!event.target.closest('#p-cactions') | |||
) { | |||
setCactionsOpen(false); | |||
} | |||
} | |||
function clampBackgroundShift(value) { | |||
return Math.max( | |||
-MAX_BACKGROUND_SHIFT, | |||
Math.min(MAX_BACKGROUND_SHIFT, value) | |||
); | |||
} | |||
function setBackgroundShift(value, resetting) { | |||
var root = document.documentElement; | |||
backgroundShift = clampBackgroundShift(value); | |||
root.classList.toggle( | |||
'pvz-background-resetting', | |||
!!resetting | |||
); | |||
root.style.setProperty( | |||
'--pvz-background-overscroll-y', | |||
backgroundShift + 'px' | |||
); | |||
} | |||
function resetBackgroundShift() { | |||
window.clearTimeout(resetTimer); | |||
setBackgroundShift(0, true); | |||
resetTimer = window.setTimeout(function () { | |||
document.documentElement.classList.remove( | |||
'pvz-background-resetting' | |||
); | |||
}, 200); | |||
} | |||
function handleTouchStart(event) { | |||
if (event.touches.length !== 1) { | |||
touchStartY = null; | |||
return; | |||
} | |||
window.clearTimeout(resetTimer); | |||
document.documentElement.classList.remove( | |||
'pvz-background-resetting' | |||
); | |||
touchStartY = event.touches[0].clientY; | |||
} | |||
function handleTouchMove(event) { | |||
var currentY; | |||
var delta; | |||
var root; | |||
var scrollTop; | |||
var maxScrollTop; | |||
var atTop; | |||
var atBottom; | |||
if ( | |||
touchStartY === null || | |||
event.touches.length !== 1 | |||
) { | |||
return; | |||
} | |||
currentY = event.touches[0].clientY; | |||
delta = currentY - touchStartY; | |||
root = document.documentElement; | |||
scrollTop = Math.max( | |||
window.scrollY, | |||
root.scrollTop, | |||
document.body.scrollTop | |||
); | |||
maxScrollTop = Math.max( | |||
0, | |||
root.scrollHeight - window.innerHeight | |||
); | |||
atTop = scrollTop <= 0; | |||
atBottom = scrollTop >= maxScrollTop - 1; | |||
if (atTop && delta > 0) { | |||
setBackgroundShift(delta * 0.42, false); | |||
return; | |||
} | |||
if (atBottom && delta < 0) { | |||
setBackgroundShift(delta * 0.42, false); | |||
return; | |||
} | |||
if (backgroundShift !== 0) { | |||
setBackgroundShift(0, false); | |||
} | |||
} | |||
function handleTouchEnd() { | |||
touchStartY = null; | |||
if (backgroundShift !== 0) { | |||
resetBackgroundShift(); | |||
} | |||
} | |||
function syncV39Layout() { | |||
var content = document.querySelector('#content'); | var content = document.querySelector('#content'); | ||
var leftNavigation = document.getElementById('left-navigation'); | var leftNavigation = document.getElementById('left-navigation'); | ||
| 477번째 줄: | 667번째 줄: | ||
} | } | ||
function | function initV39Interface() { | ||
var observer; | var observer; | ||
var parts = getCactionsParts(); | |||
if (parts) { | |||
setCactionsOpen( | |||
!!( | |||
parts.checkbox && | |||
parts.checkbox.checked | |||
) | |||
); | |||
} | |||
syncV39Layout(); | |||
document.addEventListener( | |||
'click', | |||
handleCactionsClick, | |||
true | |||
); | |||
document.addEventListener( | |||
'touchstart', | |||
handleTouchStart, | |||
{ passive: true } | |||
); | |||
document.addEventListener( | |||
'touchmove', | |||
handleTouchMove, | |||
{ passive: true } | |||
); | |||
document.addEventListener( | |||
'touchend', | |||
handleTouchEnd, | |||
{ passive: true } | |||
); | |||
document.addEventListener( | |||
'touchcancel', | |||
handleTouchEnd, | |||
{ passive: true } | |||
); | |||
window.addEventListener( | window.addEventListener( | ||
'resize', | 'resize', | ||
syncV39Layout, | |||
{ passive: true } | { passive: true } | ||
); | ); | ||
| 490번째 줄: | 720번째 줄: | ||
window.addEventListener( | window.addEventListener( | ||
'orientationchange', | 'orientationchange', | ||
syncV39Layout, | |||
{ passive: true } | { passive: true } | ||
); | ); | ||
observer = new MutationObserver(function () { | observer = new MutationObserver(function () { | ||
window.requestAnimationFrame( | window.requestAnimationFrame(syncV39Layout); | ||
}); | }); | ||
| 507번째 줄: | 737번째 줄: | ||
document.addEventListener( | document.addEventListener( | ||
'DOMContentLoaded', | 'DOMContentLoaded', | ||
initV39Interface, | |||
{ once: true } | { once: true } | ||
); | ); | ||
} else { | } else { | ||
initV39Interface(); | |||
} | } | ||
}()); | }()); | ||
