• 벌써 10월

    2022. 10. 1.

    by. 고구마달랭이

    생각 없이 잠이나 계속 자고 싶은데

    여섯시만 되면 눈이 떠진당😿

    습관이 들긴 했나부다 에효 ~ ~

     

    요번엔 이 부분!

    첫 섹션이랑 같은 스크롤 이벤트지만 좀 더 나아진 코드로 ㅎㅎ

    확실히 애플사이트가 부드럽다

    내가 만든 건 삐걱이는데 ㅋㅋㅋ ㅜ

     

     

      <section>
        <article>
            <div class="video">
              <video src="../img/noise_bg.mp4" autoplay muted loop></video>
            </div>
            <figure>
              <img src="../img/xray01.jpeg" alt="xray01">
            </figure>
            <figure>
              <img src="../img/xray02.jpeg" alt="xray02">
            </figure>
            <figure>
              <img src="../img/xray03.jpeg" alt="xray03">
            </figure>
        </article>
        <div class="typo">
          <p>칩에 탑재된 강력하고 <strong class="white">새로운 적응형 알고리즘</strong>이 사운드를 더 빠르게 처리해 소리가 들리는 정확한 순간에 맞춰 오디오를 조정해줍니다. 또한 사운드의 모든 디테일은 귀 내부 모양에 맞춰 렌더링되기 때문에 <strong class="green">더욱 뛰어난 하이파이 사운드</strong>에 더 깊이 빠져들 수 있습니다.</p>
          <p><strong class="white">새롭게 설계된 내향 마이크</strong>가 음성 향상 알고리즘을 사용해 당신의 음성을 더 잘 인지하고 더 선명하게 만들어줍니다. 덕분에 전화 및 영상 통화 중에 <strong class="green">더욱 자연스러운 목소리</strong>를 전달할 수 있죠.</p>
          <p><strong class="white">맞춤 제작 드라이버 및 앰프</strong>가 <strong class="green">H2 칩</strong>과 연동되어 재생 중 사운드 왜곡을 줄여주기 때문에 어떤 음량에서도 더욱 깊은 저음와 맑은 고음을 즐길 수 있습니다.</p>
        </div>
      </section>

    HTML 구조는 이렇게!

    이미지는 sticky로 고정 되어있고

    텍스트는 스크롤에 따라 흘러가니까

    article과 div.typo 두 부분으로 나누어줘따

     

     

        * {
          padding: 0;
          margin: 0;
          box-sizing: border-box;
        }
        body {
          background-color: #000;
        }
        .white {
          color: #f5f5f7;
        }
        .green {
          color: #00ff41;
        }
        section {
          height: 300vh;
        }
    
        article {
          position: sticky;
          top: 0;
          height: 100vh;
          overflow: hidden;
        }
    
        figure {
          position: absolute;
          top: 50%;
          left: 50%;
          width: 370px;
          transform: translate(-50%, -50%);
          opacity: 0;
        }
        figure:first-child {
          opacity: 1;
        }
    
        div.video {
          position: absolute;
          top: 50%;
          left: 50%;
          transform: translate(-50%, -50%) scale(1.2);
          width: 1440px;
          opacity: 0;
          transition: opacity 500ms, transform 300ms ease-out;
        }
        div.video.show {
          opacity: 1;
          transform: translate(-50%, -50%) scale(1);
        }
        video{
          width:100%
        }
    
        img {
          position: relative;
          left: -34px;
          display: block;
          max-width: 100%;
        }
        div.typo {
          position: absolute;
          top: 100%;
          left: 50%;
          transform: translate(-50%, -50%);
          max-width: 980px;
          width: 100%;
          margin: 0 auto;
        }
    
        p {
          position: relative;
          z-index: 1;
          width: 280px;
          margin-bottom: 250px;
          font-size: 21px;
          color: #6e6e73;
          opacity: 0;
        }
    
        p:nth-child(3){
          margin-left: auto;
        }

    CSS는 이렇게

    여러 상황 생각 안 하고

    딱! 눈에 보이는 대로! 만들어서 픽셀로 때려박았다 헷

     

     

     

     

        const info = {
          objs: {
            section_xray: document.querySelector('section'),
            xray_imgs: document.querySelectorAll('figure'),
            xray_texts: document.querySelectorAll('p'),
            xray_video: document.querySelector('.video'),
          },
    
          values: {
            xray_img01_scale: [1, 0.9, {start: 0, end: 0.28}],
            xray_img01_opaicty: [1, 0, {start: 0.24, end: 0.28}],
    
            xray_text01_opacity_in: [0, 1, {start: 0, end: 0.06}],
            xray_text01_opacity_out: [1, 0, {start: 0.097, end: 0.13}],
    
            xray_img02_opaicty: [0, 1, {start: 0.28, end: 0.32}],
            xray_img02_scale: [1, 0.9, {start: 0.28, end: 0.41}],
            xray_img02_opaicty_out: [1, 0, {start: 0.36, end: 0.41}],
    
            xray_text02_opacity_in: [0, 1, {start: 0.13, end: 0.2}],
            xray_text02_opacity_out: [1, 0, {start: 0.24, end: 0.28}],
    
            xray_img03_opaicty: [0, 1, {start: 0.36, end: 0.41}],
            xray_img03_scale: [1, 0.9, {start: 0.28, end: 0.41}],
    
            xray_text03_opacity_in: [0, 1, {start: 0.28, end: 0.32}],
            xray_text03_opacity_out: [1, 0, {start: 0.37, end: 0.42}],
    
          }
        };

    정보모음집(?)

     

     

        const xray = () => {
    
          const method = {
          	imgScale: () => {},  // style 주는 함수
            onScroll: () => {}  // 스크롤 수치 구하는 함수
          };
    
          const addEvent = () => {  // addEventListener 모아두는 곳
            addEventListener('scroll', method.onScroll)
          };
    
          const init = () => {  // 초기화 함수 (근데 지금 여기서는 필요 없기는 하당)
            addEvent()
          };
    
          init();
        };
    
        addEventListener('load', xray)  // HTML이 로드되면 함수 실행

    전체적인 흐름!

    저 이미지 받아보니까 이름이 x-ray길래 함수명으로 당첨 키키

    아 근데 벌써 부터 이거 어떻게 정리해야 할지 감이 안 잡힌다 😱

     

     

          const method = {
            imgScale: () => {},
    
            onScroll: () => {
              scrollTop = scrollY;
              xrayScrollY = scrollTop - info.objs.section_xray.offsetTop;
              xrayRatio = Math.min(1, (xrayScrollY / (info.objs.section_xray.offsetHeight - innerHeight)));
              method.imgScale(xrayScrollY)
            }
          };

    우선 스크롤 이벤트니까 수치들 구해줘야겠찌?

    scrollY랑 ratio 구해놓고 imgScale에 scrollY값 넘겨준당

     

     

          const method = {
            imgScale: (_scroll) => {
              info.objs.xray_imgs[0].style.opacity = `${calc(_scroll, info.values.xray_img01_opaicty, info.objs.section_xray, true)}`
              info.objs.xray_imgs[0].style.transform = `translate(-50%, -50%) scale(${calc(_scroll, info.values.xray_img01_scale, info.objs.section_xray, true)})`
              if(xrayRatio < info.values.xray_text01_opacity_in[2].end){
                info.objs.xray_texts[0].style.opacity = `${calc(_scroll, info.values.xray_text01_opacity_in, info.objs.section_xray, true)}`
              }else{
                info.objs.xray_texts[0].style.opacity = `${calc(_scroll, info.values.xray_text01_opacity_out, info.objs.section_xray, true)}`
              }
    
      
              info.objs.xray_imgs[1].style.transform = `translate(-50%, -50%) scale(${calc(_scroll, info.values.xray_img02_scale, info.objs.section_xray, true)})`
              if(xrayRatio < info.values.xray_img02_opaicty[2].end){
                info.objs.xray_imgs[1].style.opacity = `${calc(_scroll, info.values.xray_img02_opaicty, info.objs.section_xray, true)}`
              }else{
                info.objs.xray_imgs[1].style.opacity = `${calc(_scroll, info.values.xray_img02_opaicty_out, info.objs.section_xray, true)}`
              }
              if(xrayRatio < info.values.xray_text02_opacity_in[2].end){
                info.objs.xray_texts[1].style.opacity = `${calc(_scroll, info.values.xray_text02_opacity_in, info.objs.section_xray, true)}`
              }else{
                info.objs.xray_texts[1].style.opacity = `${calc(_scroll, info.values.xray_text02_opacity_out, info.objs.section_xray, true)}`
              }
    
    
              info.objs.xray_imgs[2].style.opacity = `${calc(_scroll, info.values.xray_img03_opaicty, info.objs.section_xray, true)}`
              info.objs.xray_imgs[2].style.transform = `translate(-50%, -50%) scale(${calc(_scroll, info.values.xray_img03_scale, info.objs.section_xray, true)})`
              if(xrayRatio < info.values.xray_text03_opacity_in[2].end){
                info.objs.xray_texts[2].style.opacity = `${calc(_scroll, info.values.xray_text03_opacity_in, info.objs.section_xray, true)}`
              }else{
                info.objs.xray_texts[2].style.opacity = `${calc(_scroll, info.values.xray_text03_opacity_out, info.objs.section_xray, true)}`
              }
    
    
              if(xrayRatio >= 0.4){
                info.objs.xray_video.classList.add('show')
              }else{
                info.objs.xray_video.classList.remove('show')
              }
            },
    
            onScroll: () => {
              scrollTop = scrollY;
              xrayScrollY = scrollTop - info.objs.section_xray.offsetTop;
              xrayRatio = Math.min(1, (xrayScrollY / (info.objs.section_xray.offsetHeight - innerHeight)));
              method.imgScale(xrayScrollY)
            }
          };

    onScroll에서 받은 scrollY 값으로 스타일을 넣어준다~ ~~

    동시에 같은 속성 스타일 주고 싶으면 if else

    모 스타일 넣어주는 부분은 그냥 노가다로 적으면 돼서 별 거 없당

    info.values에 수치랑 타이밍 넣어뒀으니까 ㅎㅎ

    근데!! 이번에는 calc()에 true, false도 넘겨주는데 왜냐하면

     

     

        let partStart, partEnd, partScroll, partRatio, styleValue;
    
        const calc = (_scroll, values, el, status) => {
          if(status){
            partStart = (el.offsetHeight - innerHeight) * values[2].start;
            partEnd = (el.offsetHeight - innerHeight) * values[2].end;
          }else{
            partStart = el.offsetHeight * values[2].start;
            partEnd = el.offsetHeight * values[2].end;
          }
    
          partScroll = Math.max(0, (_scroll - partStart));
          partRatio = Math.min(1, (partScroll / (partEnd - partStart)));
    
    
          if(_scroll < partStart){
            styleValue = values[0]
          }else if(_scroll > partEnd){
            styleValue = values[1]
          }else{
            styleValue = partRatio * (values[1] - values[0]) + values[0]
          }
    
          return styleValue;
        };

    ratio 구할 때 innerHeight를 뺐는지 안 뺐는지 구분하기 위함!

    전엔 calc01() calc02() 이렇게 두 개를 만들었었는데

    비효율적이자나? 그래서 status로 관리해주기루 해따

     

     

     

    완성작 ㅎ ㅎ

    이 정도면 비슷하지 않나? ^ㅇ^

    전엔 스크롤 인터랙션이 막연하게 어려울거라 생각했는데

    섹션별 scrollY값이랑 ratio만 구하면 그 다음 부턴 수치 싸움인 것 같당

    0과 1 사이의 중요성을 알게되어따

     

     


     

    또또 많은 부분이 생략이 되고

    냅다 코드만 적어놨지만.. 적었단 것에 의미를 두자 👊

     

    이번에 정말 감사하게도

    시영CD님🙊, 가현님, 린다, 귤님과 함께

    한화 온라인 기념관 Three.js 프로젝트를 맡게 되어따!!!!

    정말 설레고 다들 정말 멋진 분들이라 나도 꼭 도움이 되구싶당

     

    기운 내고.. 열심히 살자 현정아 ...

    요즘 나를 되돌아 보는 시간을 가지면서 많이 느낀 게

    평소의 내 감정 그래프가 높은 상태다 보니

    한 번 떨어지면 그 만큼 떨어지는 폭이 커서

    내가 견디기 힘들어하는 것 같당

    그래서 일정한 감정 상태 유지하는 연습을 해볼라고 ㅎ ㅎ

     

    연휴가 이렇게 반갑지 않은 건 처음이야

    출근하고싶다 구냥 ㅜ ㅋㅋ ㅜ 바쁘게 살래

    당장은 하루하루... 어떻게 버틸지...... 막막하고.... 힘들겠지만........

     

    그래도 어떡햐 나는 이 험난한 세상 속의 회사원^ㅇ^

    헬스장 가서 멍때리고 땀빼고.,, 일에 치여서 살다 보면.,....,..

    시간은 ^^ ~ ~~ 흐르겄지 ~~ 휴 ~ ~ ~~

    이건 ,.,, 마음의 근육통이다.. 견뎌 ..,,

    힝 😭😭😭😭😭

    '🦄' 카테고리의 다른 글

    카메라 가지고 놀기 1탄  (6) 2022.10.04
    🔗  (0) 2022.09.22
    지금의 나  (2) 2022.09.19

    댓글