Vue - 让水平滚动条(scroll bar)固定在浏览器的底部

效果

1310818-20190312020307854-24091537.gif

踩坑经历

TLDR;
在几个小时的google和stack overflow的苦苦搜索后,无果。
经过自我思考,想到了一种实现方法:
整个页面是一个盒子,要出现滚动条,必然里面的元素要溢出。也即是,元素水平overflow,那么就出现水平滚动条。元素垂直overflow,那么会出现垂直滚动条。
我原先是将眼光放在局部的小盒子(如下图),无论我怎么调整display或者overflow,当这个局部的元素溢出的时候,滚动条是根据这个局部生成的。
1310818-20190312022902913-1069451994.png
那么我如果要把水平滚动条出现的时候固定在底部,我就要把眼光放在整个大盒子(全局)。
当大盒子里面的小盒子的元素溢出时,必然出现滚动条。

原理: flex布局在设置高度下,如果flex里面的内容大于这个高度或者宽度时,那么会溢出然后产生滚动条(垂直或者水平)。那么我就在Vue加载时,整个大盒子(这是class="main-container", 也可以认为是网页的body)的高度设置为viewport的高度。
为什么设置为viewport的高度?一是上述原因。再啰嗦一下,也即是我把整个flex布局的大盒子的面积设置为viewport的面积。如果不够面积去承载元素(发生溢出),那么滚动条必然出现。而且有个前提是滚动条是贴着盒子的右下的边。二是可以适应不同的设备。

具体实现: 在整个Vue初始加载的时候设置这个class="main-container"(flex布局的大盒子)的高度就好了。

代码

    .main-container {
        display: flex;
    }    

    .body-container {
        display: flex;
    }
    export default {
        name: 'DefaultLayout',
        components: {
            MyHeader,
        },
        mounted: function () {
            this.$nextTick(function () {
                var div = document.querySelector('.main-container');
                div.style.height = window.innerHeight + 'px';
                console.log('mounted: ', div);
                console.log('mounted: ', window.innerHeight);
            })
        },
    };

解决浏览器缩放的时候,重新设置滚动条的位置

在mounted的时候监听resize

        methods: {
            setScrollBar() {
                this.$nextTick(function () {
                    var div = document.querySelector('.main-container');
                    div.style.height = window.innerHeight - 10 + 'px';
                    console.log('mounted: ', div);
                    console.log('mounted: ', window.innerHeight);
                })
            },
        },
        mounted: function () {
            this.setScrollBar();
            // 浏览器缩放,更新ScrollBar位置
            window.addEventListener('resize', this.setScrollBar);
        },

注意

main-container是整个页面
board-container是卡片那块区域

div.style.height = window.innerHeight + 'px'; 这里有坑,要加px,不然无效。

转载于:https://www.cnblogs.com/allen2333/p/10514262.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值