美文网首页
css 实现不定数量的tab切换和页面切换

css 实现不定数量的tab切换和页面切换

作者: 牛奶大泡芙 | 来源:发表于2020-12-16 12:44 被阅读0次

    遇到了一个Vue框架的开发场景,切换tab并且下面的页面内容跟随联动,tab的数量不定,需要跟随页面伸缩。实际上是一个简单的导航,但是想用原生实现并且考虑到兼容性的话开始考虑了一会儿,最后用table布局和v-指令来解决吧,实现效果和代码如下:
    点击第一个tab:


    image.png

    点击第二个tab:


    image.png

    代码实现:

    <template>
        <div class='warp'>
            <div class='table'>
                <label class='ceil' v-for="item in tabMsg" :key="item.keyName">
                    <span class="ceil-tab" :class="{'ceil-active':item.keyName===high}">
                    <input v-if="item.keyName===high" class="ceil-radio" :value="item.keyName" type="radio" name="tab" v-model="high" checked>
                    <input v-else class="ceil-radio" :value="item.keyName" type="radio" name="tab" v-model="high">
                    <div v-if="item.keyName===high" class='ceil-page'>{{item.pageContent}}</div>
                </label>
            </div>
        </div>
    </template>
    <script>
    let vmTest = {
        data(){
            return {
                tabMsg:[
                    {
                        keyName:'test',
                        tabName:'测试test接口',
                        pageContent:'测试test接口-页面'
                    },
                    {
                        keyName:'image',
                        tabName:'测试image接口',
                        pageContent:'测试image接口-页面'
                    },
                    {
                        keyName:'video',
                        tabName:'测试video接口',
                        pageContent:'测试video接口-页面'
                    },
                    {
                        keyName:'form',
                        tabName:'测试form接口',
                        pageContent:'测试form接口-页面'
                    }
                ],
                high:'test'
            }
        },
        watch:{
            high:[
                function(newVal, oldVal){
                    console.log('high', newVal)
                }
            ]
        }
    }
    export default vmTest
    </script>
    <style scoped>
    .warp{
        display:block;
        width:100%;
        min-height:100vh;
        position:relative;
    }
    .table{
        display:table;
        width:100%;
        height:15vh;
        border: 1px solid brown;
    }
    .ceil{
        display:table-cell;
        height:100%;
        text-align: center;
        border:1px solid green;
        padding:5px;
        box-sizing:border-box;
    }
    .ceil input {
        width:0;
    }
    .ceil-tab{
        display:block;
        width:100%;
        height:100%;
        background-color:blue;
        color:white;
    }
    .ceil-active {
        background-color:pink;
    }
    .ceil-page {
        display:block;
        width:100%;
        min-height:85vh;
        position:absolute;
        top:15vh;
        left:0;
    }
    </style>
    

    如果想实现多行的元素弹性布局,使用网格布局也是可以的,效果如下:


    image.png

    更改的代码如下:

    <template>
        <div class='warp'>
            <div class='table'>
                <div class='row'>
                    <label class='ceil' v-for="(item,key,index) in tabMsg_1" :key="item.keyName">
                        <span class="ceil-tab" :class="{'ceil-active':item.keyName===high}">{{item.tabName}}</span>
                        <input v-if="item.keyName===high" class="ceil-radio" :value="item.keyName" type="radio" name="tab" v-model="high" checked>
                        <input v-else class="ceil-radio" :value="item.keyName" type="radio" name="tab" v-model="high">
                        <div v-if="item.keyName===high" class='ceil-page'>
                            <h1>{{item.pageContent}}</h1>
                            <span>{{item.pageResponse}}</span>
                        </div>
                    </label>
                </div>
                <div class='row'>
                    <label class='ceil' v-for="(item,key,index) in tabMsg_2" :key="item.keyName">
                        <span class="ceil-tab" :class="{'ceil-active':item.keyName===high}">{{item.tabName}}</span>
                        <input v-if="item.keyName===high" class="ceil-radio" :value="item.keyName" type="radio" name="tab" v-model="high" checked>
                        <input v-else class="ceil-radio" :value="item.keyName" type="radio" name="tab" v-model="high">
                        <div v-if="item.keyName===high" class='ceil-page'>
                            <h1>{{item.pageContent}}</h1>
                            <span>{{item.pageResponse}}</span>
                        </div>
                    </label>
                </div>
            </div>
        </div>
    </template>
    <script>
       .row{
            display:flex;
            height:50%;
        }
        .ceil{
            flex:1;
            height:100%;
            text-align: center;
            border:1px solid green;
            padding:5px;
            box-sizing:border-box;
        }
    

    相关文章

      网友评论

          本文标题:css 实现不定数量的tab切换和页面切换

          本文链接:https://www.haomeiwen.com/subject/cxmngktx.html