You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt3+Tailwind滚动时文本颜色不更新问题求助

解决Nuxt3滚动时文本颜色不更新的问题

核心问题根源

你遇到的问题本质是:scrolled响应式变量仅在模块初始化时赋值了一次,没有绑定滚动事件来实时更新变量值,导致页面无法同步渲染变化。即便通过日志确认变量值改变,也只是临时逻辑触发,而非滚动行为驱动的持续更新。

修复方案

1. 重构滚动状态管理逻辑

修改~/composables/states.ts,增加滚动监听与响应式更新逻辑:

export const useScrollState = () => {
  const scrolled = ref(false)

  const updateScrollStatus = () => {
    scrolled.value = window.scrollY > 0
  }

  // 客户端环境下绑定滚动事件
  if (process.client) {
    window.addEventListener('scroll', updateScrollStatus)
    // 初始化时执行一次,确保初始状态正确
    updateScrollStatus()
  }

  // 组件卸载时移除监听,避免内存泄漏
  onUnmounted(() => {
    if (process.client) {
      window.removeEventListener('scroll', updateScrollStatus)
    }
  })

  return { scrolled }
}

2. 调整组件使用方式

替换原直接导入的方式,改用上面的composable获取滚动状态,同时修正template标签的无效class:

<script lang="ts" setup>
const { scrolled } = useScrollState()

function scrollToAnchor(anchorId: string): void {
  const element = document.getElementById(anchorId)
  if (element) {
    element.scrollIntoView({ behavior: "smooth" })
  }
}
</script>

<template>
  <!-- 注意:template标签不能绑定class,将sticky移到内部根div上 -->
  <div class="sticky w-full flex flex-row justify-around pt-16 font-medium">
    <NuxtImg src="/logo_white.png" class="h-full" />
    <button @click="scrollToAnchor('tattoos')">
      <p
        class="text-white"
        :class="{
          'text-black': scrolled,
        }">
        Tattoos
      </p>
    </button>
    <button @click="scrollToAnchor('artwork')">
      Artwork
    </button>
    <button @click="scrollToAnchor('contact')">
      Contact
    </button>
  </div>
</template>

<style scoped></style>

3. 关键注意事项

  • 禁止在<template>标签上绑定class,所有样式类需作用于内部DOM元素
  • 必须在客户端环境下操作window对象,用process.client做判断是Nuxt的标准写法
  • 组件卸载时移除滚动监听,避免长期运行导致内存泄漏

内容的提问来源于stack exchange,提问作者webelev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:14:59