javascript - 如何防止导航栏抖动?

标签 javascript express ejs

我正在开展一个小型个人项目,但有一个小问题,我不确定如何解决。我使用 Bootstrap4ejs 模板引擎express。我的项目有一个导航栏,如果用户的话,我会在其中显示登录未登录,帐户则相反。

这是导航栏的相关部分:

<div class="collapse navbar-collapse" id="navbarSupportedContent">
  <ul class="navbar-nav ml-auto ">
    <li class="nav-item  navbar-item">
      <a class="nav-link" href="/">Home </a>
    </li>
    <li class="nav-item navbar-item">
      <a class="nav-link" href="/">Some link </a>
    </li>
    <li class="nav-item navbar-item " id="nav-signIn">
      <a class="nav-link" href="/signIn">Sign in</a>
    </li>
    <li class="nav-item dropdown  navbar-item" id="nav-account">
      <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown"
        aria-haspopup="true" aria-expanded="false">
        Account
      </a>
      <div class="dropdown-menu" aria-labelledby="navbarDropdown">
        <a class="dropdown-item" href="#">Action</a>
        <a class="dropdown-item" href="#">Another action</a>
        <div class="dropdown-divider"></div>
        <a class="dropdown-item" href="#">Something else here</a>
      </div>
    </li>
  </ul>
</div>

这是控制在客户端显示内容的函数:

  function displayAccountOrSignIn() {
    if (!document.cookie.split(';').filter((item) => item.includes('logedIn=')).length) {
      document.querySelector('#nav-account').style.display = 'none'
    }
    else {
      document.querySelector('#nav-signIn').style.display = 'none'
    }
  }

我的问题是导航栏“抖动”,因为它首先加载 HTML,然后隐藏不应该显示的内容。我可以通过检查服务器上的 cookie 来修复它,然后有条件地渲染导航栏的部分内容,但我认为这样做不是一个好主意。如果有任何建议,我将不胜感激。

最佳答案

这里有很多选项。要知道推荐哪一个,我们可能需要使用您的实际网站并尝试一些操作。所有这些都会起作用并防止显示不应该看到的内容,有些可能会更快显示。

  1. 首先隐藏所有条件内容(这样就不会显示不应该显示的内容),然后使用条件 Javascript 启用适当部分的显示。

  2. 默认情况下,在 HTML 中隐藏整个工具栏,直到运行条件代码为止,然后仅在 Javascript 末尾确定其状态后才显示整个工具栏。如果需要,您可以将工具栏设置为 visibility: hidden而不是display: none这样它在最终显示时仍然占据适当的垂直高度,并且不会导致其他内容下移。

  3. 在内联中运行条件脚本 <script>标签紧跟在工具栏 HTML 之后。这将确保脚本在工具栏 HTML 可用后尽快运行。您可以将此与上面的#1 或#2 结合起来。

  4. 确定正确的服务器端工具栏,以便到达浏览器的 HTML 已经正确预先形成。由于服务器已经知道用户是否登录,因此这应该是可能的。

关于javascript - 如何防止导航栏抖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58383337/

相关文章:

javascript - 使用 jQuery 在计时器上使用 ajax 更新 google 图表

javascript - 是否有纯 JavaScript 方法来检索任何站点的所有断点或媒体请求?

javascript - 如何在一个列表中隐藏除前两个之外的所有 li,在另一个列表中隐藏第三个和第四个?

javascript - Express.js/React.js 页面刷新状态持久化

node.js - i18n 如何获取有关该语言的 cookie 信息

javascript - 如何使用 JavaScript 以编程方式为元素设置动画?

node.js - npm 强大的形式仅返回最后一个复选框值

javascript - ReactJS:Express API 和 ReactJS 结构限制每行显示数据

node.js 排序对象(mongoose、express、ejs)

javascript - 无法正确显示悬停时导航下拉列表中的所有数据