从任何地方滚动 Div

2023-12-27

当我的页面底部(a.k.a. #main)进入视图 jQuery 在我的侧边栏上切换一个类,使其可滚动overflow-y: scroll — and overflow: hidden当页面底部看不见时。

这里想要的效果是在页面的底部(在我的例子中,这又是#main div),但如果有更多内容,则允许侧边栏继续滚动。

所以如果你继续向下滚动#main即使到达底部后,侧边栏也会开始滚动。

现在的问题是所需的滚动效果仅在光标悬停时才起作用#sidebar。我希望它更自然并且能够滚动而不需要将光标悬停在#sidebar.

HTML:

<div id="container">
    <div id="header"></div>

    <div id="main"> 
        <p>Lorem ipsum dolor sit amet, [...]</p>   
    </div>
    <div id="sidebar">
        <ul>
            <li>Item 1</li>
            <li>Item 2</li>
            <li>Item 3</li>
            <li>Item 4</li>
            <li>Item 5</li>
            <li>Item 6</li>
            <li>Item 7</li>
            <li>Item 8</li>
            <li>Item 9</li>
            <li>Item 10</li>
            [...]
         </ul>
    </div>
</div>

JavaScript:

$('#sidebar').height( $('#main').height() );

$('#main').waypoint(function() {
    $('#sidebar').toggleClass('scrollable');
}, { offset: 'bottom-in-view' });

我在这里为我的问题设置了一个小提琴: http://jsfiddle.net/ZZqLr/ http://jsfiddle.net/ZZqLr/


跟进:通过从另一个角度解决问题,我成功地达到了预期的效果。

这一次,当底部#main进入视野后,它固定在窗口的底部,而#sidebar继续自由滚动。这有点像黑客,但在视觉上与我的需求相同。

http://jsfiddle.net/ZZqLr/1/ http://jsfiddle.net/ZZqLr/1/


您可以使用以下代码捕获鼠标的滚动事件:

var mouseWheelEvent = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel"; //FF doesn't recognize mousewheel as of FF3.x

if (document.attachEvent) { //if IE (and Opera depending on user setting) 
    document.attachEvent("on"+mouseWheelEvent, mouseWheelEventHandler);
} else if (document.addEventListener) { //WC3 browsers 
    document.addEventListener(mouseWheelEvent, mouseWheelEventHandler, false);
}

此后,即使您已到达文档末尾,也很容易看到有人滚动。 这mouseWheelEventHandler是我传递来处理你的函数mouseWheelEvent对你来说,它看起来像这样:

function mouseWheelEventHandler(e)
{
    if( !sidebar.hasClass('scrollable') && !sidebar.is(":hover") ) {
        return true;
    }

    var event = window.event || e; //equalize event object
    var delta = event.detail ? event.detail*(-120) : event.wheelDelta; //check for detail first so Opera uses that instead of wheelDelta
    sidebar.scrollTop(sidebar.scrollTop()-delta);        
}

仅当侧边栏具有可滚动类并且您尚未将鼠标放在侧边栏上时,它才会滚动侧边栏,因为无论如何它都会滚动该元素,并且您将向上滚动它。

根据以下链接,这应该适用于大多数浏览器:http://www.javascriptkit.com/javatutors/onmousewheel.shtml http://www.javascriptkit.com/javatutors/onmousewheel.shtml

当然,这是可以玩的小提琴:http://jsfiddle.net/ZZqLr/5/ http://jsfiddle.net/ZZqLr/5/

EDIT

为了完成答案,我们将添加当您再次向上滚动时仅向上滚动侧边栏而不是页面的行为,为此我们只需通过以下方式防止滚动事件event.preventDefault()并在末尾添加以下代码mouseWheelEventHandler:

if( sidebar.scrollTop() == 0 ) {
    sidebar.removeClass('scrollable');
}

该函数如下所示:

function mouseWheelEventHandler(e)
{
    if( !sidebar.hasClass('scrollable') && !sidebar.is(":hover") ) {
        return true;
    }
    var event = window.event || e; //equalize event object
    event.preventDefault();
    var delta = event.detail ? event.detail*(-120) : event.wheelDelta; //check for detail first so Opera uses that instead of wheelDelta
    sidebar.scrollTop(sidebar.scrollTop()-delta);
    if( sidebar.scrollTop() == 0 ) {
        sidebar.removeClass('scrollable');
    }
}

您再次可以在这里使用它:http://jsfiddle.net/ZZqLr/6/ http://jsfiddle.net/ZZqLr/6/

顺便说一句,waypoints.js 甚至不是必需的,只是为了好玩,无需 waypoints.js,只需删除 waypoint 函数并在 eventHandle 函数中添加以下内容即可:

function mouseWheelEventHandler(e)
{
    if( !sidebar.hasClass('scrollable') && !sidebar.is(":hover") ) {
        if($(window).scrollTop() + $(window).height() == $(document).height()) {
            sidebar.addClass('scrollable');
        }
        return true;
    }

    var event = window.event || e; //equalize event object
    event.preventDefault();
    var delta = event.detail ? event.detail*(-120) : event.wheelDelta; //check for detail first so Opera uses that instead of wheelDelta
    sidebar.scrollTop(sidebar.scrollTop()-delta);
    if( sidebar.scrollTop() == 0 ) {
        sidebar.removeClass('scrollable');
    }
    return true;
}

也为了玩这个,你可能已经猜到了:http://jsfiddle.net/ZZqLr/7/ http://jsfiddle.net/ZZqLr/7/

我想这就是全部了:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从任何地方滚动 Div 的相关文章

  • Chrome 扩展程序导致 DOM 闪烁,该扩展程序会在页面加载之前删除 DOM 元素

    我正在编写一个 chrome 扩展 我想在页面加载之前删除内容 例如this http tech blog tomchambers me 2016 01 13 How to write a simple page rewriting Chr
  • 多个模板槽的相同槽内容

    在vuejs中 有没有一种方法可以为多个插槽设置相同的内容 而无需复制粘贴 So this
  • css中的减号或下划线有什么作用吗?

    这个问题和我问的很相似here https stackoverflow com questions 6110816 period in css does it do anything 我正在清理一些文件 我在这个 css 中遇到了这个 so
  • 带搜索框的 D3 图表

    我在 D3 中创建了一个图表 其中节点显示特定个人创建文档的时间 该图表还显示了一个搜索框 该搜索框根据搜索框输入是否与与该文档关联的单词匹配而将节点变成红色 这些单词列在数据集的第 5 列中 请参阅下面的数据集 我的问题 一旦将搜索输入到
  • html 标题的最大长度

    有谁知道我可以为 html title 属性输入的最大长度是多少以及是否允许使用特殊字符 根据当前的 HTML 4 和 5 规范 标题长度没有限制 但 IE 浏览器有 512 个字符的限制HTML 4 01 http msdn micros
  • Python 中 Javascript 的 reduce()、map() 和 filter() 的等价物是什么?

    Python 的等价物是什么 Javascript function wordParts currentPart lastPart return currentPart lastPart word Che mis try console l
  • jQuery - 页面上最宽的项目

    如何使用 jQuery 在网页上找到最宽的项目 在 css 中设置的宽度或作为属性 不会很快 但应该可以解决问题 var widest null each function if widest null widest this else i
  • 如何使 :focus, :active 与 :hover 相同

    有没有简单的方法使 focus 和 active 表现得像 hover 通常我写 class a hover class a active class a focus 但我只想写一个 hover 规则 并且 focus active 看起来
  • 使用预先存在的数据库创建 PhoneGap iOS 应用程序

    我最近开始开发一个使用 PhoneGap 版本 2 8 0 作为药物查找器的应用程序 过去 我创建了该工具的 Web 版本 它使用 jQuery Mobile 和 PHP 来访问远程 SQL 数据库 PhoneGap 似乎是一个很有吸引力的
  • CORS:为什么我的浏览器不发送 OPTIONS 预检请求?

    从我读到的内容来看CORS https en wikipedia org wiki Cross origin resource sharing 我理解它应该按如下方式工作 客户端的脚本尝试获取资源从服务器不同的起源 浏览器拦截这个请求并首先
  • 样式选项标签[重复]

    这个问题在这里已经有答案了 我有一个包含选项的下拉菜单 我想部分地打破和粗体一些文本以及插入上下文中断 我尝试使用 CSS 和 HTML 标签 但无法得到它 有人可以建议一个解决方案吗 提前致谢 我知道这个问题有点老了 或者至少不是新的 但
  • 删除移动设备上的 adsense

    我正在研究响应式设计 但在使用 adsense 时遇到了问题 我有一个广告应该显示在桌面设计上 但不能显示在移动设计上 因此 只有在桌面上查看网站时 才应将广告代码放置在 html 中 css 可以使用 display none 但这违反了
  • 与基线和文本区域垂直对齐

    我试图让标签与文本区域中第一行文本的基线对齐 天真的尝试 div style display inline block div
  • getCompatedStyle 类似于 IE8 的 javascript 函数

    我正在尝试在 Java GWT 代码中编写一个 Javascript 函数 该函数获取以下样式的值 direction fontFamily fontSize fontSizeAdjust fontStyle fontWeight lett
  • 当 JavaScript 抛出异常时不要停止它

    我正在使用 JavaScript 编写一个 Windows 边栏小工具 现在我想捕获所有 JavaScript 异常并将其记录到文本文件中 一个问题是 当任何一行抛出异常时 下一行将不会被执行 是否可以自动捕获异常 以便执行以下 JavaS
  • 使用 Python 和 lxml 从 HTML 中删除类属性

    Question 如何使用 python 和 lxml 从 html 中删除类属性 Example I have p class DumbClass Lorem ipsum dolor sit amet consectetur adipis
  • 使用 HTML 标签作为背景图像而不是 CSS background-image 属性?

    我需要使用 html img 标签作为背景图像 div 然后我将放置一个 p 的内容 我已经尝试过 但似乎无法让它们正确显示 我使用了相对位置 负值的边距 任何建议或指出我正确的方向将不胜感激 p div img src http www
  • React Native:当您的应用程序关闭时是否有回调函数?

    我有一个 setInterval 即使您关闭 而不是退出 应用程序也会继续运行 我想在我的应用程序关闭或设备进入睡眠状态时调用一个函数 以便清除 setInterval AppState 是你的朋友 看看AppState 的文档 https
  • 如何防止外部 CSS 添加和覆盖 ReactJS 组件样式

    我有一个自定义的 ReactJS 组件 我想以某种方式设置样式 并将其作为插件提供给许多不同的网站 但是 当网站使用全局样式 Twitter bootstrap 或其他 css 框架 时 它会添加并覆盖我的组件的样式 例如 全局 css l
  • 表格单元格中 ::after 上的位置在 Firefox 中不起作用?

    以下代码应创建一个跨越其父元素宽度 100 的伪元素 然而 这在 Firefox 中不起作用 但在 Chrome 中却有效 火狐浏览器似乎忽略了 parent s position relative 这是一个错误吗 HTML div cla

随机推荐