微信小程序(五) 节点侦听 | wx.createIntersectionObserver

建议以代码段的方式查看,查看实时调试结果可能会更快的理解这个东西

代码段地址:微信开发者工具 | 代码片段

index.wxml
<view class="fixed-wrap" id="fixed-wrap">
  <view
    id="fixed-content"
    class="fixed-box {{ isFixed ? 'stick' : '' }}"
    data-text="自定义添加的文字"
    data-id="{{ identifier }}"
  >
    <text>{{ isFixed ? '吸顶啦' : '元素滑动至tab栏时吸顶' }}</text>
  </view>
</view>
index.js
Page({
  data: {
    // 给固定定位元素添加的自定义标识
    identifier: new Date().getTime(),
    isFixed: false
  },

  onLoad() {
    // 页面渲染要很久并且高度不固定的情况下,用这个比较稳定
    this.onElementLinstener();
  },
  /**
   * 同样以吸顶功能为需求,做一个节点侦听器版本的吸顶功能,借此过程可以根据调试结果更好的熟悉api的使用
   * 即使看过文档,查过一些大佬的使用案例和说明也一样是有点懵,索性新建了个代码片段去尝试,不停的调试查看打印数据,终于完成了需求
   * 想给用到这个API的各位说一下,因为是在项目结束后才有时间去总结这些,所以使用时候踩的坑和迷惑的地方可能没办法全部描述出来,所以即使看过它,也只是看了个和官方文档差不多的一个例子而已,还是需要自己写demo去查看不同状态下的打印数据。
   * 多去尝试,敢于试错
   */
  // 元素观察器
  onElementLinstener () {
    wx.setNavigationBarTitle({ title: '元素观察器' })
    // 获取系统信息 statusBarHeight为状态栏高度
    const { statusBarHeight } = wx.getSystemInfoSync();
    // 创建节点侦查器
    const createIntersectionObserver = wx.createIntersectionObserver(this);
    // 可以链式调用,这里是为了写备注方便点
    /**
     * 调用 relativeToViewport() 去指定页面显示区域作为参照
     * 假定 statusBarHeight 的值为 20 ,那么下边的代码就是选择了距离顶部 64像素(模拟导航栏高度) 的地方,就像页面的一条横截线一样
     * observe() 的第一个参数指定的元素达到所选的参照区域,则侦听器触发回调
     */
    createIntersectionObserver.relativeToViewport({ top: -(statusBarHeight + 44) });
    // 指定要侦测的元素为 '#fixed-wrap' , ← 为包裹固定元素的容器而不是固定元素
    createIntersectionObserver.observe('#fixed-wrap', res => {
      const { boundingClientRect, intersectionRect } = res;
      // boundingClientRect - 目标边界相对于页面的情况
      // clientTop 为与目标相去的高度,当它为负值的时候则说明元素已经过了我们所设置监听的那个高度
      const { top: clientTop } = boundingClientRect;
      // intersectionRect - 与目标相交的区域 上下左右.. 单位px 因为这里指定的是页面的一条横截线,所以无所谓上下左右
      // top 为观察元素相对于页面的高度
      const { top } = intersectionRect;
      if (clientTop <= 0 && top === 0) {
        this.setData({ isFixed: true });
        return;
      }
      this.setData({ isFixed: false });
    });
  },
})

参考链接:微信官方文档 | IntersectionObserver

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现对菜单项的监听,需要使用Java中的ActionListener接口。可以通过以下几个步骤来实现: 1. 创建菜单项并将其添加到菜单中。 2. 创建一个实现ActionListener接口的类,该类负责处理菜单项的点击事件。 3. 将ActionListener实例添加到菜单项上,以便在用户单击菜单项时调用其方法。 以下是示例代码: ```java import javax.swing.*; import java.awt.event.*; public class MenuDemo implements ActionListener { JFrame frame; public MenuDemo() { // 创建 JFrame 实例 frame = new JFrame("Menu Demo"); // 创建菜单栏 JMenuBar menuBar = new JMenuBar(); // 创建菜单 JMenu fileMenu = new JMenu("File"); JMenu editMenu = new JMenu("Edit"); // 创建菜单项 JMenuItem newItem = new JMenuItem("New"); JMenuItem openItem = new JMenuItem("Open"); JMenuItem saveItem = new JMenuItem("Save"); JMenuItem cutItem = new JMenuItem("Cut"); JMenuItem copyItem = new JMenuItem("Copy"); JMenuItem pasteItem = new JMenuItem("Paste"); // 将菜单项添加到菜单中 fileMenu.add(newItem); fileMenu.add(openItem); fileMenu.add(saveItem); editMenu.add(cutItem); editMenu.add(copyItem); editMenu.add(pasteItem); // 将菜单添加到菜单栏中 menuBar.add(fileMenu); menuBar.add(editMenu); // 将菜单栏添加到 JFrame 中 frame.setJMenuBar(menuBar); // 添加菜单项的 ActionListener newItem.addActionListener(this); openItem.addActionListener(this); saveItem.addActionListener(this); cutItem.addActionListener(this); copyItem.addActionListener(this); pasteItem.addActionListener(this); // 设置 JFrame 大小和可见性 frame.setSize(500, 500); frame.setVisible(true); } // 实现 ActionListener 接口中的 actionPerformed() 方法 public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); // 根据菜单项的命令执行相应的操作 if (command.equals("New")) { // 执行 New 操作 } else if (command.equals("Open")) { // 执行 Open 操作 } else if (command.equals("Save")) { // 执行 Save 操作 } else if (command.equals("Cut")) { // 执行 Cut 操作 } else if (command.equals("Copy")) { // 执行 Copy 操作 } else if (command.equals("Paste")) { // 执行 Paste 操作 } } public static void main(String[] args) { new MenuDemo(); } } ``` 在上述代码中,我们创建了一个包含两个菜单(File和Edit)的菜单栏,并将多个菜单项添加到这些菜单中。我们还实现了ActionListener接口,并将其添加到每个菜单项上,以便在用户单击菜单项时执行相应的操作。在actionPerformed()方法中,我们使用getActionCommand()方法获取菜单项的命令,并根据命令执行相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值