• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 React 게시판 도와주세요 선생님 접기 닫기 에니메이션 질문

도와주세요 선생님 접기 닫기 에니메이션 질문

  • 이 주제에는 1개 답변, 2명 참여가 있으며 codingapple2 년 전에 전에 마지막으로 업데이트했습니다.
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 글쓴이
  • #92557

    정중식
    참가자
    코드가 좀 길어요! ( 개인적으로 질문 게시판에 코드블럭 만들수있는거 하나 기능 추가로좀 ㅠ-ㅠ)
    
    탭을 누르면 서브메뉴가 펼쳐지듯이 열리고  닫으면  접히듯이 닫히는 애니에미션 구현인데요
    근데 지금 코드는 close 클래스명이 적용되버려서 close애니메이션이 적용되버리다보니깐 
    서브메뉴가 열려있던게 닫혀버려요.
    
    제가원하는것은 처음엔 닫혀있다가 누르면 펼쳐지는애니메이션과 다시 누르면 닫혀지는 애니메이션이 구현되는거에요.
    
    먼저 키프레임은 이렇습니다.
    const OpenAnimation = keyframes`
      from {
        height: 0;
        opacity: 0;
        visibility: hidden;
      }
      to {
        height: 684px;
        opacity: 1;
        visibility: visible;
      }
    `;
    const CloseAnimation = keyframes`
      from {
        height: 684px;
        opacity: 1;
        visibility: visible;
      }
      to {
        height: 0;
        opacity: 0;
        visibility: hidden;
      }
    `;
     
    애니메이션 값들을보니까 제가 앞에서
    근데 지금 코드는 close 클래스명이 적용되버려서 close애니메이션이 적용되버리다보니깐 
    서브메뉴가 열려있던게 닫혀버려요.
    라고했던 이유가 짐작이 가시겠죠!? .. 
    hegiht 값이 684px로 되었다가 0으로 되어서 초기에 펼쳐졌다가 접히는 애니메이션이 한번 발동하게됩니다.
    
    코드는 아래처럼 짜여져있어요.
    
    
    const News = () => {
      const [showSubItem, setShowSubItem] = useState<number[]>([]);
      const onItemClick = (itemId: number) => {
        setShowSubItem((prevItems) => {
          const index = prevItems.indexOf(itemId);
          if (index !== -1) {
            // 이미 열린 아이템을 클릭한 경우, 해당 아이템을 닫기 위해 배열에서 제거
            return [...prevItems.slice(0, index), ...prevItems.slice(index + 1)];
          } else {
            // 클릭한 아이템이 닫힌 상태이므로 배열에 추가하여 열기
            return [...prevItems, itemId];
          }
        });
      };
      return (
        <Component>
          <Banner />
          <Wrapper>
            <Logo>
              <span>plant.</span> news
            </Logo>
            <NewsWrapper>
              <NewsSearch>
                <select>
                  <option value='title'>제목</option>
                  <option value='contents'>내용</option>
                  <option value='title+contents'>제목+내용</option>
                </select>
                &nbsp;
                <input type='text' />
                <button>검색</button>
              </NewsSearch>
              <List>
                {testData.map((item) => (
                  <Item onClick={() => onItemClick(item.id)} key={item.id}>
                    <p className='title'>{item.title}</p>
                    <SubItem
                      className={showSubItem.includes(item.id) ? 'open' : 'close'}
                    >
                      <p className='title'>{item.title}</p>
                      < img src={item.url} alt='' />
                    </SubItem>
                  </Item>
                ))}
              </List>
            </NewsWrapper>
          </Wrapper>
        </Component>
      );
    };
    알맞게 수행하게하려면 어떤식으로 해줘야할까요?..
    #92607

    codingapple
    키 마스터
    transition 주고 
    붙이면 height : 684px 주는 클래스명 만들고 
    클래스명 하나만 원할 때 떼었다가 붙였다가 합시다
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관, 개인정보처리방침
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠