popover.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. const { windowWidth, windowHeight } = wx.getSystemInfoSync();
  2. // 三角形箭头的高度
  3. const trangleHeight = 12;
  4. Component({
  5. relations: {
  6. './popover-item': {
  7. type: 'child'
  8. }
  9. },
  10. data: {
  11. // 当前显隐状态
  12. visible: false,
  13. // popover 宽
  14. pw: 100,
  15. // popover 高
  16. ph: 120,
  17. // popover 距左距离
  18. px: 0,
  19. // popover 距上距离
  20. py: 0,
  21. // 垂直方向 top/bottom
  22. vertical: '',
  23. // 水平方向 left/center/right
  24. align: ''
  25. },
  26. methods: {
  27. onDisplay: function(e) {
  28. let self = this;
  29. if (self.last && self.last === e.id) {
  30. self.setData({
  31. visible: !self.data.visible
  32. });
  33. } else {
  34. wx.createSelectorQuery().selectViewport().scrollOffset(view => {
  35. let { pw, ph, px, py, vertical, align } = self.data;
  36. console.log(pw, ph, px, py, vertical, align)
  37. let pOverW = (pw - e.width) / 2;
  38. let offsetL = e.left,
  39. offsetR = windowWidth - e.right,
  40. offsetB = windowHeight - e.bottom;
  41. if (offsetL >= pOverW && offsetR >= pOverW) {
  42. align = 'center';
  43. px = e.left - pOverW;
  44. } else if (offsetL > pOverW && offsetR < pOverW) {
  45. align = 'left';
  46. px = windowWidth - (offsetR + pw);
  47. // 如果向右贴边了,设置一点距离
  48. if ((windowWidth - pw) == px) px -= 5;
  49. } else if (offsetL < pOverW && offsetR > pOverW) {
  50. align = 'right';
  51. px = e.left;
  52. // 如果向左贴边了,设置一点距离
  53. if (px == 0) px += 5;
  54. }
  55. console.log(offsetB,ph,trangleHeight,view.scrollTop , e.bottom )
  56. if (offsetB >= (ph + trangleHeight)) {
  57. vertical = 'bottom';
  58. py = view.scrollTop + e.bottom + trangleHeight;
  59. } else {
  60. vertical = 'top';
  61. py = view.scrollTop + e.top - ph - trangleHeight;
  62. }
  63. self.setData({
  64. visible: true,
  65. px: px,
  66. py: py,
  67. ph: self.getItemsHeight(),
  68. vertical: vertical,
  69. align: align
  70. });
  71. }).exec();
  72. }
  73. // 记录上一次点击的元素
  74. self.last = e.id;
  75. },
  76. onHide: function() {
  77. this.setData({
  78. visible: false
  79. });
  80. },
  81. // 获取所有子元素
  82. getItems: function() {
  83. return this.getRelationNodes('./popover-item');
  84. },
  85. // 获取所有子元素的总高度
  86. getItemsHeight() {
  87. return this.getItems().map(item => item.data.height).reduce((a, b) => a + b, 0);
  88. }
  89. }
  90. })