html - 在转换之前删除填充

标签 html css

我正在开发一个导航栏,它使用相交观察器缩小,相应地添加一个类,但当过渡开始时,它从 0 填充开始。

此时,当添加 .nav-scrolled 时,CSS 属性也会添加到导航栏。但是当它添加时,填充开始从 0 过渡。我能做什么?

const nav = document.querySelector("nav");
const sectionOne = document.querySelector(".intersection");

const sectionOneObserver = new IntersectionObserver(function(entries, sectionOneObserver) {
  entries.forEach(entry => {
    if (!entry.isIntersecting) {
      nav.classList.add("nav-scrolled")
    } else {
      nav.classList.remove("nav-scrolled")
    }
  });
});

sectionOneObserver.observe(sectionOne)
.nav-container {
  display: flex;
  justify-content: center;
}

nav {
  position: fixed;
  width: 100vw;
  padding-block: 20px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  transition: 1s ease;
}

nav>* {
  margin-inline: 5%;
}

nav>div {
  width: 300px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  overflow: hidden;
  padding-block: 10px;
}

.nav-scrolled {
  width: 80%;
  padding-block: 15px;
  font-size: 20%;
  border-radius: 20px;
  transform: translateY(15px);
}

.nav-scrolled>* {
  margin-inline: 15px;
}
.intersection{height:10vh}

.body{color:red; height:120vh}
<div class="nav-container">
  <nav>
    <a href="#">
      <h1>Heading</h1>
      <h2>Heading-2</h2>
    </a>
    
    <div>
      <a href="#">link1</a>
      <a href="#">link2</a>
      <a href="#">link3</a>
    </div>
  </nav>
</div>

<div class="intersection"></div>
<div class="body"><div>

最佳答案

填充并不是从 0 开始。发生这种情况是因为 nav 元素的子元素上有 margin-inline 。当您滚动时,该边距会消失,并且子级没有过渡标签,因此这就是它看起来在跳跃的原因。我刚刚删除了这个 css 行。看起来效果很好:)

const nav = document.querySelector("nav");
const sectionOne = document.querySelector(".intersection");

const sectionOneObserver = new IntersectionObserver(function(entries, sectionOneObserver) {
  entries.forEach(entry => {
    if (!entry.isIntersecting) {
      nav.classList.add("nav-scrolled")
    } else {
      nav.classList.remove("nav-scrolled")
    }
  });
});

sectionOneObserver.observe(sectionOne)
.nav-container {
  display: flex;
  justify-content: center;
}

nav {
  position: fixed;
  width: 100vw;
  padding-block: 20px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  transition: 1s ease;
}

nav>* {
  margin-inline: 5%;
}

nav>div {
  width: 300px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  overflow: hidden;
  padding-block: 10px;
}

.nav-scrolled {
  width: 80%;
  padding-block: 15px;
  font-size: 20%;
  border-radius: 20px;
  transform: translateY(15px);
}

.intersection{height:10vh}

.body{color:red; height:120vh}
<div class="nav-container">
  <nav>
    <a href="#">
      <h1>Heading</h1>
      <h2>Heading-2</h2>
    </a>
    
    <div>
      <a href="#">link1</a>
      <a href="#">link2</a>
      <a href="#">link3</a>
    </div>
  </nav>
</div>

<div class="intersection"></div>
<div class="body"><div>

关于html - 在转换之前删除填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77488403/

相关文章:

javascript - 具有交替滚动边的视差分屏

css - 带有 <br> 标签的多行省略号仅在 IE11/Edge 中将省略号添加到第一行

html - 如何垂直对齐另一个 div 内的 div?

css - CSS/div 的新手...无法添加广告 block

javascript - 无法在 AngularJS 中将数据从指令传递到 html

javascript - Ubuntu的最佳网页编辑器

javascript - 如何在所有 HTML 页面中一次性弹出?

javascript - 在jquery中,如何获取使用复选框选择的表的特定行的值?

css - 如何在CSS中制作一个反向透明圆圈

html - 如何摆脱 Outlook 中 HTML td 和表格之间的额外空间?