123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- <template>
- <view class="tui-tabs-view" :class="[isFixed?'tui-tabs-fixed':'tui-tabs-relative',unlined?'tui-unlined':'']" :style="{height:height+'rpx',padding:`0 ${padding}rpx`,background:bgColor,top:isFixed?top+'px':'auto'}">
- <view v-for="(item,index) in tabs" :key="index" class="tui-tabs-item" :style="{width:itemWidth}" @tap.stop="swichTabs(index)">
- <view class="tui-tabs-title" :class="{'tui-tabs-active':currentTab==index,'tui-tabs-disabled':item.disabled}" :style="{color:currentTab==index?selectedColor:color,fontSize:size+'rpx',lineHeight:size+'rpx',fontWeight:bold && currentTab==index?'bold':'normal'}">{{item.name}}</view>
- </view>
- </view>
- </template>
- <script>
- export default {
- name: "tuiTabs",
- props: {
- //标签页
- tabs: {
- type: Array,
- default () {
- return []
- }
- },
- //rpx
- height: {
- type: Number,
- default: 80
- },
- //rpx 只对左右padding起作用,上下为0
- padding: {
- type: Number,
- default: 30
- },
- //背景色
- bgColor: {
- type: String,
- default: "#FFFFFF"
- },
- //是否固定
- isFixed: {
- type: Boolean,
- default: false
- },
- //px
- top: {
- type: Number
- // #ifndef H5
- ,
- default: 0
- // #endif
- // #ifdef H5
- ,
- default: 44
- // #endif
- },
- //是否去掉底部线条
- unlined: {
- type: Boolean,
- default: false
- },
- //当前选项卡
- currentTab: {
- type: Number,
- default: 0
- },
- //滑块宽度
- sliderWidth: {
- type: Number,
- default: 68
- },
- //滑块高度
- sliderHeight: {
- type: Number,
- default: 6
- },
- //滑块背景颜色
- sliderBgColor: {
- type: String,
- default: "#C74547"
- },
- sliderRadius:{
- type: String,
- default: "50rpx"
- },
- //滑块bottom
- bottom: {
- type: String,
- default: "0"
- },
- //标签页宽度
- itemWidth: {
- type: String,
- default: "25%"
- },
- //字体颜色
- color: {
- type: String,
- default: "#666"
- },
- //选中后字体颜色
- selectedColor: {
- type: String,
- default: "#C74547"
- },
- //字体大小
- size: {
- type: Number,
- default: 28
- },
- //选中后 是否加粗 ,未选中则无效
- bold: {
- type: Boolean,
- default: false
- }
- },
- watch: {
- currentTab() {
- this.checkCor();
- }
- },
- created() {
- setTimeout(() => {
- // 高度自适应
- uni.getSystemInfo({
- success: (res) => {
- this.winWidth = res.windowWidth;
- this.checkCor()
- }
- });
- }, 50);
- },
- data() {
- return {
- winWidth: 0,
- scrollLeft: 0
- };
- },
- methods: {
- checkCor: function() {
- let tabsNum = this.tabs.length
- let padding = this.winWidth / 750 * this.padding
- let width = this.winWidth - padding * 2
- let left = (width / tabsNum - (this.winWidth / 750 * this.sliderWidth)) / 2 + padding
- let scrollLeft = left
- if (this.currentTab > 0) {
- scrollLeft = scrollLeft + (width / tabsNum) * this.currentTab
- }
- this.scrollLeft = scrollLeft
- },
- // 点击标题切换当前页时改变样式
- swichTabs: function(index) {
- let item = this.tabs[index]
- if (item && item.disabled) return;
- if (this.currentTab == index) {
- return false;
- } else {
- this.$emit("change", {
- index: Number(index)
- })
- }
- }
- }
- }
- </script>
- <style>
- .tui-tabs-view {
- width: 100%;
- box-sizing: border-box;
- display: flex;
- align-items: center;
- justify-content: space-between;
- z-index: 1;
- }
- .tui-tabs-relative {
- position: relative;
- }
- .tui-tabs-fixed {
- left: 0;
- }
- .tui-tabs-fixed::before,
- .tui-tabs-relative::before {
- content: '';
- position: absolute;
- border-bottom: 1upx solid #eaeef1;
- -webkit-transform: scaleY(0.5);
- transform: scaleY(0.5);
- bottom: 0;
- right: 0;
- left: 0;
- }
- .tui-unlined::before {
- border-bottom: 0 !important
- }
- .tui-tabs-item {
- display: flex;
- align-items: center;
- justify-content: center;
- margin: auto;
- }
- .tui-tabs-disabled {
- opacity: .6;
- }
- .tui-tabs-title {
- display: flex;
- align-items: center;
- justify-content: center;
- position: relative;
- z-index: 2;
- }
- .tui-tabs-active {
- transition: all 0.15s ease-in-out;
- }
- </style>
|