创建并返回一个 对象实例。

平台差异说明

margins 参数: 用来扩展(或收缩)参照节点布局区域的边界。

下面的示例代码中,如果目标节点 ".test" 进入 ".scroll" 区域以下 100px 时,就会触发回调函数。

Tips

  • 与页面显示区域的相交区域并不准确代表用户可见的区域,因为参与计算的区域是“布局区域”,布局区域可能会在绘制时被其他节点裁剪隐藏(如祖先节点中 overflow 样式为 hidden 的节点)或遮盖(如 fixed 定位的节点)。
  • 节点交互状态 API 建议在 onReady 生命周期里监听,因为此 API 需要查找页面元素,onReady 时页面已经完成初次渲染,已经能查找到对应的元素。
  1. <template>
  2. <view class="container">
  3. <text>{{appear ? '小球出现' : '小球消失'}}</text>
  4. <view class="page-section">
  5. <scroll-view class="scroll-view" scroll-y>
  6. <view class="scroll-area">
  7. <view class="ball"></view>
  8. </view>
  9. </scroll-view>
  10. </view>
  11. </view>
  12. </template>
  13. <script>
  14. let observer = null;
  15. export default {
  16. data() {
  17. return {
  18. appear: false
  19. }
  20. onReady() {
  21. observer = uni.createIntersectionObserver(this);
  22. observer.relativeTo('.scroll-view').observe('.ball', (res) => {
  23. if (res.intersectionRatio > 0 && !this.appear) {
  24. this.appear = true;
  25. } else if (!res.intersectionRatio > 0 && this.appear) {
  26. this.appear = false;
  27. }
  28. })
  29. },
  30. onUnload() {
  31. if (observer) {
  32. observer.disconnect()
  33. }
  34. }
  35. }
  36. </script>
  37. view,page {
  38. display: flex;
  39. flex-direction: column;
  40. }
  41. .scroll-view {
  42. background: #fff;
  43. border: 1px solid #ccc;
  44. box-sizing: border-box;
  45. }
  46. .scroll-area {
  47. height: 1300rpx;
  48. display: flex;
  49. flex-direction: column;
  50. align-items: center;
  51. transition: .5s;
  52. }
  53. .notice {
  54. margin-top: 150rpx;
  55. margin: 150rpx 0 400rpx 0;
  56. }
  57. .ball {
  58. width: 200rpx;
  59. height: 200rpx;
  60. background: #1AAD19;
  61. border-radius: 50%;
  62. }

发现错误?想参与编辑?