inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Bắt đầu phát triển web tương tác đúng cách

nâng cao! Cuộn 3D 27

질문 드립니다.

308

marvelOppa

16 câu hỏi đã được viết

0

안녕하세요. 

혹시 처음 페이지 로드 시 가운데에 캐릭터가 있는 상태로 코드를 변경 하려고 한다면 어떤 부분들을 수정해야 되는지 알고 싶습니다. 

인터랙티브-웹 javascript HTML/CSS

Câu trả lời 3

1

studiomeal

원래 코드는 클릭을 해야 캐릭터가 생성되지만, 그냥 페이지가 열렸을 때 자동으로 캐릭터가 생성되는 것을 원하시면 아래와 같이 페이지가 열릴 때 new Character()를 한번 호출하면서 xPos에 원하시는 위치를 지정해주시면 됩니다.

    // code..

    resizeHandler();

    // 이렇게 호출 해주세요
    // 브라우저 창 폭의 45%위치 정도로 잡았습니다
    new Character({
        xPos: 45,
        speed: Math.random() * 0.5 + 0.2
    });

})();

0

marvelOppa

index.html에 캐릭터 코드를 살렸구요. 

wall3d.js

(function () {
    const stageElem = document.querySelector('.stage');
    const houseElem = document.querySelector('.house');
    const barElem = document.querySelector('.progress-bar');
    // const selectCharacterElem = document.querySelector('.select-character');
    const mousePos = { x: 0, y: 0 };
    let maxScrollValue;

    function resizeHandler() {
        maxScrollValue = document.body.offsetHeight - window.innerHeight;
    }

    window.addEventListener('scroll', function () {
        const scrollPer = pageYOffset / maxScrollValue;
        const zMove = scrollPer * 980 - 490;
        houseElem.style.transform = 'translateZ(' + zMove + 'vw)';

        // progress bar
        barElem.style.width = scrollPer * 100 + '%';
    });

    window.addEventListener('mousemove', function (e) {
        mousePos.x = -1 + (e.clientX / window.innerWidth) * 2;
        mousePos.y = 1 - (e.clientY / window.innerHeight) * 2;
        stageElem.style.transform = 'rotateX(' + (mousePos.y * 5) + 'deg) rotateY(' + (mousePos.x * 5) + 'deg)';
    });

    window.addEventListener('resize', resizeHandler);

    resizeHandler();

})();


character.js

(function () {
    const mainElem = document.querySelector('.character');

    init();

    function init() {

        let scrollState = false;
        let lastScrollTop = 0;
        let xPos = 0;
        let speed = 0.3;
        let runningState = false;
        let direction;
        let rafId;


        window.addEventListener('scroll', function () {

            clearTimeout(this.scrollState);

            if (!scrollState) {
                mainElem.classList.add('running');
            }

            scrollState = setTimeout(function () {
                scrollState = false;
                mainElem.classList.remove('running');
            }, 200);

            // 이전 스크롤 위치와 현재 스크롤 위치를 비교
            if (this.lastScrollTop > pageYOffset) {
                // 이전 스크롤 위치가 크다면: 스크롤 올림
                mainElem.setAttribute('data-direction', 'backward');
            } else {
                // 현재 스크롤 위치가 크다면: 스크롤 내림
                mainElem.setAttribute('data-direction', 'forward');
            }

            this.lastScrollTop = pageYOffset;
        });

        window.addEventListener('keydown', function (e) {


            if (runningState) return;

            if (e.keyCode == 37) {
                // 왼쪽
                this.direction = 'left';
                mainElem.setAttribute('data-direction', 'left');
                mainElem.classList.add('running');
                run(self);
                this.runningState = true;
            } else if (e.keyCode == 39) {
                // 오른쪽
                this.direction = 'right';
                mainElem.setAttribute('data-direction', 'right');
                mainElem.classList.add('running');
                run(self);
                this.runningState = true;
            }
        });

        window.addEventListener('keyup', function (e) {
            mainElem.classList.remove('running');
            cancelAnimationFrame(this.rafId);
            this.runningState = false;
        });
    }
    function run(self) {
        if (this.direction == 'left') {
            this.xPos -= this.speed;
        } else if (this.direction == 'right') {
            this.xPos += this.speed;
        }

        if (this.xPos < 2) {
            this.xPos = 2;
        }

        if (this.xPos > 88) {
            this.xPos = 88;
        }

        mainElem.style.left = this.xPos + '%';

        this.rafId = requestAnimationFrame(function () {
            run(self);
        });
    }

})();


이런 식으로 작업 해 보고 있는데.. 
제대로 하고 있는 건지 잘 모르겠습니다. ㅜㅜ
 

0

marvelOppa

조금 더 디테일 하게 말씀 드리면 페이지 로드시 아래 가운데에 캐릭터가 있는 상태로 시작 하고 싶습니다. 헌데 생성자 함수로 되어있는 부분을 일반 함수로 변경하는 로직이 어떻게 되는지 잘 모르겠습니다 OTL 

왼쪽/오른쪽 동작시 딜레이 문제

0

96

1

변수 범위 관련 질문

0

108

1

perspective 문의

0

104

1

생성자 함수를 클래스 함수로 변경 하고 this 오류 관련

0

150

1

스크롤이 중간 위치에 있을 때 창의 크기를 변환하면 생기는 문제

0

127

1

animation이벤트 질문이요!

0

72

1

resize handler에서 질문이 있습니다.

0

111

1

카드 뒤집힐 때 F가 보인 이유

0

150

1

3d 뒤집기 추가효과

0

219

1

전진! 3D 스크롤 21 강의 질문

1

171

1

eventlistener 질문

0

150

1

zMove 를 1000으로 설정하는 이유에 대하여.

0

169

1

[정보-23강] ES6 class 문법으로 공부하시는 분들!! 화살표 함수로도 시도해보셔요!

1

192

1

동적으로 html 생성 후 이벤트 위임 질문 있습니다.

0

268

1

rotateY()에서 deg에 따른 차이

0

198

1

코드 작성 순서

0

276

1

이미지가 없는데 첨부파일을 다운 받는 방법이 있나요??

1

396

1

'이벤트 위임 보강 영상'에 있는 예제 html이 안 보입니다

0

265

2

섹션5 자바스크립트 이벤트 다루기 질문

1

243

1

[#전진! 3D 스크롤 11] mousePos 공식 질문 있습니다!

0

424

2

css 는 직접 작성을 해야하는걸까용?

0

327

1

translateZ 에 px 이 아닌 vw 로 값을 주신 이유가 있을가요?

0

363

2

house 부분에도 width , height 부분을 꽉 차게 주신 부분이 제가 이해한게 맞는지 궁금합니다.

0

306

2

left:-400vw 가 아닌 translateZ(100vw); 을 입력하신 이유가 궁금합니다.

0

309

2