미해결
애플 웹사이트 인터랙션 클론!
안녕하세요 강의 잘 듣고 있습니다. 제가 강의를 보면서 따라하던 도중 이상하게 검은색 박스는 생기지만 옆으로 움직이면서 서서히 사라지는 부분이 안 됌니다. 그런데 아무리 찾아보아도 문제의 원인을 모르겠습니다.(제가 변수의 이름을 제가 알기 쉽게 바꾼게 몇개 존재합니다.) (() => { let yoffset = 0; let prevScrollHeight = 0;//이전 스크롤 섹션의 높이를 담음 let currentScene = 0 //현재 활성화된 씬 let enterScene = false; const sectionInfo = [ //0 { type : 'sticky', heightNum : 5, height : 0, objs : { section : document.querySelector('#scroll-section-1'), MessageA : document.querySelector('#scroll-section-1 .main-message.a'), MessageB : document.querySelector('#scroll-section-1 .main-message.b'), MessageC : document.querySelector('#scroll-section-1 .main-message.c'), MessageD : document.querySelector('#scroll-section-1 .main-message.d'), canvas : document.querySelector('#scroll-section-1 #first_canvas'), ctx : document.querySelector('#scroll-section-1 #first_canvas').getContext('2d'), }, values : { //비디오 정보 img_values : 300, img_obj : [], imgeSequence : [0,300], canvas_opacity : [1,0,{start : 0.9, end : 1}], //투명도 조절 messageA_fade_in : [0,1,{start : 0.1, end : 0.2}], messageB_fade_in : [0,1,{start : 0.3, end : 0.4}], messageC_fade_in : [0,1,{start : 0.5, end : 0.6}], messageA_fade_out : [1,0,{start : 0.25, end : 0.3}], messageB_fade_out : [1,0,{start : 0.45, end : 0.5}], messageC_fade_out : [1,0,{start : 0.65, end : 0.7}], //transform 조절 messageA_transform_in : [20,0,{start: 0.1, end : 0.2}], messageB_transform_in : [20,0,{start: 0.3, end : 0.4}], messageC_transform_in : [20,0,{start: 0.5, end : 0.6}], messageA_transform_out : [0,-20,{start: 0.25, end : 0.3}], messageB_transform_out : [0,-20,{start: 0.45, end : 0.5}], messageC_transform_out : [0,-20,{start: 0.65, end : 0.7}], } }, //1 { type : 'normal', heightNum : 5, height : 0, objs : { section : document.querySelector('#scroll-section-2'), }, values : { } }, //2 { type : 'sticky', heightNum : 5, height : 0, objs : { section : document.querySelector('#scroll-section-3'), desc_messageA: document.querySelector('#scroll-section-3 .desc-message.a'), desc_messageB : document.querySelector('#scroll-section-3 .desc-message.b'), desc_messageC : document.querySelector('#scroll-section-3 .desc-message.c'), canvas : document.querySelector('#scroll-section-3 #second_canvas'), ctx : document.querySelector('#scroll-section-3 #second_canvas').getContext('2d'), }, values : { img_values : 960, img_obj : [], imgeSequence : [0,960], canvas_fade_in : [0,1, {start : 0.05, end : 0.1}], canvas_fade_out : [1,0, {start : 0.9, end : 1}], //투명도 desc_messageA_fade_in : [0 , 1, {start : 0.1, end : 0.2}], desc_messageB_fade_in : [0 , 1, {start : 0.3, end : 0.4}], desc_messageC_fade_in : [0 , 1, {start : 0.5, end : 0.6}], desc_messageA_fade_out : [1 , 0, {start : 0.25, end : 0.3}], desc_messageB_fade_out : [1 , 0, {start : 0.45, end : 0.5}], desc_messageC_fade_out : [1 , 0, {start : 0.65, end : 0.7}], //transform 조절 desc_messageA_transform_in : [20,0,{start : 0.1, end : 0.2}], desc_messageB_transform_in : [20,0,{start : 0.3, end : 0.4}], desc_messageC_transform_in : [20,0,{start : 0.5, end : 0.6}], desc_messageA_transform_out : [0,-20,{start : 0.25, end : 0.3}], desc_messageB_transform_out : [0,-20,{start : 0.45, end : 0.5}], desc_messageC_transform_out : [0,-20,{start : 0.65, end : 0.7}], } }, //3 { type : 'sticky', heightNum : 5, height : 0, objs : { section : document.querySelector('#scroll-section-4'), mainMessageA : document.querySelector('mid-message.a'), canvas : document.querySelector('#third_canvas'), ctx : document.querySelector('#third_canvas').getContext('2d'), }, values : { imgsrc : [ './images/blend-image-1.jpg', './images/blend-image-2.jpg' ], discrimination : 0, img_obj : [], recet1X : [0,0, {start: 0, end: 0}], recet2X : [0,0, {start: 0, end: 0}], rectscrollY : 0, } } ] function setHeight() { yoffset = window.pageYOffset; let totalHeight = 0; //각 섹션별 높이를 전부 담는 변수 const canvasRatio = window.innerHeight / 1080; //마지막 캔버스를 제외한 나머지 캔버스의 비율 for(let i = 0; i < sectionInfo.length; i++){ let sectionNum = sectionInfo[i]; let calcHeight = 0; if( sectionNum.type === 'sticky' ){ calcHeight = window.innerHeight * sectionNum.heightNum; sectionNum.height = calcHeight; sectionNum.objs.section.style.height = `${calcHeight}px` }else{ calcHeight = sectionInfo[i].objs.section.offsetHeight; sectionNum.height = calcHeight; } sectionNum.objs.section.style.height = `${calcHeight}px` } for(let i = 0; i < sectionInfo.length; i++){ totalHeight += sectionInfo[i].height; if( totalHeight >= window.pageYOffset){ currentScene = i; break; } } sectionInfo[0].objs.canvas.style.transform = `translate3d(-50%,-50%,0) scale(${canvasRatio})`; sectionInfo[2].objs.canvas.style.transform = `translate3d(-50%,-50%,0) scale(${canvasRatio})`; document.body.id = `show-scene-${currentScene}`; } function setCanvasImage() { let imgElem; let imgElem2; let imgElem3; for (let i = 0; i < sectionInfo[0].values.img_values; i++){ imgElem = new Image(); imgElem.src = `./video/001/IMG_${6726 + i}.jpg`; sectionInfo[0].values.img_obj.push(imgElem); } for (let i = 0; i < sectionInfo[2].values.img_values; i++){ imgElem2 = new Image(); imgElem2.src = `./video/002/IMG_${7027 + i}.jpg`; sectionInfo[2].values.img_obj.push(imgElem2); } for (let i = 0; i < sectionInfo[3].values.imgsrc.length; i++){ imgElem3 = new Image(); imgElem3.src = sectionInfo[3].values.imgsrc[i]; sectionInfo[3].values.img_obj.push(imgElem3); } } setCanvasImage(); function scrollLoop() { enterScene = false; prevScrollHeight = 0; for(let i = 0; i < currentScene; i++){ prevScrollHeight += sectionInfo[i].height; } if(yoffset > prevScrollHeight + sectionInfo[currentScene].height){ enterScene = true; currentScene++; document.body.id = `show-scene-${currentScene}`; } if ( yoffset < prevScrollHeight ){ if(yoffset < 0) return; enterScene = true; currentScene--; document.body.id = `show-scene-${currentScene}`; } if ( enterScene ) return; playAnimation(); } //애니메이션 처리 값과 현재 씬에서의 스크롤 비율을 넘겨받음 function calcValues(values,currentYoffset){ let rv;//값을 계산해 리턴해줄 변수 const scrollHeight = sectionInfo[currentScene].height; const scrollRatio = currentYoffset / sectionInfo[currentScene].height;//현재씬의 스크롤 비율 if ( values.length === 3 ){ //start ~ end 사이의 애니메이션 실행 const partScrollStart = values[2].start * scrollHeight; const partScrollEnd = values[2].end * scrollHeight; const partScrollHeight = partScrollEnd - partScrollStart; if( currentYoffset >= partScrollStart && currentYoffset <= partScrollEnd ){ rv = (currentYoffset - partScrollStart) / partScrollHeight * (values[1] - values[0] ) + values[0]; }else if(currentYoffset < partScrollStart){ rv = values[0] } else if ( currentYoffset > partScrollEnd ){ rv = values[1]; } }else{ rv = scrollRatio * (values[1] - values[0] ) + values[0]; } return rv; } function playAnimation() { const objs = sectionInfo[currentScene].objs; const values = sectionInfo[currentScene].values; const currentYoffset = yoffset - prevScrollHeight; const scrollHeight = sectionInfo[currentScene].height; const scrollRatio = currentYoffset / scrollHeight; switch(currentScene){ case 0: if ( scrollRatio <= 0.22 ){ objs.MessageA.style.opacity = calcValues(values.messageA_fade_in,currentYoffset); objs.MessageA.style.transform = `translateY(${calcValues(values.messageA_transform_in,currentYoffset)}%)`; } else{ objs.MessageA.style.opacity = calcValues(values.messageA_fade_out,currentYoffset); objs.MessageA.style.transform = `translateY(${calcValues(values.messageA_transform_out,currentYoffset)}%)`; } if(scrollRatio < 0.43){ objs.MessageB.style.opacity = calcValues(values.messageB_fade_in,currentYoffset); objs.MessageB.style.transform = `translateY(${calcValues(values.messageB_transform_in,currentYoffset)}%)`; }else{ objs.MessageB.style.opacity = calcValues(values.messageB_fade_out,currentYoffset); objs.MessageB.style.transform = `translateY(${calcValues(values.messageB_transform_out,currentYoffset)}%)`; } if( scrollRatio < 0.63 ){ objs.MessageC.style.opacity = calcValues(values.messageC_fade_in,currentYoffset); objs.MessageC.style.transform = `translateY(${calcValues(values.messageC_transform_in,currentYoffset)}%)`; }else{ objs.MessageC.style.opacity = calcValues(values.messageC_fade_out,currentYoffset); objs.MessageC.style.transform = `translateY(${calcValues(values.messageC_transform_out,currentYoffset)}%)`; } let imgeSequence = Math.floor(calcValues(sectionInfo[0].values.imgeSequence,currentYoffset)); objs.ctx.drawImage(values.img_obj[imgeSequence],0,0); objs.canvas.style.opacity = calcValues(values.canvas_opacity,currentYoffset); break; case 1: break; case 2: if( scrollRatio <= 0.22 ){ objs.desc_messageA.style.opacity = calcValues(values.desc_messageA_fade_in,currentYoffset); objs.desc_messageA.style.transform = `translate3d(-50%, ${calcValues(values.desc_messageA_transform_in,currentYoffset)}%, 0)`; } else{ objs.desc_messageA.style.opacity = calcValues(values.desc_messageA_fade_out,currentYoffset); objs.desc_messageA.style.transform = `translate3d(-50%, ${calcValues(values.desc_messageA_transform_out,currentYoffset)}%, 0)`; } if ( scrollRatio < 0.42 ){ objs.desc_messageB.style.opacity = calcValues(values.desc_messageB_fade_in,currentYoffset); objs.desc_messageB.style.transform = `translate3d(-50%, ${calcValues(values.desc_messageB_transform_in,currentYoffset)}%, 0)`; }else{ objs.desc_messageB.style.opacity = calcValues(values.desc_messageB_fade_out,currentYoffset); objs.desc_messageB.style.transform = `translate3d(-50%, ${calcValues(values.desc_messageB_transform_out,currentYoffset)}%, 0)`; } if ( scrollRatio < 0.62 ){ objs.desc_messageC.style.opacity = calcValues(values.desc_messageC_fade_in,currentYoffset); objs.desc_messageC.style.transform = `translate3d(-50%, ${calcValues(values.desc_messageC_transform_in,currentYoffset)}%, 0)`; }else{ objs.desc_messageC.style.opacity = calcValues(values.desc_messageC_fade_out,currentYoffset); objs.desc_messageC.style.transform = `translate3d(-50%, ${calcValues(values.desc_messageC_transform_out,currentYoffset)}%, 0)`; } if(scrollRatio < 0.5){ objs.canvas.style.opacity = calcValues(values.canvas_fade_in,currentYoffset); }else{ objs.canvas.style.opacity = calcValues(values.canvas_fade_out,currentYoffset); } let imageSequence2 = Math.floor(calcValues(values.imgeSequence,currentYoffset)); objs.ctx.drawImage(values.img_obj[imageSequence2],0,0); break; case 3: const widthRatio = window.innerWidth / objs.canvas.width; const heightRatio = window.innerHeight / objs.canvas.height; if ( widthRatio <= heightRatio ){ objs.canvas.style.transform = `scale(${heightRatio})`; }else{ objs.canvas.style.transform = `scale(${widthRatio})`; } const newWidth = document.body.offsetWidth / widthRatio//안쪽의 content영역의 width값을 구하기 위한 계산 const newheight = window.innerHeight / heightRatio//안쪽의 content영역의 높이를 구하기 위한 계산 const blockArea = newWidth * 0.15; values.recet1X[0] = (objs.canvas.width - newWidth) / 2; // 애니메이션 시작 지점을 계산 values.recet1X[1] = values.recet1X[0] - blockArea;//애니메이션 끝 지점을 계산 values.recet2X[0] = (values.recet1X[0] + newWidth) - blockArea; // 오른쪽 블록의 애니메이션 시작지점을 계산 values.recet2X[1] = values.recet2X[1] + blockArea//오른쪽 애니메이션의 끝 지점을 지정 if(!values.rectscrollY){ values.rectscrollY = objs.canvas.getBoundingClientRect().top; values.recet1X[2].end = values.rectscrollY / scrollHeight; values.recet2X[2].end = values.rectscrollY / scrollHeight; } objs.ctx.fillRect( parseInt(calcValues(values.recet1X, currentYoffset)), 0, parseInt(blockArea), objs.canvas.height ); objs.ctx.fillRect( parseInt(calcValues(values.recet2X, currentYoffset)), 0, parseInt(blockArea), objs.canvas.height ); break; } } window.addEventListener('resize',setHeight); window.addEventListener('scroll',() => { yoffset = window.pageYOffset; scrollLoop() }); window.addEventListener('load',() => { setHeight(); sectionInfo[0].objs.ctx.drawImage(sectionInfo[0].values.img_obj[0],0,0); sectionInfo[3].objs.ctx.drawImage(sectionInfo[3].values.img_obj[0],0,0); }); })();
인터랙티브-웹 svg HTML/CSS javascript 웹 디자인 클론코딩
김창규
2021-05-31T11:16:53.725Z
댓글 0
좋아요 0
조회수 274