BackTop.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. var __defProp = Object.defineProperty;
  2. var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  3. var __getOwnPropNames = Object.getOwnPropertyNames;
  4. var __hasOwnProp = Object.prototype.hasOwnProperty;
  5. var __export = (target, all) => {
  6. for (var name2 in all)
  7. __defProp(target, name2, { get: all[name2], enumerable: true });
  8. };
  9. var __copyProps = (to, from, except, desc) => {
  10. if (from && typeof from === "object" || typeof from === "function") {
  11. for (let key of __getOwnPropNames(from))
  12. if (!__hasOwnProp.call(to, key) && key !== except)
  13. __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  14. }
  15. return to;
  16. };
  17. var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  18. var stdin_exports = {};
  19. __export(stdin_exports, {
  20. backTopProps: () => backTopProps,
  21. default: () => stdin_default
  22. });
  23. module.exports = __toCommonJS(stdin_exports);
  24. var import_vue = require("vue");
  25. var import_utils = require("../utils");
  26. var import_util = require("../lazyload/vue-lazyload/util");
  27. var import_use = require("@vant/use");
  28. var import_icon = require("../icon");
  29. const [name, bem] = (0, import_utils.createNamespace)("back-top");
  30. const backTopProps = {
  31. right: import_utils.numericProp,
  32. bottom: import_utils.numericProp,
  33. zIndex: import_utils.numericProp,
  34. target: [String, Object],
  35. offset: (0, import_utils.makeNumericProp)(200),
  36. immediate: Boolean,
  37. teleport: {
  38. type: [String, Object],
  39. default: "body"
  40. }
  41. };
  42. var stdin_default = (0, import_vue.defineComponent)({
  43. name,
  44. inheritAttrs: false,
  45. props: backTopProps,
  46. emits: ["click"],
  47. setup(props, {
  48. emit,
  49. slots,
  50. attrs
  51. }) {
  52. let shouldReshow = false;
  53. const show = (0, import_vue.ref)(false);
  54. const root = (0, import_vue.ref)();
  55. const scrollParent = (0, import_vue.ref)();
  56. const style = (0, import_vue.computed)(() => (0, import_utils.extend)((0, import_utils.getZIndexStyle)(props.zIndex), {
  57. right: (0, import_utils.addUnit)(props.right),
  58. bottom: (0, import_utils.addUnit)(props.bottom)
  59. }));
  60. const onClick = (event) => {
  61. var _a;
  62. emit("click", event);
  63. (_a = scrollParent.value) == null ? void 0 : _a.scrollTo({
  64. top: 0,
  65. behavior: props.immediate ? "auto" : "smooth"
  66. });
  67. };
  68. const scroll = () => {
  69. show.value = scrollParent.value ? (0, import_utils.getScrollTop)(scrollParent.value) >= +props.offset : false;
  70. };
  71. const getTarget = () => {
  72. const {
  73. target
  74. } = props;
  75. if (typeof target === "string") {
  76. const el = document.querySelector(target);
  77. if (el) {
  78. return el;
  79. }
  80. if (process.env.NODE_ENV !== "production") {
  81. console.error(`[Vant] BackTop: target element "${target}" was not found, the BackTop component will not be rendered.`);
  82. }
  83. } else {
  84. return target;
  85. }
  86. };
  87. const updateTarget = () => {
  88. if (import_utils.inBrowser) {
  89. (0, import_vue.nextTick)(() => {
  90. scrollParent.value = props.target ? getTarget() : (0, import_use.getScrollParent)(root.value);
  91. scroll();
  92. });
  93. }
  94. };
  95. (0, import_use.useEventListener)("scroll", (0, import_util.throttle)(scroll, 100), {
  96. target: scrollParent
  97. });
  98. (0, import_vue.onMounted)(updateTarget);
  99. (0, import_vue.onActivated)(() => {
  100. if (shouldReshow) {
  101. show.value = true;
  102. shouldReshow = false;
  103. }
  104. });
  105. (0, import_vue.onDeactivated)(() => {
  106. if (show.value && props.teleport) {
  107. show.value = false;
  108. shouldReshow = true;
  109. }
  110. });
  111. (0, import_vue.watch)(() => props.target, updateTarget);
  112. return () => {
  113. const Content = (0, import_vue.createVNode)("div", (0, import_vue.mergeProps)({
  114. "ref": !props.teleport ? root : void 0,
  115. "class": bem({
  116. active: show.value
  117. }),
  118. "style": style.value,
  119. "onClick": onClick
  120. }, attrs), [slots.default ? slots.default() : (0, import_vue.createVNode)(import_icon.Icon, {
  121. "name": "back-top",
  122. "class": bem("icon")
  123. }, null)]);
  124. if (props.teleport) {
  125. return [(0, import_vue.createVNode)("div", {
  126. "ref": root,
  127. "class": bem("placeholder")
  128. }, null), (0, import_vue.createVNode)(import_vue.Teleport, {
  129. "to": props.teleport
  130. }, {
  131. default: () => [Content]
  132. })];
  133. }
  134. return Content;
  135. };
  136. }
  137. });