返回介绍

回到干燥的陆地。让你的博客从白天到黑夜,无需岛屿!

发布于 2024-06-05 21:19:57 字数 8980 浏览 0 评论 0 收藏 0

既然你已经能够为交互元素构建 Astro 岛屿,别忘了仅仅使用原始的 JavaScript 和 CSS 就能走得很远!

让我们构建一个可点击的图标,让用户可以在浅色模式和深色模式之间切换,使用另一个 <script> 标签来实现交互性,而无需将任何框架的 JavaScript 发送到浏览器中。

准备好…

  • 仅使用 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 样式

选择一些用于暗黑模式的替代颜色。

  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');    }    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. 除非你包含一个 client: 将它们的 JavaScript 发送到客户端并在浏览器中运行,否则它们会在你的网站上创建静态元素。

  3. 它们允许你在不需要使用该技术栈启动全新项目的情况下,「尝试」新的框架。

  4. 它们使你能够复用在其他框架中编写的代码,你通常可以将它们直接放入你的网站中。

  5. 它们能够让你在不需要了解或学习其他 JavaScript 框架的情况下,添加交互性。

任务清单

相关资源

Tutorials

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文