You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.8 KiB
57 lines
1.8 KiB
<template> |
|
<div class="el-tabs__active-bar" :class="`is-${ rootTabs.tabPosition }`" :style="barStyle"></div> |
|
</template> |
|
<script> |
|
import { arrayFind } from 'element-ui/src/utils/util'; |
|
export default { |
|
name: 'TabBar', |
|
|
|
props: { |
|
tabs: Array |
|
}, |
|
|
|
inject: ['rootTabs'], |
|
|
|
computed: { |
|
barStyle: { |
|
get() { |
|
let style = {}; |
|
let offset = 0; |
|
let tabSize = 0; |
|
const sizeName = ['top', 'bottom'].indexOf(this.rootTabs.tabPosition) !== -1 ? 'width' : 'height'; |
|
const sizeDir = sizeName === 'width' ? 'x' : 'y'; |
|
const firstUpperCase = str => { |
|
return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase()); |
|
}; |
|
this.tabs.every((tab, index) => { |
|
let $el = arrayFind(this.$parent.$refs.tabs || [], t => t.id.replace('tab-', '') === tab.paneName); |
|
if (!$el) { return false; } |
|
|
|
if (!tab.active) { |
|
offset += $el[`client${firstUpperCase(sizeName)}`]; |
|
return true; |
|
} else { |
|
tabSize = $el[`client${firstUpperCase(sizeName)}`]; |
|
const tabStyles = window.getComputedStyle($el); |
|
if (sizeName === 'width' && this.tabs.length > 1) { |
|
tabSize -= parseFloat(tabStyles.paddingLeft) + parseFloat(tabStyles.paddingRight); |
|
} |
|
if (sizeName === 'width') { |
|
offset += parseFloat(tabStyles.paddingLeft); |
|
} |
|
return false; |
|
} |
|
}); |
|
|
|
const transform = `translate${firstUpperCase(sizeDir)}(${offset}px)`; |
|
style[sizeName] = tabSize + 'px'; |
|
style.transform = transform; |
|
style.msTransform = transform; |
|
style.webkitTransform = transform; |
|
|
|
return style; |
|
} |
|
} |
|
} |
|
}; |
|
</script>
|
|
|