본문 바로가기
팀프로젝트

팀프로젝트 NOST 3일차

by useSword 2024. 5. 17.

화면에 해상도 높은 이미지를 가져올 떄 걸리는 시간이 길어 흰 화면이 보임.

 

아래와 같이 url를 통해 가져왔었음.

 

backgroundImage: 'url("https://images.unsplash.com/photo-1491466424936-e304919aada7?q=80&w=1738&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D")'

 

 

 

1. 사진을 다운받아 asset 폴더에 사진을 저장하고 불러오기

import winter from '../../shared/asset/image/winter.avif'

backgroundImage: `url(${winter})`,

 

 

2. 낮은 해상도의 이미지를 먼저 불러오고 높은 해상도의 이미지를 불러오기

 

다른 계절의 이미지와 비교하기 위해 우선 여름만 테스트 해봄

import spring from '../shared/asset/image/spring.avif'
import summer from '../shared/asset/image/summer.jpg'
import autumn from '../shared/asset/image/autumn.avif'
import winter from '../shared/asset/image/winter.avif'
import summerLow from '../shared/asset/image/summer_low.jpg'

  const seasonImage = {
    spring: spring,
    summer: summer,
    autumn: autumn,
    winter: winter
  };

  const seasonLowImage = {
    summer: summerLow,
  };
  
  
  {loading ? (
          <div className="loading-indicator">Loading...</div>
        ) : (
          <div className="image-container">
            <img src={seasonLowImage[currentSeason]} alt="Low Quality" className="low-quality" />
            <img src={seasonImage[currentSeason]} alt="High Quality" className={`high-quality ${loading ? 'loading' : 'loaded'}`} />
          </div>
        )}

 

 

해본 결과 지금까지 했었던 일 중에 가장 효율이 좋았음. Loading이 보였던 적이 없었음.


전체 코드

function App() {
  const { themes, setDarkMode, setThemeMode } = useThemeStore();
  const [currentSeason, setCurrentSeason] = useState('spring');
  const [loading, setLoading] = useState(true);

  const currentTheme = themes[currentSeason];

  const seasonImage = {
    spring: spring,
    summer: summer,
    autumn: autumn,
    winter: winter
  };

  const seasonLowImage = {

    summer: summerLow,
  };

  useEffect(() => {
    setLoading(true);
    const img = new Image();
    img.src = seasonImage[currentSeason];
    img.onload = () => setLoading(false);
  }, [currentSeason]);


  const handleSeasonChange = (season) => {
    setCurrentSeason(season);
    if (season === 'winter' || season === 'summer') {
      setDarkMode(true);
    } else {
      setDarkMode(false);
    }
    if (season === 'autumn' || season === 'winter') {
      setThemeMode(true);
    } else {
      setThemeMode(false);
    }
  };

  return (
    <div className="App" style={{ backgroundColor: currentTheme.primary, color: currentTheme.textColor }}>
      <div className="theme-toggles">
        <ThemeMode currentSeason={currentSeason} setSeason={handleSeasonChange} />
      </div>
      <div className="background">
        {loading ? (
          <div className="loading-indicator">Loading...</div>
        ) : (
          <div className="image-container">
            <img src={seasonLowImage[currentSeason]} alt="Low Quality" className="low-quality" />
            <img src={seasonImage[currentSeason]} alt="High Quality" className={`high-quality ${loading ? 'loading' : 'loaded'}`} />
          </div>
        )}
        <BrowserRouter>
          <AppRouter />
        </BrowserRouter>
      </div>
    </div>
  );
}

 

 

3. 웹페이지를 처음 열 때 보안 관련 페이지를 뛰우고 홈페이지에 LazyLoading을 사용하여 0.5초의 시간을 준 뒤 나머지 이미지들도 준비하려고 했었음. (2번에서 만족하여 나중에 시도할 예정)

 

이외에도 'react-loading-skeleton'도 알아봤었는데 이것은 데이터를 가져올 동안 틀을 미리 보여주는 것이었다.

아직은 사용할 일이 없을 것 같다.

 

 

 

4. 2번을 사용해도 흰화면이 가끔 보였음. 차라리 기존의 화면에 새로운 화면을 가져와 스택을 쌓는 형식으로 변경함.

그리고 스택이 많이 쌓였을 때 최신 이미지를 제외하고 다시 지움.

 

-> (변경) 스택형식은 비슷하지만 낮은 퀄리티와 높은 퀄리티로 나누어서 관리함. 계절을 변경할 때마다 이전 이미지들은 제거하고 최신의 이미지만 저장.

 

5. pictures 태크의 활용

 

정의 및 특징
<picture> 태그는 <img> 요소의 다중 이미지 리소스(multiple image resources)를 위한 컨테이너를 정의할 때 사용합니다.

<picture> 요소는 뷰포트(viewport)의 너비에 따라 커지거나 작아지는 하나의 이미지를 사용하는 대신 서로 다른 디스플레이나 기기에서 해당 뷰포트에 알맞게 채워질 수 있도록 여러 개의 이미지 중에서 적절한 이미지를 사용할 수 있도록 해줍니다. 이러한 <picture> 요소는 웹 개발자가 이미지의 리소스를 보다 유연하게 지정할 수 있도록 해주므로, 반응형 디자인(responsive design)에서 주로 사용합니다.

<picture> 요소는 0개 이상의 <source> 요소와 하나의 <img> 요소로 구성되며, 브라우저는 <source> 요소 중에서 해당 뷰포트와 가장 잘 어울리는 <source> 요소를 다음과 같은 방법을 사용하여 선택합니다.

브라우저는 <source> 요소들의 속성값을 각각 확인해 나가며 조건을 만족하는 첫 번째 <source> 요소를 사용하고, 나머지 <source> 요소들은 무시합니다. 이 때 <img> 요소는 <picture> 요소의 자식 요소 중에서 가장 마지막에 위치해야 합니다. 이러한 <img> 요소는 <picture> 요소를 지원하지 않는 브라우저를 위한 하위 호환성(backward compatibility)을 위해 사용되거나 명시된 <source> 요소가 모두 조건을 만족하지 못 할 경우 사용됩니다.

예제
<picture>
    <source media="(min-width: 700px)" srcset="/examples/images/people_960.jpg">
    <source media="(min-width: 400px)" srcset="/examples/images/people_575.jpg">
    <img src="/examples/images/people_200.jpg" alt="People">
</picture>


'팀프로젝트' 카테고리의 다른 글

팀프로젝트 NOST 로딩창  (0) 2024.05.28
팀 프로젝트 NOST 2일차  (0) 2024.05.14
팀 프로젝트 Nost 1일차  (0) 2024.05.13
spartaNews - 3  (0) 2024.05.10
spartaNews - 2  (0) 2024.05.08