Vue组件设计-Sticky布局效果示例

 更新时间:2023年05月05日 11:28:06   作者:aiguangyuan  
这篇文章主要介绍了Vue组件设计-Sticky布局,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Vue组件设计-Sticky布局

Sticky布局即为粘性定位,常见于一些重要的页面区域在向上滚动时不会被卷起来,在CSS中可以通过设置position:sticky来实现这一功能,但是如果出于兼容性考虑或是一些复杂的场景,就需要我们用传统的方法来实现,以下基于Vue封装一个组件给大家参考。

1. 效果示例

 2. 组件封装

<template>
    <div :style="{height:height + 'px', zIndex: zIndex }">
        <div
            :class="className"
            :style="{
                width: width,
                zIndex: zIndex,
                position: position,
                height: height + 'px',
                top: isSticky ? stickyTop + 'px' : '',
            }">
            <slot>
            </slot>
        </div>
    </div>
</template>
<script>
export default {
    name: "Sticky",
    props: {
        stickyTop: {
            type: Number,
            default: 0,
        },
        zIndex: {
            type: Number,
            default: 1,
        },
        className: {
            type: String,
            default: "",
        },
    },
    data() {
        return {
            position: "",
            active: false,
            isSticky: false,
            width: undefined,
            height: undefined,
        };
    },
    mounted() {
        this.height = this.$el.getBoundingClientRect().height;
        window.addEventListener("scroll", this.handleScroll);
        window.addEventListener("resize", this.handleResize);
    },
    // 组件激活时调用
    activated() {
        this.handleScroll();
    },
    destroyed() {
        window.removeEventListener("scroll", this.handleScroll);
        window.removeEventListener("resize", this.handleResize);
    },
    methods: {
        sticky() {
            if (this.active) {
                return;
            }
            this.active = true;
            this.isSticky = true;
            this.position = "fixed";
            this.width = this.width + "px";
        },
        handleReset() {
            if (!this.active) {
                return;
            }
            this.reset();
        },
        reset() {
            this.position = "";
            this.width = "auto";
            this.active = false;
            this.isSticky = false;
        },
        handleScroll() {
            // 粘性定位区域的宽度
            const width = this.$el.getBoundingClientRect().width;
            this.width = width || "auto";
            // 粘性定位距屏幕顶部的高度
            const offsetTop = this.$el.getBoundingClientRect().top;
            // 如果滚动高度小于设定的定位高度
            if (offsetTop < this.stickyTop) {
                this.sticky();
                return;
            };
            this.handleReset();
        },
        handleResize() {
            if (this.isSticky) {
                this.width = this.$el.getBoundingClientRect().width + "px";
            }
        },
    },
};
</script>

3. 组件使用

<template>
    <div style="height:2000px;">
        <div style="height:200px;background-color:green"></div>
        <Sticky>
            <div style="height:300px;background-color:red;line-height:300px;text-align:center;font-size:30px;">
                这是定位区域
            </div>
        </Sticky>
    </div>
</template>
<script>
import Sticky from "@/components/Sticky";
export default {
    components:{
        Sticky:Sticky
    }
};
</script>

到此这篇关于Vue组件设计-Sticky布局的文章就介绍到这了,更多相关Vue Sticky布局内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VueCli生产环境打包部署跨域失败的解决

    VueCli生产环境打包部署跨域失败的解决

    这篇文章主要介绍了VueCli生产环境打包部署跨域失败的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • vue3项目如何使用样式穿透修改elementUI默认样式

    vue3项目如何使用样式穿透修改elementUI默认样式

    这篇文章主要介绍了vue3项目使用样式穿透修改elementUI默认样式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Vue滚动到指定位置的多种方式示例详解

    Vue滚动到指定位置的多种方式示例详解

    当容器有滚动条时,有时需要将指定的内容自动滚动到可视区域,怎么实现呢,下面小编给大家带来了多种方法实现Vue滚动到指定位置,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • vue3+vite项目中显示SVG图片的实现

    vue3+vite项目中显示SVG图片的实现

    vite-plugin-svg-icons是一个Vite插件,其作用是将SVG图标文件转换为Vue组件,本文主要介绍了vue3+vite项目中显示SVG图片的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • vue实现商城购物车功能

    vue实现商城购物车功能

    这篇文章主要为大家详细介绍了vue实现商城购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 解决vue项目中type=”file“ change事件只执行一次的问题

    解决vue项目中type=”file“ change事件只执行一次的问题

    这篇文章主要介绍了vue项目中解决type=”file“ change事件只执行一次的问题,本文给大家介绍的非常详细,需要的朋友可以参考下
    2018-05-05
  • VUE项目中引入vue-router的详细过程

    VUE项目中引入vue-router的详细过程

    vue-router 也叫 vue 路由,根据不同的路径,来执行不同的组件,这篇文章主要介绍了VUE项目中引入vue-router,需要的朋友可以参考下
    2023-05-05
  • vue实现大文件切片上传的示例详解

    vue实现大文件切片上传的示例详解

    前端上传文件很大时,会出现各种问题,比如连接超时了,网断了,都会导致上传失败,这个时候就需要将文件切片上传,下面我们就来学习一下如何使用vue实现大文件切片上传吧
    2023-11-11
  • vue实现简单瀑布流布局

    vue实现简单瀑布流布局

    这篇文章主要为大家详细介绍了vue实现简单瀑布流布局,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • vue3+ts+Vuex中使用websocket协议方式

    vue3+ts+Vuex中使用websocket协议方式

    这篇文章主要介绍了vue3+ts+Vuex中使用websocket协议方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10

最新评论