Develop record

[React] 애니메이션-transition 본문

Frontend/React

[React] 애니메이션-transition

seong's log 2024. 3. 25. 23:23

전환 애니메이션

1. 애니메이션 동작 전 스타일을 담을 className 만들기

2. 애니메이션 동작 후 스타일을 담을 className 만들기 

3. transition 속성도 추가

4. 원할 때 2번 탈부착

 

Detail.js

import { useEffect, useState } from "react";
import { Container, Row, Col, Nav } from "react-bootstrap";
import { useParams } from "react-router";
import styled from "styled-components";

function Detail(props){
	let [tab, setTab] = useState(0);
    let [fade, setFade] = useState('');

    useEffect(()=>{
        setTimeout(()=>{setFade('end')},300)
        
    },[]) // 처음 로드 될 때 한번만 실행
  
    let{id} = useParams();
    if(id >= props.shoes.length){
        return <div>없는상품입니다.</div>
    }
    return(
    	// 페이지를 로딩할 때 0.5초 후 서서히 페이지가 나타남
        <div className={"start "+fade}>
            <Container>
                {remove && <div className="alert alert-warning">
                    2초이내 구매시 할인
                </div>}
                <button onClick={()=>{ setCount (count+1)}}>버튼{count}</button>
                <Row>
                    <Col md={6}>
                        <img src={"https://codingapple1.github.io/shop/shoes"+(props.shoes[id].id+1)+".jpg"} width="80%"/>
                        <h4>{props.shoes[id].title}</h4>
                        <p>{props.shoes[id].content}</p>
                        <p>{props.shoes[id].price}원</p>
                        <button className="btn btn-danger">주문하기</button>
                    </Col>                                       
                </Row>
            </Container>
            
            {/* defaultActiveKey : 기본적으로 눌려 있을 키 */}
            <Nav variant="tabs" defaultActiveKey="link0"> 
                <Nav.Item>
                    <Nav.Link onClick={()=>{setTab(0)}} eventKey="link0">버튼0</Nav.Link>
                </Nav.Item>
                <Nav.Item>
                    <Nav.Link onClick={()=>{setTab(1)}} eventKey="link1">버튼1</Nav.Link>
                </Nav.Item>
                <Nav.Item>
                    <Nav.Link onClick={()=>{setTab(2)}} eventKey="link2">버튼2</Nav.Link>
                </Nav.Item>
            </Nav>
            
            <TabContent tab={tab}/>
        </div>
    )
    
}

function TabContent({tab}){ 

    let [fade, setFade] = useState('');

    useEffect(()=>{
        // state 변경이 다 된 후 마지막에 재렌더링 하기 때문에 두개를 합쳐 하나만 실행함 -> setTimeout 해서 시간차 두기
        setTimeout(() => {setFade('end')}, 100)     
        return()=>{
            setFade('')
        }
    },[tab])

    // 문자중간에 변수 넣기 : {'start '+fade} , 'start `${fade}`'
     return (<div className={'start '+fade}> 
     {[ <div>내용 0</div>, <div>내용 1</div>, <div>내용 2</div> ][tab]}
     </div>
)}

export default Detail;

 

CSS

.start{
  opacity: 0;
}
.end{
  opacity: 1;
  transition: opacity 0.5s; /* opacity가 실행될 때 0.5초에 걸쳐서 변함*/
}

'Frontend > React' 카테고리의 다른 글

[React] Redux 셋팅 / state 만들기  (0) 2024.03.26
[React] Context API  (0) 2024.03.26
[React] tab UI  (0) 2024.03.25
[React] Ajax  (0) 2024.03.24
[React] Lifecycle / useEffect  (1) 2024.03.24