XBOX 게임패스 PC 요금·혜택 총정리! 얼티밋과 차이까지 비교 분석
XBOX 게임패스 PC 가입 전 필독! 요금제, 얼티밋 혜택, 클라우드 게임까지 2025년 최신 정보로 정리했습니다.게임 하나에 7만 원, 8만 원씩 지불하던 시대는 지났습니다.2025년, 게임을 '구독'하는 게 대세인 지금, XBOX 게임패스 PC는 가장 합리적인 선택지로 자리 잡았습니다.이 글에서는 XBOX 게임패스 가입 방법부터 요금제 종류, 얼티밋과 PC 게임패스의 차이점, 추천 타이틀, 클라우드 게임 기능까지, 직접 사용해본 경험을 바탕으로 꼼꼼히 정리해 드리겠습니다.XBOX 게임패스란? – 게임 구독의 혁명XBOX 게임패스는 Microsoft에서 제공하는 게임 구독 서비스로, 매달 일정 금액만 지불하면 수백 개의 PC 및 콘솔 게임을 자유롭게 다운로드 및 플레이할 수 있습니다. 항목 설명 이..
2025. 7. 25.
비비드라라러브 뜻 완전정리|이찬혁의 가사 속 철학, 이렇게 해석됩니다
이찬혁 신곡 비비드라라러브 뜻과 가사 해석 정리! 생생한 사랑은 무엇을 말할까요? 현실과 이상, 그 경계의 감성을 파헤칩니다.“빛나는 눈으로 너는 말했지, Vivid lala love.”이 가사 한 줄에 가슴이 먹먹해졌던 분들, 저만 그런 건 아니었을 겁니다.이찬혁의 신곡 비비드라라러브(Vivid Lala Love)는 단순한 사랑 노래를 넘어, 현실과 이상 사이에서 흔들리는 감정들을 선명하게 그려냅니다.그럼 이 독특한 제목과 가사 속에 담긴 진짜 뜻과 메시지는 무엇일까요?오늘 이 글 하나로, 이 노래를 다시 들을 때 완전히 다르게 느껴지실 겁니다.Vivid lala love, 이찬혁의 철학이 담긴 제목▷ ‘Vivid lala love’의 언어적 구조 해석Vivid: 생생한, 강렬한Lala: 꿈, 환상, ..
2025. 7. 24.
2025 러닝화 계급도 완전정복|나이키부터 아식스까지 최신 순위 정리
2025 러닝화 계급도를 브랜드별로 완벽 정리했습니다. 나이키, 아디다스, 뉴발란스, 아식스 러닝화 선택 가이드로 성능과 가성비까지 확인해 보세요.2025년, 러닝화 시장의 격전이 시작됐습니다.마라톤 대회부터 일상 속 운동까지.러너들에게 최적의 퍼포먼스를 제공하는 러닝화를 어떻게 선택해야 할까요?“정답은 러닝화 계급도 안에 있습니다.”러닝화 계급도 2025, 어떻게 나뉘나?러닝화계급도2025는 단순 브랜드 순위가 아닙니다.성능, 쿠셔닝, 반발력, 가격 대비 성능, 카본플레이트 적용 여부 등 다각도로 비교하여 정리한 등급 체계입니다.주요 등급은 다음과 같습니다.월드클래스 (마라톤 대회용)엘리트 트레이닝 (상급자용)트레이닝/데일리 (중급자 이상)입문자/가성비 (일상용, 걷기용)“저도 처음엔 어떤 걸 사야 할..
2025. 7. 22.
setTimeout(function () {
const dragSensitivity = 0.55; // 드래그 민감도
const clickTolerance = 0; // 클릭 간주 기준 (px), 0: 클릭 시 이동 안함. 클릭 시 이동하려면 1~3값 설정 고려.
const dragRatioThreshold = 0.55; // 배너 너비 대비 드래그 비율, 배너 드래그 후 드롭 시.
const newWindow = 1; // 1: 새 창, 0: 현재 창
const bannerConfigs = [
{
selector: '.sliding-banner-300',
width: 300,
height: 300,
id: '940041',
trackingCode: 'AF2787934', // 본인의 추적 코드로 대체
subId: '',
tsource: '',
background: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/600x600-back2.jpg',
cover: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/WOW-30Ox25O-cover-left.png',
arrowIcon: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/arrowbtn.png',
dragDirection: 'left'
},
{
selector: '.sliding-banner-150',
width: 320,
height: 150,
id: '940041',
trackingCode: 'AF2787934', // 본인의 추적 코드로 대체
subId: '',
tsource: '',
background: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/640x300-back2.jpg',
cover: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/WOW-32Ox15O-cover-left.png',
arrowIcon: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/arrowbtn.png',
dragDirection: 'left'
},
{
selector: '.sliding-banner-250',
width: 300,
height: 250,
id: '940041',
trackingCode: 'AF2787934', // 본인의 추적 코드로 대체
subId: '',
tsource: '',
background: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/600x500-back2.jpg',
cover: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/WOW-30Ox25O-cover-left.png',
arrowIcon: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/arrowbtn.png',
dragDirection: 'left'
},
{
selector: '.sliding-banner-280',
width: 336,
height: 280,
id: '940041',
trackingCode: 'AF2787934', // 본인의 추적 코드로 대체
subId: '',
tsource: '',
background: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/600x500-back3.jpg',
cover: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/WOW-30Ox25O-cover-right.png',
arrowIcon: 'https://tistory1.daumcdn.net/tistory/8074023/skin/images/arrow-right.png',
dragDirection: 'right'
}
];
const coupangLink = 'https://link.coupang.com/a/c2PToW'; // 본인의 간편 링크로 대체 📍
function openLink(link) {
if (newWindow) {
window.open(link, '_blank');
} else {
history.replaceState(null, null, window.location.href);
window.location.href = link;
}
}
function generateIframeURL(config) {
return `https://ads-partners.coupang.com/widgets.html?id=${config.id}&template=carousel&trackingCode=${config.trackingCode}&subId=${encodeURIComponent(config.subId || '')}&width=${config.width}&height=${config.height}&tsource=${encodeURIComponent(config.tsource || '')}`;
}
function createBanner(config) {
const iframeURL = generateIframeURL(config);
const wrapper = document.createElement('div');
wrapper.innerHTML = `
당겨주세요!
`;
return wrapper;
}
// trigger event update
function setupDragEvents(dragTarget, animatedBanner, threshold, link, direction) {
let startX = 0, diffX = 0, triggered = false, isDragging = false;
function getClientX(e) {
return e.type.includes('touch') ? e.touches[0].clientX : e.clientX;
}
function triggerOnce() {
if (triggered) return;
triggered = true;
animatedBanner.style.transform = 'translateX(0)';
animatedBanner.classList.add('active');
openLink(link);
}
function startDrag(e) {
if (e.type.startsWith('mouse') && e.button !== 0) return;
isDragging = true;
startX = getClientX(e);
diffX = 0;
triggered = false;
animatedBanner.classList.remove('active');
e.preventDefault();
}
function onDrag(e) {
if (!isDragging) return;
const currentX = getClientX(e);
diffX = currentX - startX;
if ((direction === 'left' && diffX < 0) || (direction === 'right' && diffX > 0)) {
animatedBanner.style.transform = `translateX(${diffX}px)`;
if (Math.abs(diffX) > threshold) {
triggerOnce();
}
e.preventDefault();
}
}
function endDrag() {
if (!isDragging) return;
isDragging = false;
const dragRatio = Math.abs(diffX) / dragTarget.offsetWidth;
if (Math.abs(diffX) < clickTolerance || (
dragRatio >= dragRatioThreshold &&
((direction === 'left' && diffX < 0) || (direction === 'right' && diffX > 0))
)) {
triggerOnce();
} else {
animatedBanner.style.transform = 'translateX(0)';
animatedBanner.classList.add('active');
}
diffX = 0;
}
dragTarget.addEventListener('mousedown', startDrag);
dragTarget.addEventListener('mousemove', onDrag);
dragTarget.addEventListener('mouseup', endDrag);
dragTarget.addEventListener('mouseleave', endDrag);
dragTarget.addEventListener('touchstart', startDrag, { passive: false });
dragTarget.addEventListener('touchmove', onDrag, { passive: false });
dragTarget.addEventListener('touchend', endDrag);
}
// end
bannerConfigs.forEach(config => {
const targets = document.querySelectorAll(config.selector);
if (targets.length === 0) return;
targets.forEach(target => {
target.innerHTML = '';
const banner = createBanner(config);
target.appendChild(banner);
const customBox = banner.querySelector('.customBox');
const animatedBanner = banner.querySelector('.customBanner');
const threshold = config.width * dragSensitivity;
setupDragEvents(customBox, animatedBanner, threshold, coupangLink, config.dragDirection);
});
});
}, 100);