跳转到内容

向浏览器发送你的第一个脚本

让我们添加一个汉堡菜单,用于在移动设备屏幕尺寸上打开和关闭链接,这需要一些客户端交互!

准备好去……

  • 创建一个汉堡菜单组件
  • 编写一个 <script> 标签,让你的网站访问者可以打开和关闭导航菜单
  • 将你的 JavaScript 移动到其 .js 文件中

创建一个 <Hamburger /> 组件来打开和关闭你的移动端菜单。

  1. src/components/ 中创建一个名为 Hamburger.astro 的文件

  2. 将以下代码复制到你的组件中。它将代表你的三条线的“汉堡”菜单,用于在移动设备上打开和关闭导航链接。(稍后你将把新的 CSS 样式添加到 global.css 中。)

    src/components/Hamburger.astro
    ---
    ---
    <div class="hamburger">
    <span class="line"></span>
    <span class="line"></span>
    <span class="line"></span>
    </div>
  3. 将这个新的 <Hamburger /> 组件放在 Header.astro 文件中 <Navigation /> 组件的正前方。

    显示代码!
    src/components/Header.astro
    ---
    import Hamburger from './Hamburger.astro';
    import Navigation from './Navigation.astro';
    ---
    <header>
    <nav>
    <Hamburger />
    <Navigation />
    </nav>
    </header>
  4. 为你的汉堡包组件添加以下样式

    src/styles/global.css
    /* nav styles */
    .hamburger {
    padding-right: 20px;
    cursor: pointer;
    }
    .hamburger .line {
    display: block;
    width: 40px;
    height: 5px;
    margin-bottom: 10px;
    background-color: #ff9776;
    }
    .nav-links {
    width: 100%;
    top: 5rem;
    left: 48px;
    background-color: #ff9776;
    display: none;
    margin: 0;
    }
    .nav-links a {
    display: block;
    text-align: center;
    padding: 10px 0;
    text-decoration: none;
    font-size: 1.2rem;
    font-weight: bold;
    text-transform: uppercase;
    }
    .nav-links a:hover, a:focus {
    background-color: #ff9776;
    }
    .expanded {
    display: unset;
    }
    @media screen and (min-width: 636px) {
    .nav-links {
    margin-left: 5em;
    display: block;
    position: static;
    width: auto;
    background: none;
    }
    .nav-links a {
    display: inline-block;
    padding: 15px 20px;
    }
    .hamburger {
    display: none;
    }
    }

你的页眉还不是交互式的,因为它无法响应用户输入,例如点击汉堡菜单来显示或隐藏导航链接。

添加 <script> 标签可以提供客户端 JavaScript 来“监听”用户事件,然后相应地做出反应。

  1. 将以下 <script> 标签添加到 index.astro 中,就在 </body> 结束标签之前。

    src/pages/index.astro
    <Footer />
    <script>
    document.querySelector('.hamburger')?.addEventListener('click', () => {
    document.querySelector('.nav-links')?.classList.toggle('expanded');
    });
    </script>
    </body>
  2. 在不同尺寸下再次检查你的浏览器预览,并验证你有一个可用的导航菜单,它既能响应屏幕尺寸,也能响应此页面上的用户输入。

你可以将 <script> 标签的内容移动到项目中的独立 .js 文件中,而不是直接在每个页面上编写 JavaScript。

  1. 创建 src/scripts/menu.js(你将需要创建一个新的 /scripts/ 文件夹),并将你的 JavaScript 移入其中。

    src/scripts/menu.js
    document.querySelector('.hamburger').addEventListener('click', () => {
    document.querySelector('.nav-links').classList.toggle('expanded');
    });
  2. 用以下文件导入替换 index.astro 页面上 <script> 标签的内容

    src/pages/index.astro
    <Footer />
    <script>
    document.querySelector('.hamburger')?.addEventListener('click', () => {
    document.querySelector('.nav-links')?.classList.toggle('expanded');
    });
    import "../scripts/menu.js";
    </script>
    </body>
  3. 在较小的尺寸下再次检查你的浏览器预览,并验证汉堡菜单仍然可以打开和关闭你的导航链接。

  4. 将带有导入的相同 <script> 添加到你的另外两个页面,about.astroblog.astro 中,并验证每个页面都有一个响应式的交互式页眉。

    src/pages/about.astro & src/pages/blog.astro
    <Footer />
    <script>
    import "../scripts/menu.js";
    </script>
    </body>
  1. Astro 何时运行写在组件 frontmatter 中的 JavaScript?

  2. Astro 可以选择性地将 JavaScript 发送到浏览器,以允许

  3. 客户端 JavaScript 在编写或导入到以下位置时,将被发送到用户的浏览器

Astro 中的客户端脚本

贡献 社区 赞助