작업 한 js

해당 위치에서 컨텐츠 고정

순9 2024. 8. 2. 17:22
728x90

html

<div id='wrap'>
	<div class='content1'></div>
    <div class='content1'></div>
    <div class='content1'></div>
    <div class='content1'></div>
    <div class='content1 fixed'></div>
    <div class='content1'></div>
    <div class='content1'></div>
    <div class='content1'></div>
    <div class='content1'></div>
</div>

style

  .fixed {
   position: fixed;
   bottom: 0;
  }

 

작동 되어 야 하는 기능

스크롤 하면 fixed 클래스의 컨텐츠가 따라와야 하고

원하는 위치에서 컨텐츠가 고정 되어야 함

 

1차 

 document.addEventListener("scroll", function () {
    const productsList = document.querySelector("#products-list");
    const productItem = document.querySelector(".Nproduct");
    let targetPosition = productsList.getBoundingClientRect().top;
    let windowHeight = window.innerHeight;

    console.log(targetPosition);

    if (targetPosition <= windowHeight) {
      productItem.classList.remove("fixed ");
    } else {
      productItem.classList.add("fixed ");
    }
  });

1. 원하는 위치의 컨텐츠에 id 값을 추가 products-list

2. 클래스가 다 중복되어 있어서 fixed컨텐츠에 다른 클래스를 추가 Nproduct

3. 원하는 위치에서 최상단의 값을 도출 productsList.getBoundingClientRect().top;

4. 브라우저 높이 값 출력

5. targetPosition <= windowHeight 조건에 따라 fixed 추가/제거

문제 사항 스크롤 할 시 클래스가 빠르가 추가 제거 되어서 컨텐츠가 깜빡 거리는 현상 생김

 

 

2차

fixed를 제외 한 위 컨텐츠를 div으로 묶은 후 해당 길이를 계산하여 조건을 걸어 클래서 추가 제거

깜빡거리는 현상 없음

document.addEventListener("scroll", function () {
        const newitem = document.querySelector(".new-content");
        const productItem = document.querySelector(".Nproduct");

        if (newitem && productItem) {
          
          //새로운 div 높이 값
          const newitemHeight = newitem.offsetHeight;
          // console.log(newitemHeight); //4597
          
          // 최상단에서의 div 높이 값 +  스크롤 하는 높이 값
          const newitemTop =
            newitem.getBoundingClientRect().top + window.scrollY;
            
            // console.log(newitem.getBoundingClientRect().top)
            // console.log(window.scrollY);
            
          //스크롤 하는 높이 값 + 전체 높이 값
          const scrollPosition = window.scrollY + window.innerHeight;
          console.log(scrollPosition + "scrollPosition");
          console.log(newitemTop + newitemHeight);
         
          if (scrollPosition >= newitemTop + newitemHeight) {
            productItem.classList.remove("fixed");
          } else {
            productItem.classList.add("fixed");
          }
        }
      });

1. 새롭게 묶은 div 불러오기

2. 클래스가 다 중복되어 있어서 fixed컨텐츠에 다른 클래스를 추가 Nproduct

3. newitem && productItem 가 값이 있는지 여부 확인

4. 새로운 div 높이 값 구하기

5. 최상단에서의 div 높이 값 +  스크롤 하는 높이 값

6. 스크롤 하는 높이 값 + 전체 높이 값

7. (스크롤 하는 높이 값 + 전체 높이 값) >= 최상단에서의 div 높이 값 +  새로운 div 높이 값 보다 작으면

클래서 제거

8. 높으면 클래스 추가