컨텐츠로 건너뛰기

마른 땅으로 돌아갑니다. 섬이 필요 없이 낮부터 밤까지 블로그를 운영하세요!

이제 대화형 요소를 위한 Astro 섬을 구축할 수 있으므로 바닐라 JavaScript와 CSS만으로 꽤 많은 작업을 수행할 수 있다는 사실을 잊지 마세요!

브라우저에 프레임워크 JavaScript를 전송하지 않고 상호작용을 위해 또 다른 <script> 태그를 사용하여 사용자가 밝은 테마와 어두운 테마 사이를 전환할 수 있도록 클릭 가능한 아이콘을 만들어 보겠습니다.

요구 사항

  • JavaScript 및 CSS만으로 대화형 테마 토글 구축
  • 가능한 한 브라우저에 JavaScript를 적게 보내기!

테마 토글 아이콘 추가 및 스타일 지정

섹션 제목: 테마 토글 아이콘 추가 및 스타일 지정
  1. src/components/ThemeIcon.astro에 새 파일을 만들고 다음 코드를 붙여넣습니다.

    src/components/ThemeIcon.astro
    ---
    ---
    <button id="themeToggle">
    <svg width="30px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
    <path class="sun" fill-rule="evenodd" d="M12 17.5a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zm0 1.5a7 7 0 1 0 0-14 7 7 0 0 0 0 14zm12-7a.8.8 0 0 1-.8.8h-2.4a.8.8 0 0 1 0-1.6h2.4a.8.8 0 0 1 .8.8zM4 12a.8.8 0 0 1-.8.8H.8a.8.8 0 0 1 0-1.6h2.5a.8.8 0 0 1 .8.8zm16.5-8.5a.8.8 0 0 1 0 1l-1.8 1.8a.8.8 0 0 1-1-1l1.7-1.8a.8.8 0 0 1 1 0zM6.3 17.7a.8.8 0 0 1 0 1l-1.7 1.8a.8.8 0 1 1-1-1l1.7-1.8a.8.8 0 0 1 1 0zM12 0a.8.8 0 0 1 .8.8v2.5a.8.8 0 0 1-1.6 0V.8A.8.8 0 0 1 12 0zm0 20a.8.8 0 0 1 .8.8v2.4a.8.8 0 0 1-1.6 0v-2.4a.8.8 0 0 1 .8-.8zM3.5 3.5a.8.8 0 0 1 1 0l1.8 1.8a.8.8 0 1 1-1 1L3.5 4.6a.8.8 0 0 1 0-1zm14.2 14.2a.8.8 0 0 1 1 0l1.8 1.7a.8.8 0 0 1-1 1l-1.8-1.7a.8.8 0 0 1 0-1z"/>
    <path class="moon" fill-rule="evenodd" d="M16.5 6A10.5 10.5 0 0 1 4.7 16.4 8.5 8.5 0 1 0 16.4 4.7l.1 1.3zm-1.7-2a9 9 0 0 1 .2 2 9 9 0 0 1-11 8.8 9.4 9.4 0 0 1-.8-.3c-.4 0-.8.3-.7.7a10 10 0 0 0 .3.8 10 10 0 0 0 9.2 6 10 10 0 0 0 4-19.2 9.7 9.7 0 0 0-.9-.3c-.3-.1-.7.3-.6.7a9 9 0 0 1 .3.8z"/>
    </svg>
    </button>
    <style>
    #themeToggle {
    border: 0;
    background: none;
    }
    .sun { fill: black; }
    .moon { fill: transparent; }
    :global(.dark) .sun { fill: transparent; }
    :global(.dark) .moon { fill: white; }
    </style>
  2. 모든 페이지에 표시되도록 Header.astro에 아이콘을 추가합니다. 컴포넌트를 가져오는 것을 잊지 마세요.

    src/components/Header.astro
    ---
    import Hamburger from './Hamburger.astro';
    import Navigation from './Navigation.astro';
    import ThemeIcon from './ThemeIcon.astro';
    ---
    <header>
    <nav>
    <Hamburger />
    <ThemeIcon />
    <Navigation />
    </nav>
    </header>
  3. http://localhost:4321에서 브라우저 미리보기를 방문하여 이제 모든 페이지에서 아이콘을 확인하세요. 클릭해 볼 수는 있지만 아직 대화형으로 만드는 스크립트를 작성하지 않았습니다.

어두운 테마에 CSS 스타일 추가

섹션 제목: 어두운 테마에 CSS 스타일 추가

어두운 테마에서 사용할 대체 색상을 선택하세요.

  1. global.css에서 몇 가지 어두운 스타일을 정의합니다. 직접 선택하거나 복사하여 붙여넣을 수 있습니다.

    src/styles/global.css
    html.dark {
    background-color: #0d0950;
    color: #fff;
    }
    .dark .nav-links a {
    color: #fff;
    }

클라이언트 측 상호작용 추가

섹션 제목: 클라이언트 측 상호작용 추가

Astro 컴포넌트에 상호작용을 추가하려면 <script> 태그를 사용할 수 있습니다. 이 스크립트는 localStorage에서 현재 테마를 확인 및 설정하고 아이콘을 클릭할 때 테마를 전환할 수 있습니다.

  1. src/components/ThemeIcon.astro<style> 태그 뒤에 다음 <script> 태그를 추가합니다.

    src/components/ThemeIcon.astro
    <style>
    .sun { fill: black; }
    .moon { fill: transparent; }
    :global(.dark) .sun { fill: transparent; }
    :global(.dark) .moon { fill: white; }
    </style>
    <script is:inline>
    const theme = (() => {
    if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) {
    return localStorage.getItem('theme') ?? "light";
    }
    if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
    return 'dark';
    }
    return 'light';
    })();
    if (theme === 'light') {
    document.documentElement.classList.remove('dark');
    } else {
    document.documentElement.classList.add('dark');
    }
    window.localStorage.setItem('theme', theme);
    const handleToggleClick = () => {
    const element = document.documentElement;
    element.classList.toggle("dark");
    const isDark = element.classList.contains("dark");
    localStorage.setItem("theme", isDark ? "dark" : "light");
    }
    document.getElementById("themeToggle")?.addEventListener("click", handleToggleClick);
    </script>
  2. http://localhost:4321에서 브라우저 미리보기를 확인하고 테마 아이콘을 클릭하세요. 밝은 테마와 어두운 테마 간에 변경할 수 있는지 확인하세요.

다음 각 문장이 Astro <script> 태그, UI 프레임워크 컴포넌트 또는 둘 다를 설명하는지 선택하세요.

  1. 웹사이트에 대화형 UI 요소를 포함할 수 있습니다.

  2. JavaScript를 클라이언트에 보내고 브라우저에서 실행하기 위해 client:를 포함하지 않는 한 사이트에 정적 요소가 생성됩니다.

  3. 이를 통해 해당 기술 스택을 사용하여 완전히 새로운 프로젝트를 시작할 필요 없이 새로운 프레임워크를 “시험해 볼” 수 있습니다.

  4. 이를 통해 다른 프레임워크에서 작성한 코드를 재사용할 수 있으며 종종 사이트에 바로 넣을 수 있습니다.

  5. 이를 통해 다른 JavaScript 프레임워크를 알거나 배울 필요 없이 대화형 기능을 추가할 수 있습니다.

기여하기

여러분의 생각을 들려주세요!

GitHub Issue 생성

우리에게 가장 빨리 문제를 알려줄 수 있어요.

커뮤니티