인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

조장환님의 프로필 이미지
조장환

작성한 질문수

애플 웹사이트 인터랙션 클론!

playanimation 관련 질문드립니다.

작성

·

612

0

안녕하세요. 강사님 강의 잘 듣고 있습니다. 현재 쇼핑몰을 제작 중인데 에어팟 프로 상세페이지를 보고 잘 만들었다는 생각을 많이 했습니다. 그러다 강사님 강의를 알게 되었고 이렇게 배울 수 있는 기회를 주셔서 감사합니다. 강의는 전체적으로 한번 듣고 다시 한 강의씩 들으면서 페이지 제작 중에 있는데 문제가 있어 이렇게 질문을 남깁니다.

일단 저는 아임웹을 이용해서 홈페이지를 만드는 중이고 '현재 활성씬  반영하기'까지 완료하고 콘솔창을 통해 제대로 작동하는 것까지 확인했습니다.

헌데 playanimation 함수를 통해 case들을 작성하고 잘 작동하는지 console.log콘솔창에 띄어보려고 해도 아무런 반응이 없습니다. 빨간색으로 어떤 에러도 표시가 안되어서 일단 무시하고 다음 내용들을 작성하여도 콘솔창에 모두 반응이 없습니다.

console.log('0' play); console.log('1' play);console.log('2' play);console.log('3' play); console.log(messageA_opacity_0, messageA_opacity_1);

아임웹 특성상 코드위젯창을 통해 html, css, 자바 파일들을 한꺼번에 작성하고 있고, 또한 내비쪽은 아임웹쪽에서 이미 자체적으로 구성이 되어 있기 때문에 내비들은 제외하고 작성하고 있는데 이 과정에서 혹시 문제가 발생했을 수도 있는지 아니면 어떤 문제때문인지 알려주시면 감사하겠습니다!

 
	  	function playAnimation() {	
		  
		 	switch (currentScene) {
			case 0:							
				console.log('0 play');
				break;
			case 1:			
				console.log('1 play');
				break;
			case 2:			
				console.log('2 play');
				break;				
			case 3:			
				console.log('3 play');
				break;				
			
			}
	  }

답변 6

0

1분코딩님의 프로필 이미지
1분코딩
지식공유자

아, 이미지 이름이 자동으로 랜덤이라면 해당 서버에서는 사용이 어렵겠네요.
이미지가 로드 되는 순서도 랜덤이기 때문에 순서를 보장해서 무언가 처리해주기는 어려우니 다른 서버를 이용하는 방법 외에 딱 하고 떠오르는게 없네요^^; 혹시 좋은 방법이 생각나면 말씀 드리도록 하겠습니다.

0

조장환님의 프로필 이미지
조장환
질문자

감사합니다. 꼼꼼하게 작성한다고 했는데 그 부분을 놓쳤네요.. 잘 해결되어서 스크롤 애니메이션쪽은 마무리가 되었습니다.

헌데 이번엔 동영상 인터렉션을 진행 중인데 아임웹이 FTP지원을 하지 않기에 게시판쪽에 이미지를 올리면 서버에 저장되고 이미지 주소를 알려줍니다. 예를 들어 제 이미지파일 이름이 ABC001에서ABC900까지 900장이면 이면 링크 주소는

</p><p style="text-align: left"><img class="fr-dii" src="https://cdn.imweb.me/upload/S201912171516c57e2fd17/6f435f3b52d27.jpg"></p>

<p style="text-align: left"><img class="fr-dii" src="https://cdn.imweb.me/upload/S201912171516c57e2fd17/3da40b1be7c5c.jpg"></p>

<p style="text-align: left"><img class="fr-dii" src="https://cdn.imweb.me/upload/S201912171516c57e2fd17/c70b65d88c99b.jpg"></p>

이처럼 랜덤으로 주소가 저장되는 것 같아서 강의내용처럼 순차적으로 불러오는게 어려울 듯 합니다.

해결방안은 아무래도 아임웹 쪽과 문의를 해봐야 할 것 같은데 이 부분에 대해서 의견이 있으신지 문의드립니다. 

감사합니다. 

0

1분코딩님의 프로필 이미지
1분코딩
지식공유자

스크롤 이벤트가 발생할 때마다 실행되는 함수인 scrollLoop 함수에서 playAnimation을 호출해주어야 하는데, 그부분이 빠져있습니다^^
함수 끝 부분에 호출하는 부분을 넣어주세요~

function scrollLoop() {

    // 코드..

    playAnimation();

}

0

1분코딩님의 프로필 이미지
1분코딩
지식공유자

네 하나하나 살펴보아야해서 시간이 조금 걸릴 수 있을 것 같습니다.
제가 아임웹을 사용해보지 않아서 어떤 영향을 미치는지를 모르겠네요^^;
좀 살펴보고 다시 댓글 드릴게요~

0

조장환님의 프로필 이미지
조장환
질문자

늦은시간인데도 친철하게 답장 주셔서 감사합니다. 말씀하신 것처럼 switch문 위에 console.log를 실행해봤지만 반응이 없는 것 같아서요. 혹시 몰라서 현재 작성중인 전체 문서 첨부드립니다.

스크롤 애니메이션 구현전까지는 강의내용과 같이  설정이 된 것을 확인했는데요. 

(씬별로 sticky 및 normal 태그들이 잘 나타나고,  스크롤할때마다 show-scene-0,1,2,3도 잘 바뀌고 , 새로고침할때도 씬별로 show-scene-0,1,2,3이 잘 설정되는 것까지 확인했습니다.)

전체문서의 메뉴 및 footer가 이미 아임웹에서 설정되어있고 그 중간에 아래 문서와 같이 코딩 위젯을 추가하는거라 강사님 강의내용 중 제외시킨 것이 몇가지 있습니다.

실례가 안된다면 어떻게 해결해야 되는지 알려주시면 감사하겠습니다.

<style>

.body {
overflow-x: hidden;
color: rgb(29, 29, 31);
letter-spacing: -0.05em;
background: white;
}
.p {
line-height :1.6;
}

.scroll-section {
border: 1px solid red ;
padding-top : 50vh;  
}
#scroll-section-0 h1 {
font-size: 4rem;
text-align: center;
}
.main-message {
display: flex;
align-items: center;
justify-content: center;
margin: 5px 0;
height: 3em;
font-size: 2.5rem;
}

.main-message p {
font-weight: bold;
text-align: center;
line-height: 1.2;
}
.main-message small {
display: block;
margin-bottom: 0.5em;
font-size: 1.2rem;
}

#scroll-section-2 .main-message {
font-size: 3.5rem;
}

.description {
max-width: 1000px;
padding: 0 1rem;
margin: 0 auto;
font-size: 1.2rem;
color: #888;
}
.description strong {
float: left;
margin-right: 0.2em;
font-size: 3rem;
color: rgb(29, 29, 31);
}
.desc-message {
width: 50%;
font-weight: bold;

}
.pin {
width: 1px;
height: 100px;
background: rgb(29, 29, 31);
}
.mid-message {
  max-width: 1000px;
margin: 0 auto;
padding: 0 1rem;
font-size: 2rem;
color: #888;
}
.mid-message strong {
color: rgb(29, 29, 31);
}
.canvas-caption {
max-width: 1000px;
margin: 0 auto;
padding: 0 1rem;
font-size: 1.2rem;
color: #888;
}
.sticky-elem {
  display: none;
position: fixed;
top: 0;
  left: 0;
  width: 100%;
}
@media (min-width: 1024px) {
#scroll-section-0 h1 {
  font-size: 9vw;
}
.main-message {
  font-size: 4vw;
}
.description {
  padding: 0;
  font-size: 2rem;
}
.description strong {
  font-size: 6rem;
}
#scroll-section-2 .main-message {
  font-size: 6vw;
}
.main-message small {
  font-size: 1.5vw;
}
.desc-message {
  width: 20%;
}

.mid-message {

  font-size: 4vw;
}
.canvas-caption {
  
  font-size: 2rem;
}
}

#show-scene-0 #scroll-section-0 .sticky-elem,
#show-scene-1 #scroll-section-1 .sticky-elem,
#show-scene-2 #scroll-section-2 .sticky-elem,
#show-scene-3 #scroll-section-3 .sticky-elem {
display: block;
}

</style>

<body>
  <section class="scroll-section" id= "scroll-section-0">
    <h1>TheBlacks</h1>
    <div class="sticky-elem main-message a">
      <p>더욱 강력한 <br>제품 </p>
    </div>
    <div class="sticky-elem main-message b">
      <p>주변 맛을 느끼게 해주는<br>주변 맛 허용 모드</p>
    </div>
    <div class="sticky-elem main-message c">
      <p>온종일 편안한<br>맞춤형 손잡이</p>
    </div>
    <div class="sticky-elem main-message d">
      <p>새롭게 입가를<br>찾아온 매혹</p>
    </div>
  </section>
  <section class="scroll-section" id="scroll-section-1">
    <p class="description">
      <strong>보통 스크롤 영역</strong>
      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae est ipsa minima, eligendi error cum vel dolorum pariatur officia facilis ipsam voluptatibus ad quasi porro quod quisquam quidem tempora accusantium accusamus, quaerat aliquam velit exercitationem incidunt? Id vitae quisquam saepe quasi accusantium tempore enim! Aperiam dolorum a vero repellat dolor, inventore ab odit totam molestias expedita? Enim quia dolor maiores veniam ea! Quam illo, est incidunt ipsa reiciendis modi quisquam reprehenderit fuga velit dolorem odit sequi autem blanditiis, ullam commodi quibusdam. Accusamus repellat aperiam quis neque laudantium, dignissimos hic nisi magnam praesentium enim beatae sint architecto cum numquam inventore rerum animi sed nostrum quae delectus, voluptas molestiae placeat aliquid! Vel quaerat error officiis magnam dolorum iste aspernatur at est! Quo, consequuntur? Reiciendis, dolor. Quo at cupiditate in iure obcaecati voluptatum vel ea! Ab vel harum facere hic fuga ducimus sapiente dolore dolorem, nobis sint perferendis cumque esse! Omnis fugiat sint error laborum eveniet labore nam ducimus quisquam in repudiandae impedit excepturi dignissimos tenetur libero placeat rerum maxime tempore, aut nihil. Qui, quam? Voluptate fuga possimus itaque quas nesciunt iste, facilis mollitia illo qui placeat temporibus inventore obcaecati. Recusandae, sequi dignissimos in natus eum maiores dolorem, deleniti nobis accusantium, aspernatur beatae.
    </p>
  </section>
  <section class="scroll-section" id="scroll-section-2">

    <div class="sticky-elem main-message">
      <p>
        <small>편안한 촉감</small>
        입과 하나 되다
      </p>
    </div>
    <div class="sticky-elem desc-message">
      <p>
        편안한 목넘김을 완성하는 디테일한 여러 구성 요소들, 우리는 이를 하나하나 새롭게 살피고 재구성하는 과정을 거쳐 새로운 수준의 머그, AirMug Pro를 만들었습니다. 입에 뭔가 댔다는 감각은 어느새 사라지고 오롯이 당신과 음료만 남게 되죠.
      </p>
      <div class="pin"></div>
    </div>
    <div class="sticky-elem desc-message">
      <p>
        디자인 앤 퀄리티 오브 스웨덴,<br>메이드 인 차이나
      </p>
      <div class="pin"></div>
    </div>
  </section>
  <section class="scroll-section" id="scroll-section-3">
    <p class="mid-message">
      <strong>Retina 머그</strong><br>
      아이디어를 광활하게 펼칠<br>
      아름답고 부드러운 음료 공간.
    </p>
    <p class="canvas-caption">
      Lorem ipsum dolor, sit amet consectetur adipisicing elit. Eveniet at fuga quae perspiciatis veniam impedit et, ratione est optio porro. Incidunt aperiam nemo voluptas odit quisquam harum in mollitia. Incidunt minima iusto in corporis, dolores velit. Autem, sit dolorum inventore a rerum distinctio vero illo magni possimus temporibus dolores neque adipisci, repudiandae repellat. Ducimus accusamus similique quas earum laborum. Autem tempora repellendus asperiores illum ex! Velit ea corporis odit? Ea, incidunt delectus. Sapiente rerum neque error deleniti quis, et, quibusdam, est autem voluptate rem voluptas. Ratione soluta similique harum nihil vel. Quas inventore perferendis iusto explicabo animi eos ratione obcaecati.
    </p>
  </section>

</body>

<script>
(() => {
  
  let yOffset = 0;
  let prevScrollHeight = 0;
  let currentScene = 0;
  
  const sceneInfo = [
  {
    // 0
    type: 'sticky',
    heightNum: 5, // 브라우저 높이의 5배로 scrollHeight 세팅
    scrollHeight: 0,
    objs: {
      container: document.querySelector('#scroll-section-0'),
      messageA: document.querySelector('#scroll-section-0 .main-message.a'),
      messageB: document.querySelector('#scroll-section-0 .main-message.b'),
      messageC: document.querySelector('#scroll-section-0 .main-message.c'),
      messageD: document.querySelector('#scroll-section-0 .main-message.d'),
    },
    values: {
      messageA_opacity: [0, 1]
    }
  },
  { 
      // 1
    type: 'normal',
    heightNum: 5,
    scrollHeight: 0,
    objs: {
      container: document.querySelector('#scroll-section-1')
    }
  },
  {
    // 2
    type: 'sticky',
    heightNum: 5,
    scrollHeight: 0,
    objs: {
      container: document.querySelector('#scroll-section-2')
    },
    values: {

    }
  },
  {
    // 3
    type: 'sticky',
    heightNum: 5,
    scrollHeight: 0,
    objs: {
      container: document.querySelector('#scroll-section-3')

    },
    values: {

    }
  }
]; 

  function setLayout() {
  for(let i = 0; i < sceneInfo.length;i++) {
  sceneInfo[i].scrollHeight = sceneInfo[i].heightNum *window.innerHeight;
    sceneInfo[i].objs.container.style.height = `${sceneInfo[i].scrollHeight}px`;
  }
  
  yOffset = window.pageYOffset;
  let totalScrollHeight = 0;
  for (let i =0; i < sceneInfo. length; i++){
     totalScrollHeight += sceneInfo[i].scrollHeight;
     if (totalScrollHeight >= yOffset) {
        currentScene = i;
        break;
      } 
     }
    document.body.setAttribute('id',`show-scene-${currentScene}`);
  }
  
  function calcValues (values, currentYOffset) {
   let	rv;
  let scrollRatio = currentYOffset / sceneInfo[currentScene].scrollHeight;
  
  rv= parseInt(scrollRatio * 300);
  
  return rv;
  }
  function scrollLoop() {
   
    prevScrollHeight = 0;
    for (let i = 0; i < currentScene; i++) {
      prevScrollHeight += sceneInfo[i].scrollHeight;   
    }
  if (yOffset > prevScrollHeight + sceneInfo[currentScene].scrollHeight) {
    currentScene++;
    //	document.body.setAttribute('id',`show-scene-${currentScene}`);
  }

  if (yOffset < prevScrollHeight) {
       if (currentScene === 0) return;
      currentScene--;
    //	document.body.setAttribute('id',`show-scene-${currentScene}`);
    }
  //console.log(currentScene);
    document.body.setAttribute('id',`show-scene-${currentScene}`);
  }
  
      
  function playAnimation (){
  
   console.log(currentScene);
    
    switch (currentScene) {
      case 0:
      //console.log('0 play');
      break;
      case 1:
      //console.log('1 play');
      break;
      case 2:
      //console.log('2 play');
      break;
      case 3:
      //console.log('3 play');
      break;
    
    }
  
  }	  

  
  window.addEventListener('scroll', () => {
    yOffset = window.pageYOffset;
      scrollLoop();
  });
  window.addEventListener('load', setLayout);
window.addEventListener('resize', setLayout);



} )();
</script>






0

1분코딩님의 프로필 이미지
1분코딩
지식공유자

switch문 바깥에서 한번 console.log(currentScene); 를 실행해 보시겠어요?
현재 코드는 혹시 다른 이유로 currentScene에 0~3의 값 외의 값이 들어가 있다면 console.log가 실행이 안되는 상황이라
일단 currentScene에 알맞는 값이 들어갔는지를 확인해 보는 것이 좋을 것 같습니다^^

function playAnimation() {

    // 여기에서 출력해 보세요
    console.log(currentScene);

    switch (currentScene) {

        .......(코드)

    }

}

조장환님의 프로필 이미지
조장환

작성한 질문수

질문하기