如何在添加绝对 属性 后停止我的页面滚动

How to stop my page from scrolling after adding the absoule property

我已经在这个问题上停留了很长一段时间了。我正在尝试制作一个响应式仪表板,在特定屏幕尺寸下,侧面导航栏将被隐藏,您可以使用按钮将其切换回来。我的屏幕主要内容有它的 overflow: hidden,所以它是屏幕上唯一的可滚动区域,但是一旦在小屏幕上添加了侧面板,我就会在页面底部获得额外的区域。

我怎样才能阻止它发生

Link 实施:https://codesandbox.io/s/keen-hertz-zr2h8?resolutionWidth=787&resolutionHeight=675&file=/src/App.vue

代码:

<template>
  <div>
    <div class="w-full absolute">
      <!-- TOP Navigation starts -->

      <nav
        class="h-16 flex items-center border-b-2 border-collGray-100 lg:items-stretch justify-end lg:justify-between bg-black relative z-50"
      >
        <p class="text-white">TOP NAVIGATION</p>
      </nav>
      <!-- TOP Navigation ends -->
    </div>
    <!-- Sidebar FULL SCREEN starts -->
    <div
      class="flex flex-no-wrap h-screen bg-coolGray-200 pt-16 overflow-hidden"
    >
      <div
        class="w-64 relative bg-green-500 shadow flex-col justify-between hidden lg:flex pb-12"
      >
        <div class="px-8">
          <ul class="mt-12">
            <li
              class="flex w-full text-blue-900 cursor-pointer items-center mb-6 hover:text-red-500"
            >
              <div class="py-1 px-3 flex items-center justify-center text-xs">
                <span class="material-icons"> > </span>
              </div>
              <div class="flex items-end">
                <span class="text-sm">Item 1</span>
              </div>
            </li>

            <li
              class="flex w-full text-blue-900 hover:text-red-500 cursor-pointer items-center mb-6"
            >
              <div class="py-1 px-3 flex items-center justify-center text-xs">
                <span class="material-icons"> > </span>
              </div>
              <div class="flex items-center">
                <span class="text-sm">Item 2</span>
              </div>
            </li>

            <li
              class="flex w-full text-blue-900 hover:text-red-500 cursor-pointer items-center mb-6"
            >
              <div class="py-1 px-3 flex items-center justify-center text-xs">
                <span class="material-icons"> > </span>
              </div>
              <div class="flex items-center">
                <span class="text-sm">Item 3</span>
              </div>
            </li>

            <li
              class="flex w-full text-blue-900 hover:text-red-500 cursor-pointer items-center mb-6"
            >
              <div class="py-1 px-3 flex items-center justify-center text-xs">
                <span class="material-icons"> > </span>
              </div>
              <div class="flex items-center">
                <span class="text-sm">Item 4</span>
              </div>
            </li>
            <li
              class="flex w-full text-blue-900 hover:text-red-500 cursor-pointer items-center mb-6"
            >
              <div class="py-1 px-3 flex items-center justify-center text-xs">
                <span class="material-icons"> > </span>
              </div>
              <div class="flex items-center">
                <span class="text-sm">Item 5</span>
              </div>
            </li>
          </ul>
        </div>
      </div>
      <!-- Sidebar FULL SCREEN ends -->
      <!-- Collapse Start-->
      <div
        class="z-40 absolute top-0 lg:hidden transition duration-150 ease-in-out"
        id="mobile-nav"
      >
        <div
          id="openSideBar"
          class="h-10 w-10 bg-green-500 absolute right-0 mt-16 -mr-10 flex items-center shadow rounded-tr rounded-br justify-center cursor-pointer"
          @click="sidebarHandler(true)"
        >
          <span
            class="material-icons text-red-500"
            :class="{ 'transform rotate-180': moved }"
          >
            >
          </span>
        </div>

        <div class="w-64 relative bg-green-500 shadow h-screen">
          <div class="px-8">
            <ul class="mt-12">
              <li
                class="flex w-full text-red-500 cursor-pointer items-center mb-6 hover:text-darkGrey"
              >
                <div class="py-1 px-3 flex items-center justify-center text-xs">
                  <span class="material-icons"> > </span>
                </div>
                <div class="flex items-end">
                  <span class="text-sm">Item 1</span>
                </div>
              </li>

              <li
                class="flex w-full text-red-500 hover:text-darkGrey cursor-pointer items-center mb-6"
              >
                <div class="py-1 px-3 flex items-center justify-center text-xs">
                  <span class="material-icons"> > </span>
                </div>
                <div class="flex items-center">
                  <span class="text-sm">Item 2</span>
                </div>
              </li>

              <li
                class="flex w-full text-red-500 hover:text-darkGrey cursor-pointer items-center mb-6"
              >
                <div class="py-1 px-3 flex items-center justify-center text-xs">
                  <span class="material-icons"> > </span>
                </div>
                <div class="flex items-center">
                  <span class="text-sm">Item 3</span>
                </div>
              </li>

              <li
                class="flex w-full text-red-500 hover:text-darkGrey cursor-pointer items-center mb-6"
              >
                <div class="py-1 px-3 flex items-center justify-center text-xs">
                  <span class="material-icons"> > </span>
                </div>
                <div class="flex items-center">
                  <span class="text-sm">Item 4</span>
                </div>
              </li>
              <li
                class="flex w-full text-red-500 hover:text-darkGrey cursor-pointer items-center mb-6"
              >
                <div class="py-1 px-3 flex items-center justify-center text-xs">
                  <span class="material-icons"> > </span>
                </div>
                <div class="flex items-center">
                  <span class="text-sm">Item 5</span>
                </div>
              </li>
            </ul>
          </div>
        </div>
      </div>
      <!-- Collapse End-->
      <!-- Content Start -->

      <div class="mx-auto bg-gray-300 h-full py-2 w-full px-2">
        <div
          class="w-full h-full border-2 border-red-900 bg-gray-600 text-red-900 text-red-500 rounded-lg shadow-sm overflow-scroll overflow-x-hidden"
        >
          <div>
            <ul>
              <li v-for="index in 100" :key="index">
                <p>Item: {{ index }}</p>
              </li>
            </ul>
          </div>
        </div>
      </div>
      <!-- Content END -->
    </div>
  </div>
</template>

脚本:


<script>
export default {
  data() {
    return {
      moved: false,
    };
  },
  methods: {
    sidebarHandler() {
      var sideBar = document.getElementById("mobile-nav");
      sideBar.style.transform = "translateX(-260px)";
      if (this.moved) {
        sideBar.style.transform = "translateX(0px)";
        this.moved = false;
      } else {
        sideBar.style.transform = "translateX(-260px)";
        this.moved = true;
      }
    },
  },
  watch: {
    $route() {
      if (!this.moved) {
        this.sidebarHandler();
      }
    },
  },
};
</script>

你需要你的侧边栏比屏幕小,这样你就不会有额外的内容滚动。

将 class h-screen 添加到 id="mobile-nav",从内部容器(绿色背景)中删除 h-screen class 并将样式 height: calc(100vh - 48px); 添加到这个容器。