inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

이미지 배경 문의

미해결

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

- 질문에 대한 답변은 강의자가 하는 경우도 있고, 수강생 여러분들이 해주시는 경우도 있습니다. 같이 도와가며 공부해요! :) - 작성하신 소스코드 자체의 오류보다는, 개념이나 원리가 이해되지 않는 부분을 질문해주시는게 좋습니다. 그대로 따라했는데 소스코드에서 버그가 나는 경우는 99%가 오타에 의한거라서, 완성된 소스랑 찬찬히 비교해보시면 직접 찾으실 수 있을 거예요. 개발자도구 console에 오류로 표시된 부분만 완성 코드에서 복사->붙여넣기를 해보시는 것도 방법입니다. - 먼저 유사한 질문이 있었는지 검색해보세요. 안녕하세요. 제가 스스로 영상을 찍어서 해보려고 하니 웹페이지 배경이 하얀색이라 영상 찍을때도 하얀색 바탕으로 하면 좋을거 같다고 생각이 들었는데요. 샘플 예제 동영상도 혹시 하얀색 배경에서 영상 촬영을 하신건지 아니면 프레임 추출해서 이미지를 배경제거를 해서 한건지 궁금해서요! 그리고 또 하나 요즘 애플에서는 스크롤이 아니라 부분적으로 영상처럼 작동하던데 그 기술도 인터랙티브 기술일까요? (아직 완강은 못해서 질문한 것일수도 있습니다)

  • HTML/CSS
  • javascript
  • 웹-디자인
  • svg
  • 인터랙티브-웹
  • 클론코딩
nhs0912 댓글 1 좋아요 0 조회수 97

svg 직접 그리기

미해결

SVG 마스터

선생님 svg 일러스트레이터말고 직접 그릴 수 있는 무료 툴이나 사이트 있을까요? 일러스트레이터는 돈내야해가지고.. 제가 가난해서요 ㅠㅠ

  • HTML/CSS
  • svg
김성관 댓글 1 좋아요 0 조회수 100

[크로스브라우징] safari에서 동영상 영역 미노출

미해결

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

안녕하세요. 공유해주신 자료를 보다가 보니 사파리 브라우저에서는 첫번째 동영상 영역이 크롬 브라우저와 다르게 영상이 없거나, 화면 스타일이 다르게 노출되는 것 같아서요. 오류인지 문의드립니다. apple-clone-v11/@simple-version/index.html apple-clone-v11/@ipad-stroke-effect/index.html

  • HTML/CSS
  • javascript
  • 웹-디자인
  • svg
  • 인터랙티브-웹
  • 클론코딩
hi 댓글 1 좋아요 0 조회수 142

vue강의는안하시나요?!

미해결

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

선생님 vue강의는 안하시나여? 너무 잘가르쳐 주셔서 프론트엔드쪽도 선생님한테 배우고싶네요!ㅎㅎ

  • HTML/CSS
  • javascript
  • 웹-디자인
  • svg
  • 인터랙티브-웹
  • 클론코딩
vcxzz33 댓글 1 좋아요 0 조회수 138

스크롤 속도에 따른 messageA_opacity_out

미해결

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

강사님처럼 똑같이 코드를 작성했음에도 불구하고 스크롤을 천천히 내리면 opacity가 0까지 잘 적용이되는데 스크롤을 빨리내리면 opacity가 0으로 빠지다가 그상태로 남아서 씬2까지 넘어가요. 혹시 왜그런지 알 수 있을까요?

  • HTML/CSS
  • javascript
  • 웹-디자인
  • svg
  • 인터랙티브-웹
  • 클론코딩
이상민 댓글 1 좋아요 0 조회수 139

drawImage(objs.videoImages[sequence], 0, 0); error

미해결

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

function setCanvasImages() { let imgElem; for(let i = 0; i < sceneInfo.values.videoImageCount; i++) { imgElem = new Image(); imgElem.src = `./images/picdiet 1/${1 + i}.jpg`; sceneInfo[0].objs.videoImages.push(imgElem); } // /home/ibmuser01/src/images/picdiet 1/1.jpg } setCanvasImages(); function setLayout() { // 각 스크롤 섹션의 높이 세팅 for (let i = 0; i < sceneInfo.length; i++) { if (sceneInfo[i].type === 'sticky') { sceneInfo[i].scrollHeight = sceneInfo[i].heightNum * window.innerHeight; } else if (sceneInfo[i].type === 'normal') { sceneInfo[i].scrollHeight = sceneInfo[i].objs.content.offsetHeight + window.innerHeight * 0.5; } 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; // 현재 씬(스크롤섹션)에서 스크롤된 범위를 비율로 구하기 const scrollHeight = sceneInfo[currentScene].scrollHeight; const scrollRatio = currentYOffset / scrollHeight; 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 = sceneInfo[currentScene].objs; const values = sceneInfo[currentScene].values; const currentYOffset = yOffset - prevScrollHeight; const scrollHeight = sceneInfo[currentScene].scrollHeight; const scrollRatio = currentYOffset / scrollHeight; switch (currentScene) { case 0: let sequence = Math.round(calcValues(values.imageSequence, currentYOffset)); objs.context.drawImage(objs.videoImages[sequence], 0, 0); if (scrollRatio <= 0.22) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.42) { // in objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.62) { // in objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.82) { // in objs.messageD.style.opacity = calcValues(values.messageD_opacity_in, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageD.style.opacity = calcValues(values.messageD_opacity_out, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_out, currentYOffset)}%, 0)`; } break; case 2: // console.log('2 play'); if (scrollRatio <= 0.25) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.57) { // in objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } else { // out objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } if (scrollRatio <= 0.83) { // in objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } else { // out objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } break; case 3: // console.log('3 play'); break; } } function scrollLoop() { enterNewScene = false; prevScrollHeight = 0; for (let i = 0; i < currentScene; i++) { prevScrollHeight += sceneInfo[i].scrollHeight; } if (yOffset > prevScrollHeight + sceneInfo[currentScene].scrollHeight){ enterNewScene = true; currentScene++; document.body.setAttribute('id', `show-scene-${currentScene}`); } if(yOffset < prevScrollHeight){ enterNewScene = true; if(currentScene === 0) return; currentScene--; document.body.setAttribute('id', `show-scene-${currentScene}`); } if(enterNewScene) return; playAnimation(); } window.addEventListener('scroll', () => { yOffset = window.pageYOffset; scrollLoop(); }); window.addEventListener('load', setLayout); window.addEventListener('resize', setLayout); })(); main.js:181 Uncaught TypeError: Failed to execute 'drawImage' on 'CanvasRenderingContext2D': The provided value is not of type '(CSSImageValue or HTMLCanvasElement or HTMLImageElement or HTMLVideoElement or ImageBitmap or OffscreenCanvas or SVGImageElement or VideoFrame)'. at playAnimation (main.js:181:30) at scrollLoop (main.js:292:9) at main.js:297:9 이러한 에러가 나요. 이미지 파일은 여기에 저장되어있슴돠.

  • HTML/CSS
  • javascript
  • 웹-디자인
  • svg
  • 인터랙티브-웹
  • 클론코딩
댓글 1 좋아요 0 조회수 113

텍스트 정렬에 대한 질문입니다.

해결됨

지금 바로 D3.js 시작하기 : 웹 데이터 시각화

실전처럼 막대 그래프 그리기(bar)에 대한 예제를 보는 도중에 바의 가운데에 텍스틀 위치할 때 나의 텍스트 길이를 기반으로 센터 정렬하는 방법은 없나요? 매번 if문으로 가운데로 정렬하는 방법밖에 없는건지 궁금하여 질문드립니다.

  • svg
김영준 댓글 1 좋아요 0 조회수 111

선생님 캔버스 width 크기는 이미지 크기에맞게 해줘야하나요?

미해결

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

선생님 캔버스 width 크기는 이미지 크기에맞게 해줘야하나요? 선생님은 <div class="sticky-elem sticky-elem-canvas"> <canvas id="video-canvas-0" width="1920" height="1080"></canvas> </div> 이렇게 주셨는데 만약 제가 따로 실습할때의 이미지 최대크기가 1280x720 이라면 캔버스 width 크기를 1280으로 해줘야하는게 맞나요? 예제 코드 그대로 쓰고 캔버스 width값 1920하니까 이미지가 왼쪽으로 좀 치우쳐져 있어서 어제오늘 계속 애쓰다가 캔버스 width값을 이미지 최대크기값만큼 1280으로 주니까 해결이됬어요.. 그러면 이제 궁금한게 모바일일때 화면에 꽉 채우게하고싶은데 어떻게 줘야할지 감이안잡힙니다 ㅠ-ㅠ

  • HTML/CSS
  • javascript
  • 웹-디자인
  • svg
  • 인터랙티브-웹
반가우면반갑다고해 댓글 0 좋아요 0 조회수 149

svg 태그 사용 방식 질문

미해결

지금 바로 D3.js 시작하기 : 웹 데이터 시각화

강사님, 안녕하세요. 수업 잘 듣고 있습니다. 강사님께서 svg 태그를 사용하는 두 가지 방식에 대해서 설명해주셨는데요. 1. 처음부터 svg 태그를 사용, 태그에 속성을 사용하는 방식 <svg width="500" height="500"></svg> <script> const svg = d3.select('svg'); </script> 2. div에 class 속성을 주고, class 속성을 통해 svg를 append 후, 속성 attribute 하는 방식 <div class="canvas"></div> <script> const svg = d3.select('.canvas') .append('svg') .attr('width', 1000) .attr('height', 1000); </script> 왜 2번 방식을 많이 쓰는지 궁금합니다. svg를 추가할 지의 여부 내지는 svg 태그의 속성 등을 동적으로 지정해주기 위함인지요?

  • svg
남윤지 댓글 1 좋아요 0 조회수 167

선생님 안녕하세요. 혹시 메인개발(?)분야가 뭔지 궁금합니다.

미해결

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

안녕하세요 선생님! 예전에 선생님 강의 청첩장강의랑 flex,grid, 기타 강의들 구매하고 들었던 학생입니다. 선생님은 메인개발분야가 뭔지 궁금합니당. 또 리액트 사용하시는지도 궁금합니다! 질문과는 무관한 여담이지만,, 최근 리액트로 프로젝트하면서 애니메이션 편하게 구현하기위해서 여러 라이브러리를 사용하고 또 gsap관련해서도 찾아보고 했었는데.. gsap로 이렇게 손쉽게 인터랙티브 애니메이션을 구현할 수있다고? 하면서 혁신이다! 라고 생각했었는데 보니깐 자체 서비스에서 결제 같은 기능이있을경우 (넷플릭스같은) gsap 프리미엄을 결제해서 사용해야하더라구요.. 그것도 연간 구독 시스템이고, 코딩하는 개발자 수에따라서 개별로 구매..ㅎㄷㄷ 그래서 돌고돌아 다시 선생님 곁으로왔습니다. 이 강의 듣다가 개인적인 일들이 겹쳐서 중간하차했었는데 다시 처음부터 차근차근 수강하고 복습해서 마스터해보려고합니닷.. 질문 요약 1: 선생님 메인분야가 뭐에요? 2: gsap에 관해서 의견이궁금합니다.

  • HTML/CSS
  • javascript
  • 웹-디자인
  • svg
  • 인터랙티브-웹
  • 클론코딩
반가우면반갑다고해 댓글 1 좋아요 0 조회수 233

SVG 파일 CSS 애니메이션

미해결

SVG 마스터

svg 파일로 트럼프카드 뒷면과 앞면엔 데이터패킷을 받아서 거기에 해딩하는 svg 파일을 매치시키려고 하고 있습니다 카드가 뒤집어지는 플립효과를 구현하고 싶은데 그중에서 마지막 카드를 뒤집을때 긴장감을 주기위해 실제로 카드게임을 할때처럼 카드 끝자락을 조금씩 들추면서 확인하듯 그런 방식으로 표현하고 싶은데 방법이 있을까요?

  • HTML/CSS
  • svg
mirage0720 댓글 1 좋아요 0 조회수 250

React에서 load 상태를 어떻게 감지할 수 있을까요?

미해결

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

안녕하세요. 강의 재미있게 완강하였습니다. Next.js에 애니메이션을 구현해보려고 하는데요. 현재는 load event 대신 useEffect안에서 기능들을 호출하는 방식으로 구현하였는데, useEffect는 DOM요소들이 생성이 완료되는 시점에서 기능이 실행되어 이미지들의 다운로드가 다 완료되지 않은 상태에서도 Loading 화면이 끝나버립니다. useEffect안에서 onLoad나 eventListener load를 시도해보았지만 다른 eventListener와 다르게 제대로 동작하지 않는 현상이 발생합니다. 혹시 답변이 가능하시다면 React에서는 Resource의 다운로드 완료 시점을 어떻게 알 수 있을지 조언 부탁드립니다!

  • HTML/CSS
  • javascript
  • 웹-디자인
  • svg
  • 인터랙티브-웹
  • 클론코딩
신승헌 댓글 1 좋아요 0 조회수 723

[섹션7-3: 버그수정 2] tempYOffset 오류

미해결

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

tempYOffset을 통해서 스크롤 위치를 저장하고 있다가 총 100px을 이동하는 것으로 이해하였는데요. tempYOffset의 초기값, 즉 yOffset이 0으로 출력됩니다. 이게 바로 밑에 있는 window.addEventListener('scroll', () => { } 가 아직 실행되지 않아서 yOffset이 초기화 되지 않아 0으로 나오나? 라고 생각하였는데 막상 강의 코드는 딱히 그런 것을 고려하지 않고도 잘 나오는 것 같더라구요. 혹시 어떤 문제일지 알 수 있을까요? 일단 당장에는 window.scrollY를 사용해서 임시조치로 해결했습니다. // 새로고침 등으로 스크롤을 처음부터 하지 않는 경우 시작하는 경우 해결을 위해 window.addEventListener('load', () => { setLayout(); sceneInfo[0].objs.context.drawImage(sceneInfo[0].objs.videoImages[0], 0, 0); document.body.classList.remove('before-load'); // 특정 위치에서 새로 고침 하면 화면이 나오지 않는 문제를 해결 let tempYOffset = yOffset; let tempScrollCount = 0; // 스크롤 몇 번 했는지 저장 console.log(tempYOffset); console.log(yOffset); let siId = setInterval(() => { window.scrollTo(0, tempYOffset); tempYOffset += 5; tempScrollCount++; if (tempScrollCount > 20) { clearInterval(siId); } }, 20); // ..............

  • HTML/CSS
  • javascript
  • 웹-디자인
  • svg
  • 인터랙티브-웹
  • 클론코딩
신승헌 댓글 1 좋아요 0 조회수 218

게속 오류떠서 글 작성해봐요....

미해결

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

Uncaught TypeError: Cannot read properties of undefined (reading 'scrollHeight') at scrollLoop (main.js:367:65) at main.js:388:9 이런 오류 떠서 제 자바 스크립트 코드도 여기 올려볼께요....

  • HTML/CSS
  • javascript
  • 웹-디자인
  • svg
  • 인터랙티브-웹
  • 클론코딩
taehwan4072 댓글 2 좋아요 0 조회수 561

곡선에 따라 글자쓰기에서 path 대신 circle은 안되나요?

미해결

SVG 마스터

<svg width="500" height="500" xmlns="http://www.w3.org/2000/svg"> <style> .svg-circleText {font-size: 1.5rem; font-weight: bold; fill: red;} .svg-circleText tspan {display: inline-block; margin-right: 30px;} </style> <defs> <circle id="text-circle" cx="250" cy="250" r="240" stroke="blue" fill="transparent" /> </defs> <text x="20" y="20" class="svg-circleText"> <textPath href="#text-circle"> <tspan>My Work</tspan><tspan>My Work</tspan><tspan>My Work</tspan> <tspan>My Work</tspan><tspan>My Work</tspan><tspan>My Work</tspan> <tspan>My Work</tspan><tspan>My Work</tspan><tspan>My Work</tspan> </textPath> </text> </svg> 위처럼 circle로 하고싶은데 나오지 않습니다. 각각 따로 하면 circle도 잘 보이고 글자도 잘 보입니다. 하지만 id와 textPath를 사용하여 연결하면 보이지 않습니다ㅠ

  • HTML/CSS
  • svg
hweejin_cha 댓글 1 좋아요 0 조회수 324

d3 cdn 연동 링크를 찾을 수 없네요

미해결

지금 바로 D3.js 시작하기 : 웹 데이터 시각화

섹션1 1강 7:30에 d3를 활용하기 위한 script 태그를 홈페이지에서 가져오고 있는데 현재 홈페이지 에서는 아무리 찾아봐도 그 테그를 찾을 수 없어요 어디서 찾아오는 거죠?

  • svg
  • cdn
sunstephan 댓글 1 좋아요 0 조회수 313

svg를 public으로 빼지않고 그대로 컴포넌트에 넣는 이유가 궁금합니다.

미해결

Next + React Query로 SNS 서비스 만들기

svg를 public으로 빼지않고 그대로 컴포넌트에 넣는 이유가 궁금합니다. 저는 public에 사용되는 svg를 다 넣어놓고 svgr을 이용해서 필요한 컴포넌트마다 import해서 사용하고 있습니다. (처음 next를 시작할 때 알려주신 분이 이렇게 사용하셔서) 그런데 Section 2까지 강의를 들으면서 보니 제로초님은 컴포넌트에 바로 svg를 삽입하시던데 혹시 성능에 차이가 있을까요? 두 방법중 어떤 것이 나을까요? 혹시 성능에 큰 차이가 없다면 제로초님의 방식이 편해보이는데.. 고민입니다.

  • react
  • next.js
  • svg
현창이 댓글 1 좋아요 0 조회수 433

선생님 질문 있습니다! svg 태그에 object-fit: cover; 같은 속성을 적용하기는 어려울까요?

미해결

SVG 마스터

- 질문에 대한 답변은 강의자가 하는 경우도 있고, 수강생 여러분들이 해주시는 경우도 있습니다. 같이 도와가며 공부해요! :) - 작성하신 소스코드 자체의 오류보다는, 개념이나 원리가 이해되지 않는 부분을 질문해주시는게 좋습니다. 그대로 따라했는데 소스코드에서 버그가 나는 경우는 99%가 오타에 의한거라서, 완성된 소스랑 찬찬히 비교해보시면 직접 찾으실 수 있을 거예요. 개발자도구 console에 오류로 표시된 부분만 완성 코드에서 복사->붙여넣기를 해보시는 것도 방법입니다. - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

  • HTML/CSS
  • svg
JiHyeon Han 댓글 1 좋아요 0 조회수 611

인기 태그

인프런 TOP Writers

주간 인기글