UNPKG

ant-design-vue

Version:

An enterprise-class UI design language and Vue-based implementation

176 lines (156 loc) 5.68 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _babelHelperVueJsxMergeProps = require('babel-helper-vue-jsx-merge-props'); var _babelHelperVueJsxMergeProps2 = _interopRequireDefault(_babelHelperVueJsxMergeProps); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); exports.getScroll = getScroll; var _vueTypes = require('../../_util/vue-types'); var _vueTypes2 = _interopRequireDefault(_vueTypes); var _utils = require('./utils'); var _BaseMixin = require('../../_util/BaseMixin'); var _BaseMixin2 = _interopRequireDefault(_BaseMixin); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function getScroll(w, top) { var ret = w['page' + (top ? 'Y' : 'X') + 'Offset']; var method = 'scroll' + (top ? 'Top' : 'Left'); if (typeof ret !== 'number') { var d = w.document; // ie6,7,8 standard mode ret = d.documentElement[method]; if (typeof ret !== 'number') { // quirks mode ret = d.body[method]; } } return ret; } function offset(elem) { var x = void 0; var y = void 0; var doc = elem.ownerDocument; var body = doc.body; var docElem = doc && doc.documentElement; var box = elem.getBoundingClientRect(); x = box.left; y = box.top; x -= docElem.clientLeft || body.clientLeft || 0; y -= docElem.clientTop || body.clientTop || 0; var w = doc.defaultView || doc.parentWindow; x += getScroll(w); y += getScroll(w, true); return { left: x, top: y }; } function componentDidUpdate(component, init) { var _component$$props$sty = component.$props.styles, styles = _component$$props$sty === undefined ? {} : _component$$props$sty; var rootNode = component.getRef('root'); var wrapNode = component.getRef('nav') || rootNode; var containerOffset = offset(wrapNode); var inkBarNode = component.getRef('inkBar'); var activeTab = component.getRef('activeTab'); var inkBarNodeStyle = inkBarNode.style; var tabBarPosition = component.$props.tabBarPosition; if (init) { // prevent mount animation inkBarNodeStyle.display = 'none'; } if (activeTab) { var tabNode = activeTab; var tabOffset = offset(tabNode); var transformSupported = (0, _utils.isTransformSupported)(inkBarNodeStyle); if (tabBarPosition === 'top' || tabBarPosition === 'bottom') { var left = tabOffset.left - containerOffset.left; var width = tabNode.offsetWidth; // If tabNode'width width equal to wrapNode'width when tabBarPosition is top or bottom // It means no css working, then ink bar should not have width until css is loaded // Fix https://github.com/ant-design/ant-design/issues/7564 if (width === rootNode.offsetWidth) { width = 0; } else if (styles.inkBar && styles.inkBar.width !== undefined) { width = parseFloat(styles.inkBar.width, 10); if (width) { left = left + (tabNode.offsetWidth - width) / 2; } } // use 3d gpu to optimize render if (transformSupported) { (0, _utils.setTransform)(inkBarNodeStyle, 'translate3d(' + left + 'px,0,0)'); inkBarNodeStyle.width = width + 'px'; inkBarNodeStyle.height = ''; } else { inkBarNodeStyle.left = left + 'px'; inkBarNodeStyle.top = ''; inkBarNodeStyle.bottom = ''; inkBarNodeStyle.right = wrapNode.offsetWidth - left - width + 'px'; } } else { var top = tabOffset.top - containerOffset.top; var height = tabNode.offsetHeight; if (styles.inkBar && styles.inkBar.height !== undefined) { height = parseFloat(styles.inkBar.height, 10); if (height) { top = top + (tabNode.offsetHeight - height) / 2; } } if (transformSupported) { (0, _utils.setTransform)(inkBarNodeStyle, 'translate3d(0,' + top + 'px,0)'); inkBarNodeStyle.height = height + 'px'; inkBarNodeStyle.width = ''; } else { inkBarNodeStyle.left = ''; inkBarNodeStyle.right = ''; inkBarNodeStyle.top = top + 'px'; inkBarNodeStyle.bottom = wrapNode.offsetHeight - top - height + 'px'; } } } inkBarNodeStyle.display = activeTab ? 'block' : 'none'; } exports['default'] = { name: 'InkTabBarNode', mixins: [_BaseMixin2['default']], props: { inkBarAnimated: { type: Boolean, 'default': true }, prefixCls: String, styles: Object, tabBarPosition: String, saveRef: _vueTypes2['default'].func.def(function () {}), getRef: _vueTypes2['default'].func.def(function () {}) }, updated: function updated() { this.$nextTick(function () { componentDidUpdate(this); }); }, mounted: function mounted() { this.$nextTick(function () { componentDidUpdate(this, true); }); }, render: function render() { var _classes; var h = arguments[0]; var prefixCls = this.prefixCls, _styles = this.styles, styles = _styles === undefined ? {} : _styles, inkBarAnimated = this.inkBarAnimated; var className = prefixCls + '-ink-bar'; var classes = (_classes = {}, (0, _defineProperty3['default'])(_classes, className, true), (0, _defineProperty3['default'])(_classes, inkBarAnimated ? className + '-animated' : className + '-no-animated', true), _classes); return h('div', (0, _babelHelperVueJsxMergeProps2['default'])([{ style: styles.inkBar, 'class': classes, key: 'inkBar' }, { directives: [{ name: 'ref', value: this.saveRef('inkBar') }] }])); } };