- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只是想知道,如何构建我的代码来使我的粘性 <Header />
组件更改其 background-color
当与其他组件相交时(在本例中为 <Hero />
和 <Footer />
。
为了让事情变得更复杂,我使用 vue-router
.
链接到我的 CodeSandbox
结构如下:
App.vue
<template>
<ul class="nav">
<li>
<router-link to="/">Home</router-link>
</li>
<li>
<router-link to="/about">About</router-link>
</li>
</ul>
<Header />
<router-view />
</template>
views/Home.vue
<template>
<Child1 />
<Child2 />
<Hero />
<Child3 />
<Footer />
</template>
<script>
import Hero from "@/components/Hero";
import Child1 from "@/components/Child1";
import Child2 from "@/components/Child2";
import Child3 from "@/components/Child3";
import Footer from "@/components/Footer";
export default {
components: {
Hero,
Child1,
Child2,
Child3,
Footer,
},
};
</script>
当我在 yt 上学习一些教程时,作者使用 IntersectionObserver
,所以我想试一试:
标题.vue
<template>
<section
class="header"
>
<div class="header__title"
:class="{
header__scroll: isContrastActive,
}"
>
I am an awesome header that is changing it's background colour <br />
when intersecting with other components
</div>
</section>
</template>
<script>
export default {
data() {
return {
isContrastActive: false,
observer: null
};
},
methods: {
activateObserver() {
this.observer = new IntersectionObserver(
([entry]) => {
console.log("isIntersecting: ", entry.isIntersecting);
if (!entry.isIntersecting) {
this.isContrastActive = true;
} else {
this.isContrastActive = false;
}
},
{ rootMargin: "-5% 0px 0px 0px" }
);
document
.querySelectorAll(".observer")
.forEach((el) => this.observer.observe(el));
},
},
mounted() {
this.activateObserver();
},
};
</script>
<style scoped>
.header {
position: sticky;
top: 0;
width: 100vw;
height: auto;
z-index: 10;
}
.header__title {
background-color: yellow;
color: black;
padding: 8px 4px;
text-align: center;
}
.header__scroll {
background-color: orange;
}
</style>
还添加了 class="observer"
到 <Hero />
和 <Footer />
成分。但这似乎不起作用。
我读过,在 vue 中使用 querySelector
被认为是反模式。
如果是这种情况,那么我该如何构建我的代码以获得我想要的东西?
提前致谢
编辑1:
我注意到,如果我更改 <Header />
中的文本组件并保存然后一切似乎工作正常。但是在页面刷新时,它仍然不起作用。
认为 querySelectorAll
可能是原因。
解决方案 1:最明显的解决方案当然是:
mounted() {
setTimeout(() => {
this.activateObserver()
}, 500)
},
但这不是一个优雅的解决方案:/。
最佳答案
您使用的代码假设所有观察到的元素都已经在 DOM 中。
您需要使可观察对象对所有页面可用(使用首选的状态管理解决方案)。
您的activateObserver
应该变成:
createObserver() {
someStore().observer = new IntersectionObserver(
([entry]) => {
if (!entry.isIntersecting) {
this.isContrastActive = true;
} else {
this.isContrastActive = false;
}
},
{ rootMargin: "-5% 0px 0px 0px" }
);
}
然后,在任何有观察元素的页面中,使用template refs获取您想要观察的所有元素。在 onMounted
中,您开始观察它们,在 onBeforeUnmount
中,您停止观察它们。
const observed = ref([]);
onMounted(() => {
observed.value.forEach(someStore().observer.observe)
})
onBeforeUnmount(() => {
observed.value.forEach(someStore().observer.unobserve)
})
您如何使用模板引用选择元素与此答案无关。关键是您需要在组件挂载后开始观察引用的 DOM 元素,并在卸载前取消观察它们。
注意:理论上,您的任何 View 都可能在 observer
被添加到商店之前呈现。 (实际上这种情况很少见,因此您可能不需要这个)。
但是,如果是这种情况,您需要为页面中的 observer
创建一个观察者,并且只有在您拥有观察者之后才开始观察,这可能是在页面被挂载之后。
原理很简单:您需要观察者和被观察者才能起作用。 observer
在添加到store后可用,observed
在onMounted
后可用,直到onBeforeUnmount
在任何页面包含它们。
关于javascript - 在Vuejs3中如何让sticky header组件在与其他组件相交时改变背景颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71778765/
我有一个父容器。父容器有 2 个带有粘性页眉和页脚的子容器。问题在于,当用户滚动并到达页脚区域时,粘性页眉的位置会发生变化,即它会与其他可滚动内容一起上升。我为演示创建了一个 fiddle 。 htt
我有一个应用文件,其中包含我自己的自定义应用栏和不同的页面组件: const styles = theme => ({ appBar: { width:'100%', },
这是我的 jsFiddle带有完整的代码示例。 我正在尝试实现 sticky footer .如您所见,我的登录表单非常简短。尽管如此,页脚应该一直固定到页面底部。我试过: .footer {
我有一个这样的 div : HTML Title
如何让我的粘性导航菜单在粘到屏幕顶部后专门使用 GetUIKit 框架更改背景颜色(即蓝色到白色)? 这是我的代码: wo
我被困在这个问题上有一段时间了,我想我会分享这个position: sticky + flexbox gotcha: 我的粘性 div 工作正常,直到我将我的 View 切换到一个 flex 盒容器,
如果你打开这个 Fiddle https://jsfiddle.net/17uwnsq6/4/在 Safari(12.1.2,但应该适用于所有最新版本)中并开始向下滚动白色可滚动区域,起初粘性“标题”
我在我的网页上使用 jquery.sticky.js。 Div 工作正常,即粘性,但我需要在页脚之前停止 div。 我使用下面的代码来粘性 DIV jQuery(文档).ready(function(
使用 position:sticky 将此代码添加到我的粘性元素 var $sticky = $('.grid-container .sticky'), $stickyTo = $('.grid-
我正在努力实现一些我不确定是否可能实现的事情。请注意,我正在寻找纯 CSS 解决方案,我知道我可以用 JS 解决这个问题,但我不想这样做。 考虑以下笔: https://codepen.io/fchr
我向我的网上商店添加了一个粘性 header ,它适用于 FF、Chrome、Edge。 在 Safari(Windows 10)中执行 JavaScript, header 被固定和转换 - 但不可
我遇到过这两个用于 node js 的粘性 session 库 https://github.com/indutny/sticky-session https://github.com/wzrdtal
WordPress - 元素。尝试优化代码时出了点问题,现在我在页面的第一部分上方有一个巨大的空白空间,我正试图摆脱它。我是新手,正在使用 Elementor,所以我只能使用自定义 CSS。问题出现在
我怎样才能让 Foundation 的粘性元素只粘在小断点上? data-sticky-on="small"适用于小及以上 最佳答案 对于那些有兴趣的人。我在使用 sass 时找到了这个解决方案。 /
我想创建网格布局,我想搁置以坚持 top: 0并填充所有剩余高度,例如100% 的高度,当我向下滚动时,我需要将旁边的高度更改为 100% 减去页脚高度。没有JS可以做到吗? * { paddin
我正在为一个 friend 制作一个网站,我想将导航栏设为粘性。这是一个例子:http://www.w3schools.com/html/default.asp .我想要一张图片,其中标题在示例中。
我们的页面上有一个粘性侧面板,使用以下非常简单的 CSS 实现: position: fixed; top:62px; bottom:10px; top 和 bottom 属性创建所需的边距。 问题在
我正在使用 几乎 纯 css,(仅在 css 中执行此操作 不是 要求)背景图像和相邻的选择器用于呈现独特的人类可读的页面当用户将鼠标悬停在水平堆叠的图像上时(在页面右侧,每个图像都使用顺序后缀的类名
如果您不知道 position:sticky 是什么,请观看这个 20 秒长的视频:https://www.youtube.com/watch?v=jA67eda5i-A . 这个 CSS 功能在
我已将一个元素设置为粘性,但我没有定义元素应保持粘性的区域。当前区域不是我选择的,而是在我应用 position:sticky 时自动定义的。显然,我想完全控制我的粘性元素用作事件区域的空间,并且我想
我是一名优秀的程序员,十分优秀!