gpt4 book ai didi

javascript - 使用 jQuery 在页眉和页脚之间滚动时如何使侧边栏变粘(不滚动它们)?

转载 作者:数据小太阳 更新时间:2023-10-29 04:48:50 25 4
gpt4 key购买 nike

我需要一个严格的 jQuery 解决方案来解决这个问题。这是因为我使用的是 Wordpress,而我想要粘性的侧边栏小部件位于 <aside> 中。我无法制作全高的元素。

以与.scrollTop()相同的方式检测我在页面下方多远以使侧边栏小部件具有粘性我需要 JS 检测我距离页面底部多远以通过分配新的固定位置“取消粘附”小部件。

我试着用 .offset() 来做到这一点但到目前为止我一直无法让它发挥作用。

  function stopDiv() {
var distance = $('.footer').offset().top - $('.widget').offset().top;
if (distance < 10) {
$('.widget').css({
'top': 'auto',
'bottom': '10px'
});
}
}

正如您在下面的代码片段中看到的那样,我的侧边栏会按原样滚动,但我希望侧边栏在距页脚 <10 像素的距离时呈现一个新的固定位置。

我希望边栏在页脚上方占据一个新的固定位置,直到用户向上滚动。

编辑:@Benvc 在下面建议的解决方案在代码段中运行良好,但在我的 wordpress 网站上却不行。以下是我收到的控制台错误:

scripts.js:18 Uncaught ReferenceError: s is not defined
at HTMLDocument.<anonymous> (scripts.js:18)
at i (jquery.js:2)
at Object.fireWith [as resolveWith] (jquery.js:2)
at Function.ready (jquery.js:2)
at HTMLDocument.K (jquery.js:2)
at HTMLDocument.s (VM11874 rocket-loader.min.js:1)
at p (VM11874 rocket-loader.min.js:1)
at t.simulateStateAfterDeferScriptsActivation (VM11874 rocket-loader.min.js:1)
at Object.callback (VM11874 rocket-loader.min.js:1)
at t.run (VM11874 rocket-loader.min.js:1)

  // Fixed Widget
function fixDiv() {
var $cache = $('.widget');
if ($(window).scrollTop() > 380)
$cache.css({
'position': 'fixed',
'top': '10px',
'right': '30px'
});
else
$cache.css({
'position': 'relative',
'top': 'auto',
'right': 'auto'
});
}
$(window).scroll(fixDiv);
fixDiv();

/* My attempt
function stopDiv() {
var distance = $('.footer').offset().top - $('.widget').offset().top;
if (distance < 10) {
$('.widget').css({
'top': 'auto',
'bottom': '10px'
});
}
}
$(window).scroll(stopDiv);
stopDiv();
*/
@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700');
* {
font-family: 'Open Sans';
color: #fff;
box-sizing: content-box;
}

body {
padding: 0;
margin: 0;
}

p {
margin: 20px;
}

hr {
width: 85%;
border-style: solid;
}

.main-content {
width: 100%;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: 150px auto;
grid-template-areas: "nav nav nav nav" "main main main sidebar";
grid-column-gap: 20px;
grid-row-gap: 0px;
}

.nav {
grid-area: nav;
background-color: #266392;
display: grid;
grid-template-columns: 1fr 3fr 1fr;
}

.nav h1 {
place-self: center;
font-weight: 400;
font-size: 40px;
grid-column: 2;
}

.nav i {
align-self: center;
font-size: 40px;
}

.main {
height: 1500px;
width: 98%;
justify-self: start;
grid-area: main;
padding: 10px;
float: left;
background-color: #e8624c;
margin: 10px;
}

.sidebar-container {
height: 900px;
width: 300px;
justify-self: start;
background-color: #209B66;
grid-area: sidebar;
grid-column: 4;
top: 10px;
margin: 10px;
padding: 20px;
display: grid;
grid-template-rows: auto;
grid-row-gap: 10px;
}

.sidebar-container>p {
display: grid;
align-items: start;
padding: 0;
margin: 0;
}

.widget {
height: 500px;
width: 300px;
background-color: #E3962F;
}

.footer {
background-color: #333;
height: 800px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="main-content">
<div class="nav">
<h1>Sticky Sidebar Problem</h1>
<i class="fa fa-arrow-down" aria-hidden="true"></i>
</div>
<div class="main">
<p>
[Main Content]
</p>

</div>
<div class="sidebar-container">
<p>[Sidebar Container]</p>

<div class="widget">
<p> [Widget]</p>
</div>
</div>
</div>
<div class="footer"></div>
</body>

最佳答案

编辑 - jquery 解决方案(下面仅回答原始 css):

根据您的问题编辑提供了额外的约束并使仅 html/css 的解决方案变得更加困难,下面是一个 jquery 解决方案,使用您的代码和用于粘性侧边栏小部件的新 jquery 和用于制作侧边栏小部件的 css position: absoluteright: 30px(该值是任意的,具体取决于您希望小部件在侧边栏内的确切位置)。此外,注释掉其他一些 css 行,这些行要么没有做任何事情,要么干扰了你的网格布局的响应能力(粘性侧边栏功能在有或没有这些变化的情况下都有效,尽管你可能需要调整 right 小部件元素的 CSS,包括媒体查询,具体取决于您的布局最终结束的位置)。

$(function() {
const sidebar = $('.sidebar-container');
const widget = $('.widget');
const footer = $('.footer');
const space = 10; // arbitrary value to create space between the window and widget
const startTop = sidebar.offset().top + 60; // arbitrary start top position
const endTop = footer.offset().top - widget.height() - space;
widget.css('top', startTop);
$(window).scroll(function() {
const windowTop = $(this).scrollTop();
const widgetTop = widget.offset().top;
let newTop = startTop;
if (widgetTop >= startTop && widgetTop <= endTop) {
if (windowTop > startTop - space && windowTop < endTop - space) {
newTop = windowTop + space;
} else if (windowTop > endTop - space) {
newTop = endTop;
}

widget.stop().animate({
'top': newTop
});
}
});
});
@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700');

* {
font-family: 'Open Sans';
color: #fff;
box-sizing: content-box;
}

body {
padding: 0;
margin: 0;
}

p {
margin: 20px;
}

hr {
width: 85%;
border-style: solid;
}

.main-content {
width: 100%;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: 150px auto;
grid-template-areas: "nav nav nav nav" "main main main sidebar";
grid-column-gap: 20px;
grid-row-gap: 0px;
}

.nav {
grid-area: nav;
background-color: #266392;
display: grid;
grid-template-columns: 1fr 3fr 1fr;
}

.nav h1 {
place-self: center;
font-weight: 400;
font-size: 40px;
grid-column: 2;
}

.nav i {
align-self: center;
font-size: 40px;
}

.main {
height: 1500px;
/*width: 98%;
justify-self: start;*/
grid-area: main;
padding: 10px;
/*float: left;*/
background-color: #e8624c;
margin: 10px;
}

.sidebar-container {
height: 900px;
width: 300px;
justify-self: end;
background-color: #209B66;
grid-area: sidebar;
grid-column: 4;
/*top: 10px;*/
margin: 10px;
padding: 20px;
display: grid;
grid-template-rows: auto;
grid-row-gap: 10px;
}

.sidebar-container>p {
display: grid;
align-items: start;
padding: 0;
margin: 0;
}

.widget {
height: 500px;
width: 300px;
background-color: #E3962F;
position: absolute;
right: 30px;
}

.footer {
background-color: #333;
height: 800px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="main-content">
<div class="nav">
<h1>Sticky Sidebar Problem</h1>
<i class="fa fa-arrow-down" aria-hidden="true"></i>
</div>
<div class="main">
<p>
[Main Content]
</p>
</div>
<div class="sidebar-container">
<p>[Sidebar Container]</p>
<div class="widget">
<p> [Widget]</p>
</div>
</div>
</div>
<div class="footer"></div>
</body>

原始 - css 解决方案:

根据您对页脚和浏览器兼容性的要求,您可以在没有任何 javascript/jquery 的情况下获得您正在寻找的效果。您将不得不对您的 html 进行微小的调整,将您的页脚移到网格之外并单独设置样式(我只是为下面的示例添加了高度)。然后,您只需将 position: stickytop: 10px 添加到您的 .sidebar CSS。

结果是侧边栏在页眉滚动后开始滚动,然后在碰到页脚时停止滚动。

请注意 position: sticky 在 IE 中不受支持(有一个 polyfill for sticky )。

请参阅下面的代码片段,其中包含对您的代码进行的示例调整:

body {
padding: 0;
margin: 0;
}

.main-content {
width: 100%;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: 80px auto 400px;
grid-template-areas: "nav nav nav nav" "main main main sidebar" "footer footer footer footer";
grid-column-gap: 20px;
grid-row-gap: 10px;
height: 100%;
}

.nav {
grid-area: nav;
background-color: #007ccc;
}

.main {
height: 100%;
max-width: 600px;
justify-self: start;
grid-area: main;
padding: 10px;
float: left;
}

.sidebar {
height: 600px;
width: 300px;
justify-self: start;
background-color: #4BA25E;
grid-area: sidebar;
grid-column: 4;
margin: 10px;
position: sticky;
top: 10px;
}

.footer {
background-color: #333;
height: 400px;
}
<body>
<div class="main-content">
<div class="nav"></div>
<div class="main">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin tincidunt tempus nisi, vitae finibus nunc pharetra quis. Quisque in vehicula nunc. Nullam nec velit sed mi posuere ultricies pellentesque quis nibh. Morbi consequat, dui at consequat
rhoncus, neque nulla posuere odio, non dapibus velit urna in turpis. In feugiat massa orci, vitae scelerisque sem posuere ut.</p>
<p>Phasellus porttitor diam metus. Suspendisse quis mi sollicitudin, lobortis orci eu, pharetra ex. Cras ex nibh, dapibus quis tortor a, placerat commodo lorem. Mauris sed sapien ligula. Praesent lobortis cursus varius. Donec vulputate pulvinar interdum.
Suspendisse laoreet malesuada commodo.</p>

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin tincidunt tempus nisi, vitae finibus nunc pharetra quis. Quisque in vehicula nunc. Nullam nec velit sed mi posuere ultricies pellentesque quis nibh. Morbi consequat, dui at consequat
rhoncus, neque nulla posuere odio, non dapibus velit urna in turpis. In feugiat massa orci, vitae scelerisque sem posuere ut.</p>
<p>Phasellus porttitor diam metus. Suspendisse quis mi sollicitudin, lobortis orci eu, pharetra ex. Cras ex nibh, dapibus quis tortor a, placerat commodo lorem. Mauris sed sapien ligula. Praesent lobortis cursus varius. Donec vulputate pulvinar interdum.
Suspendisse laoreet malesuada commodo.</p>

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin tincidunt tempus nisi, vitae finibus nunc pharetra quis. Quisque in vehicula nunc. Nullam nec velit sed mi posuere ultricies pellentesque quis nibh. Morbi consequat, dui at consequat
rhoncus, neque nulla posuere odio, non dapibus velit urna in turpis. In feugiat massa orci, vitae scelerisque sem posuere ut.</p>
<p>Phasellus porttitor diam metus. Suspendisse quis mi sollicitudin, lobortis orci eu, pharetra ex. Cras ex nibh, dapibus quis tortor a, placerat commodo lorem. Mauris sed sapien ligula. Praesent lobortis cursus varius. Donec vulputate pulvinar interdum.
Suspendisse laoreet malesuada commodo.</p>

<p>In hac habitasse platea dictumst. Maecenas et mauris nunc. Aliquam erat volutpat. Duis eu condimentum ipsum. Etiam a mattis ipsum, sit amet vestibulum felis. In fermentum purus augue, vitae interdum ante gravida non. In tincidunt risus vitae ligula
dignissim pellentesque. Vivamus id est eget metus placerat euismod et nec diam. Integer luctus bibendum condimentum.</p>
<p>Vestibulum pretium quis mauris id pellentesque. Donec placerat iaculis ex, ut porta dolor vestibulum ac. Phasellus nunc tellus, viverra vestibulum posuere eu, faucibus vitae ex. Aenean efficitur maximus nunc, at sagittis nunc mattis sed. Vivamus
et magna vitae magna interdum sodales. Ut imperdiet lobortis consectetur.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin tincidunt tempus nisi, vitae finibus nunc pharetra quis. Quisque in vehicula nunc. Nullam nec velit sed mi posuere ultricies pellentesque quis nibh. Morbi consequat, dui at consequat
rhoncus, neque nulla posuere odio, non dapibus velit urna in turpis. In feugiat massa orci, vitae scelerisque sem posuere ut.</p>
<p>Phasellus porttitor diam metus. Suspendisse quis mi sollicitudin, lobortis orci eu, pharetra ex. Cras ex nibh, dapibus quis tortor a, placerat commodo lorem. Mauris sed sapien ligula. Praesent lobortis cursus varius. Donec vulputate pulvinar interdum.
Suspendisse laoreet malesuada commodo.</p>

<p>In hac habitasse platea dictumst. Maecenas et mauris nunc. Aliquam erat volutpat. Duis eu condimentum ipsum. Etiam a mattis ipsum, sit amet vestibulum felis. In fermentum purus augue, vitae interdum ante gravida non. In tincidunt risus vitae ligula
dignissim pellentesque. Vivamus id est eget metus placerat euismod et nec diam. Integer luctus bibendum condimentum.</p>
<p>Vestibulum pretium quis mauris id pellentesque. Donec placerat iaculis ex, ut porta dolor vestibulum ac. Phasellus nunc tellus, viverra vestibulum posuere eu, faucibus vitae ex. Aenean efficitur maximus nunc, at sagittis nunc mattis sed. Vivamus
etmagna vitae magna interdum sodales. Ut imperdiet lobortis consectetur.</p>
<p>Vestibulum pretium quis mauris id pellentesque. Donec placerat iaculis ex, ut porta dolor vestibulum ac. Phasellus nunc tellus, viverra vestibulum posuere eu, faucibus vitae ex. Aenean efficitur maximus nunc, at sagittis nunc mattis sed. Vivamus
etmagna vitae magna interdum sodales. Ut imperdiet lobortis consectetur.</p>
<p>Vestibulum pretium quis mauris id pellentesque. Donec placerat iaculis ex, ut porta dolor vestibulum ac. Phasellus nunc tellus, viverra vestibulum posuere eu, faucibus vitae ex. Aenean efficitur maximus nunc, at sagittis nunc mattis sed. Vivamus
etmagna vitae magna interdum sodales. Ut imperdiet lobortis consectetur.</p>
</div>
<div class="sidebar"></div>
</div>
<div class="footer"></div>
</body>

关于javascript - 使用 jQuery 在页眉和页脚之间滚动时如何使侧边栏变粘(不滚动它们)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52062163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com