1/** 2 * cardstrip.js â ê³µíµ next-only ìí ì¬ë¼ì´ë 3 * 4 * ë§í¬ì ê³ì½: 5 * <div class="cardstrip" data-cardstrip data-visible="N"> 6 * <div class="cardstrip-viewport"> 7 * <ul class="cardstrip-track"> 8 * <li class="cardstrip-slide">â¦</li> à N+ 9 * </ul> 10 * </div> 11 * <button data-strip-next class="cardstrip-arrow">â</button> 12 * </div> 13 * 14 * ëì: 15 * - ë°ì¤í¬í± (>1024): íì´í í´ë¦ì¼ë¡ í ì¹¸ì© ì´ë, ë§ì§ë§ìì ì²ìì¼ë¡ ìí. 16 * 매ëë¬ì´ ìí ìí´ ì²ì Nê° ì¬ë¼ì´ë를 ë¤ì í´ë¡ . 17 * - íë¸ë¦¿â (â¤1024): CSS ë¡ íì´í ì¨ê¹ + ë·°í¬í¸ overflow-x scroll-snap. 18 * JS ë transform ì´ê¸°íë§ ë´ë¹. 19 * - ì¬ë¼ì´ë ê°ì ⤠visible â ë²í¼ ì¨ê¹, í´ë¡ ì í¨. 20 */ 21(function(){ 22 document.querySelectorAll('[data-cardstrip]').forEach(function(root){ 23 var track = root.querySelector('.cardstrip-track'); 24 var nextBtn = root.querySelector('[data-strip-next]'); 25 if (!track || !nextBtn) return; 26 var visible = parseInt(root.dataset.visible, 10) || 5; 27 var originals = Array.prototype.slice.call(track.children); 28 var total = originals.length; 29 if (total <= visible) { nextBtn.hidden = true; return; } 30 31 // 매ëë¬ì´ ìíì ìí´ ì²ì visible ê° ì¬ë¼ì´ë를 ë¤ì í´ë¡ 32 for (var i = 0; i < visible; i++) { 33 var clone = originals[i].cloneNode(true); 34 clone.setAttribute('aria-hidden', 'true'); 35 clone.classList.add('is-clone'); 36 track.appendChild(clone); 37 } 38 39 var idx = 0; 40 var animating = false; 41 var mq = window.matchMedia('(max-width:1024px)'); 42 43 function stepPx(){ 44 var slide = track.children[0]; 45 var g = parseFloat(getComputedStyle(track).gap) || 0; 46 return slide.getBoundingClientRect().width + g; 47 } 48 49 function go(){ 50 if (animating || mq.matches) return; 51 animating = true; 52 idx += 1; 53 track.style.transition = 'transform .55s var(--ease)'; 54 track.style.transform = 'translateX(-' + (idx * stepPx()) + 'px)'; 55 var onEnd = function(e){ 56 if (e.propertyName !== 'transform') return; 57 track.removeEventListener('transitionend', onEnd); 58 if (idx >= total) { 59 idx = 0; 60 track.style.transition = 'none'; 61 track.style.transform = 'translateX(0px)'; 62 void track.offsetWidth; 63 } 64 animating = false; 65 }; 66 track.addEventListener('transitionend', onEnd); 67 } 68 nextBtn.addEventListener('click', go); 69 70 function sync(){ 71 if (mq.matches) { 72 track.style.transition = 'none'; 73 track.style.transform = ''; 74 } else { 75 idx = 0; 76 track.style.transition = 'none'; 77 track.style.transform = 'translateX(0px)'; 78 } 79 } 80 if (mq.addEventListener) mq.addEventListener('change', sync); 81 window.addEventListener('resize', function(){ 82 if (!mq.matches) { 83 track.style.transition = 'none'; 84 track.style.transform = 'translateX(-' + (idx * stepPx()) + 'px)'; 85 } 86 }); 87 }); 88})();
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.