scrollCenter.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // eslint-disable-next-line no-undef
  2. export default Behavior({
  3. methods: {
  4. getRect(selector, all = false) {
  5. return new Promise((resolve, reject) => {
  6. const query = wx.createSelectorQuery().in(this);
  7. const type = all ? query.selectAll(selector) : query.select(selector);
  8. type.boundingClientRect((res) => {
  9. if (!res) return reject('找不到元素');
  10. resolve(res);
  11. }).exec();
  12. });
  13. },
  14. queryScrollNode(res, currentIndex, type = 'width') {
  15. const currentRect = res[currentIndex];
  16. this.getRect('.l-tabsscroll').then(_ => {
  17. const scrollWidth = _[type];
  18. let transformDistance = res
  19. .slice(0, currentIndex)
  20. .reduce((prev, curr) => prev + curr[type], 0);
  21. transformDistance += (currentRect[type] - scrollWidth) / 2;
  22. if (type === 'width') {
  23. this.setData({
  24. transformX: transformDistance,
  25. transformY: 0
  26. });
  27. } else {
  28. this.setData({
  29. transformX: 0,
  30. transformY: transformDistance
  31. });
  32. }
  33. });
  34. },
  35. queryMultipleNodes() {
  36. const {
  37. placement,
  38. currentIndex
  39. } = this.data;
  40. this.getRect('.l-tabs-item', true)
  41. .then((res) => {
  42. if (['top', 'bottom'].indexOf(placement) !== -1) {
  43. this.queryScrollNode(res, currentIndex);
  44. } else {
  45. this.queryScrollNode(res, currentIndex, 'height');
  46. }
  47. });
  48. }
  49. }
  50. });