tdesign-vue-next
Version:
TDesign Component for vue-next
216 lines (208 loc) • 8.25 kB
JavaScript
/**
* tdesign v1.11.5
* (c) 2025 tdesign
* @license MIT
*/
;
Object.defineProperty(exports, '__esModule', { value: true });
var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
var Vue = require('vue');
var _regeneratorRuntime = require('@babel/runtime/regenerator');
var utils_dom = require('../utils/dom.js');
var affix_props = require('./props.js');
var hooks_useConfig = require('../hooks/useConfig.js');
var hooks_tnode = require('../_chunks/dep-a69ce597.js');
var isUndefined = require('../_chunks/dep-93cf0a54.js');
var isFunction = require('../_chunks/dep-047617bf.js');
require('../_chunks/dep-30fb1b25.js');
require('../_chunks/dep-b8b9c2a3.js');
require('../_chunks/dep-bbe343d7.js');
require('@babel/runtime/helpers/typeof');
require('../_chunks/dep-5ad8a2ab.js');
require('../_chunks/dep-0c2ad01b.js');
require('../config-provider/hooks/useConfig.js');
require('../_chunks/dep-b4c4a54b.js');
require('../_chunks/dep-f8ff548f.js');
require('dayjs');
require('../_chunks/dep-b6c192db.js');
require('../_chunks/dep-ba2090c8.js');
require('../_chunks/dep-b27d3215.js');
require('../_chunks/dep-ed572eb3.js');
require('../_chunks/dep-0a510359.js');
require('../_chunks/dep-50a41d31.js');
require('../_chunks/dep-be3c3d53.js');
require('../_chunks/dep-8b98fa07.js');
require('../_chunks/dep-b0b4fff1.js');
require('../_chunks/dep-7a21da5b.js');
require('../_chunks/dep-49fa220e.js');
require('../_chunks/dep-02ebb419.js');
require('../_chunks/dep-feae46a3.js');
require('../_chunks/dep-abf21389.js');
require('../_chunks/dep-7f32423d.js');
require('../_chunks/dep-7c9e3d93.js');
require('../_chunks/dep-61a7e281.js');
require('../_chunks/dep-ecbaedee.js');
require('../_chunks/dep-9de7d250.js');
require('../_chunks/dep-6f8a66a3.js');
require('../utils/render-tnode.js');
require('../_chunks/dep-db023c41.js');
require('../_chunks/dep-e495f218.js');
require('../_chunks/dep-bafc1f63.js');
require('../_chunks/dep-c07d6878.js');
require('../_chunks/dep-a957c564.js');
require('../_chunks/dep-acb090bf.js');
require('../_chunks/dep-76218bd8.js');
require('../_chunks/dep-9a321a91.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var _asyncToGenerator__default = /*#__PURE__*/_interopDefaultLegacy(_asyncToGenerator);
var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultLegacy(_regeneratorRuntime);
var _Affix = Vue.defineComponent({
name: "TAffix",
props: affix_props["default"],
emits: ["fixedChange"],
setup: function setup(props2, context) {
var _document;
var COMPONENT_NAME = hooks_useConfig.usePrefixClass("affix");
var renderTNodeJSX = hooks_tnode.useTNodeJSX();
var affixWrapRef = Vue.ref(null);
var affixRef = Vue.ref(null);
var placeholderEL = Vue.ref((_document = document) === null || _document === void 0 ? void 0 : _document.createElement("div"));
var ticking = Vue.ref(false);
var isBind = Vue.ref(false);
var scrollContainer = Vue.ref();
var affixStyle = Vue.ref();
var rAFId = 0;
var handleScroll = function handleScroll() {
if (!ticking.value) {
rAFId = window.requestAnimationFrame(function () {
var _affixWrapRef$value$g, _affixWrapRef$value;
rAFId = 0;
var _ref = (_affixWrapRef$value$g = (_affixWrapRef$value = affixWrapRef.value) === null || _affixWrapRef$value === void 0 ? void 0 : _affixWrapRef$value.getBoundingClientRect()) !== null && _affixWrapRef$value$g !== void 0 ? _affixWrapRef$value$g : {
top: 0,
width: 0,
height: 0
},
wrapToTop = _ref.top,
wrapWidth = _ref.width,
wrapHeight = _ref.height;
var containerTop = 0;
if (scrollContainer.value instanceof HTMLElement) {
containerTop = scrollContainer.value.getBoundingClientRect().top;
}
var fixedTop;
var calcTop = wrapToTop - containerTop;
var containerHeight = scrollContainer.value[scrollContainer.value instanceof Window ? "innerHeight" : "clientHeight"] - wrapHeight;
var calcBottom = containerTop + containerHeight - props2.offsetBottom;
if (!isUndefined.isUndefined(props2.offsetTop) && calcTop <= props2.offsetTop) {
fixedTop = containerTop + props2.offsetTop;
} else if (!isUndefined.isUndefined(props2.offsetBottom) && wrapToTop >= calcBottom) {
fixedTop = calcBottom;
} else {
fixedTop = false;
}
if (affixRef.value) {
var affixed = fixedTop !== false;
var placeholderStatus = affixWrapRef.value.contains(placeholderEL.value);
if (affixed) {
affixRef.value.className = COMPONENT_NAME.value;
affixStyle.value = {
top: "".concat(fixedTop, "px"),
width: "".concat(wrapWidth, "px"),
height: "".concat(wrapHeight, "px"),
zIndex: props2.zIndex
};
if (!placeholderStatus) {
placeholderEL.value.style.width = "".concat(wrapWidth, "px");
placeholderEL.value.style.height = "".concat(wrapHeight, "px");
affixWrapRef.value.appendChild(placeholderEL.value);
}
} else {
affixRef.value.removeAttribute("class");
affixStyle.value = void 0;
placeholderStatus && placeholderEL.value.remove();
}
context.emit("fixedChange", affixed, {
top: Number(fixedTop)
});
if (isFunction.isFunction(props2.onFixedChange)) props2.onFixedChange(affixed, {
top: Number(fixedTop)
});
}
ticking.value = false;
});
ticking.value = true;
}
};
var bindScroll = /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee() {
return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return Vue.nextTick();
case 2:
if (!isBind.value) {
_context.next = 4;
break;
}
return _context.abrupt("return");
case 4:
scrollContainer.value = utils_dom.getScrollContainer(props2.container);
utils_dom.on(scrollContainer.value, "scroll", handleScroll);
utils_dom.on(window, "resize", handleScroll);
isBind.value = true;
case 8:
case "end":
return _context.stop();
}
}, _callee);
}));
return function bindScroll() {
return _ref2.apply(this, arguments);
};
}();
var unbindScroll = function unbindScroll() {
if (!scrollContainer.value || !isBind.value) return;
utils_dom.off(scrollContainer.value, "scroll", handleScroll);
utils_dom.off(window, "resize", handleScroll);
if (rAFId) {
window.cancelAnimationFrame(rAFId);
}
isBind.value = false;
};
Vue.watch(function () {
return props2.offsetTop;
}, function () {
handleScroll();
});
Vue.watch(function () {
return props2.offsetBottom;
}, function () {
handleScroll();
});
Vue.watch(function () {
return props2.zIndex;
}, function () {
handleScroll();
});
Vue.onMounted(bindScroll);
Vue.onActivated(bindScroll);
Vue.onDeactivated(unbindScroll);
Vue.onBeforeUnmount(unbindScroll);
context.expose({
scrollContainer: scrollContainer,
affixWrapRef: affixWrapRef,
handleScroll: handleScroll
});
return function () {
return Vue.createVNode("div", {
"ref": affixWrapRef
}, [Vue.createVNode("div", {
"ref": affixRef,
"style": affixStyle.value
}, [renderTNodeJSX("default")])]);
};
}
});
exports["default"] = _Affix;
//# sourceMappingURL=affix.js.map