UNPKG

yqcloud-ui

Version:

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

170 lines (151 loc) 5.39 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.getScroll = getScroll; var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _utils = require('./utils'); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _classnames2 = require('classnames'); var _classnames3 = _interopRequireDefault(_classnames2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var isDev = process.env.NODE_ENV !== 'production'; 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 box = void 0; var x = void 0; var y = void 0; var doc = elem.ownerDocument; var body = doc.body; var docElem = doc && doc.documentElement; 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 styles = component.props.styles; var rootNode = component.root; var wrapNode = component.nav || rootNode; var containerOffset = offset(wrapNode); var inkBarNode = component.inkBar; var activeTab = component.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'] = { getDefaultProps: function getDefaultProps() { return { inkBarAnimated: true }; }, componentDidUpdate: function componentDidUpdate() { _componentDidUpdate(this); }, componentDidMount: function componentDidMount() { var _this = this; if (isDev) { // https://github.com/ant-design/ant-design/issues/8678 this.timeout = setTimeout(function () { _componentDidUpdate(_this, true); }, 0); } else { _componentDidUpdate(this, true); } }, componentWillUnmount: function componentWillUnmount() { clearTimeout(this.timeout); }, getInkBarNode: function getInkBarNode() { var _classnames; var _props = this.props, prefixCls = _props.prefixCls, styles = _props.styles, inkBarAnimated = _props.inkBarAnimated; var className = prefixCls + '-ink-bar'; var classes = (0, _classnames3['default'])((_classnames = {}, (0, _defineProperty3['default'])(_classnames, className, true), (0, _defineProperty3['default'])(_classnames, inkBarAnimated ? className + '-animated' : className + '-no-animated', true), _classnames)); return _react2['default'].createElement('div', { style: styles.inkBar, className: classes, key: 'inkBar', ref: this.saveRef('inkBar') }); } };