odoo16中 导航栏悬停

文章讲述了作者在项目中遇到的问题,即如何使用JavaScript解决$(window).scrollTop无法获取目标元素到顶部距离的问题,重点介绍了一个使用公共Widget库实现的导航栏粘滞效果的代码片段,包括事件监听、滚动判断和样式调整。
摘要由CSDN通过智能技术生成

一开始尝试了很多方法,都需要用到$(window).scrollTop。但是我的项目使用$(window).scrollTop,获取不到目标元素到顶部的距离,所以换了这种可以实现的方法:

xml文件中的部分内容:

<div class="min_banner_nav" >
            <div class="banner_container">
                <img src="/xxx.jpg"/>
                <div class="banner_con_title">
                    <h2>
                        标题
                    </h2>
                </div>
            </div>
            <div class="min_nav" data-sticky-threshold="330">
                <div class="min_nav_content">
                    <!--导航栏内容-->
                    <ul class="d-flex justify-content-evenly">
                        <a href="#one"><li class="min_nav_item" data-target="one">内容1</li></a>
                        <a href="#two"><li class="min_nav_item" data-target="two">内容2</li></a>
                        <a href="#three"><li class="min_nav_item" data-target="three">内容3</li></a>
                        <a href="#four"><li class="min_nav_item" data-target="four">内容4</li></a>
                        <a href="#five"><li class="min_nav_item" data-target="five">内容5</li></a>
                        <a href="#six"><li class="min_nav_item" data-target="six">内容6</li></a>
                        <a href="#seven"><li class="min_nav_item" data-target="seven">内容7</li></a>
                    </ul>
                </div>
            </div>
        </div>

js文件里的内容:

// 定义Odoo模块 `your_module_name.min_nav_style`
odoo.define('your_module_name.min_nav', function (require) {
    'use strict';

    // 引入公共Widget库
    var publicWidget = require('web.public.widget');

    // 创建一个名为'navScrollStyle'的公共Widget扩展
    publicWidget.registry.navScrollStyle= publicWidget.Widget.extend({

        // 定义选择器,此Widget将应用于所有匹配该选择器的DOM元素
        selector: '.min_banner_nav',

        // 初始化事件对象,这里为空,因为我们直接在start方法里处理滚动事件
        events: {},

        // 初始化方法,在创建Widget实例时调用
        init: function () {
            // 保存原始导航栏的CSS样式,以便在取消粘滞状态时恢复
            this.originalNavBarCss = {
                position: $('.min_nav').css('position'),
                // 这里可以添加更多需要存储并恢复的样式属性
            };

            // 从.min_nav元素的"data-sticky-threshold"属性中获取粘滞阈值
            this.stickyThreshold = parseInt($('.min_nav').data('sticky-threshold'), 10);
        },

        // 开始方法,在Widget启动并附加到DOM时调用
        start: function () {
            var _this = this;

            // 监听窗口滚动事件
            window.addEventListener('scroll', function () {
                // 获取.min_banner_nav父元素相对于视口的位置
                var rect = $('.min_banner_nav').parent()[0].getBoundingClientRect();

                // 判断滚动高度是否超过阈值
                if (window.scrollY >= rect.top + _this.stickyThreshold) {
                    // 当滚动到阈值以上时,将.min_nav变为固定定位,并设置相关样式
                    $('.min_nav').css({
                        position: 'fixed',
                        top: '53px',
                        width: '100%',
                        zIndex: 1000,
                        // 可在此处添加更多在固定状态下需要设置的样式属性
                    });
                } else {
                    // 否则,将.min_nav的样式恢复至初始状态
                    $('.min_nav').css(_this.originalNavBarCss);
                }
            }, true); // 使用捕获阶段的事件监听器,确保在早期阶段捕获事件

        },

        // 销毁方法,在Widget从DOM中移除时调用,用于清理资源
        destroy: function () {
            // 移除滚动事件监听器
            // 注意:这里假设存在名为scrollHandler的变量存储了滚动事件处理器
            // 若在start方法中使用了匿名函数,则此处需要先将匿名函数赋值给实例变量
            window.removeEventListener('scroll', this.scrollHandler, true);
        },
    });

    // 返回已定义的Widget类,供Odoo系统识别并使用
    return publicWidget.registry.navScrollStyle;
});

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值