首页 > 其他分享 >页面侧边栏顶部固定和底部固定方法

页面侧边栏顶部固定和底部固定方法

时间:2024-03-15 19:31:50浏览次数:22  
标签:style 高度 1200 侧边 width window 固定 sidebar 页面

顶部固定用于侧边栏低于屏幕高度----左侧边栏

底部固定用于侧边栏高于屏幕高度----右侧边栏

vue页面方法 

页面布局

页面样式,因为内容比较多, 只展示主要代码

* {
    margin: 0;
    padding: 0;
    text-align: center;
}
.head {
    width: 100%;
    height: 88px;
    background-color: pink
    position: sticky;
    top: 0;
    left: 0;
    z-index: 999;
}
.body {
    display: flex;
    width: 1200px;
    margin: 0 auto;
}
.sidebar_l {
    width: 200px;
    height: 100%;
    background-color: blue
    margin-top: 50px;
    position: sticky;
    /* 定位到导航栏下面 */
    top: 88px;
    left: 0;
}
.content {
    width: 600px;
    margin: 50px;
    background-color: #ccc
}
.sidebar_r {
    width: 300px;
    margin-top: 50px;
}

js

注意生命周期

onMounted(() => {
  // 获取元素
  let sidebar_r: any = document.querySelector('.sidebar_r');
  // 获取元素高度
  let r_h = sidebar_r.offsetHeight;
  // 获取屏幕宽度
  var window_w = window.innerWidth;
  // 获取屏幕高度
  var window_h = window.innerHeight;
  // 宽度至少1200
  window_w < 1200 ? window_w = 1200 : window_w;
  // 获取的屏幕宽度加了滚动条的宽度9px,中间内容的左边加中间是910 - 9,所以加901
  sidebar_r.style.left = ((window_w - 1200) / 2) + 901 + "px";
  // 监听页面滚动
  window.addEventListener("scroll", () => {
    // 获取滚动高度
    let scrollTop = window.pageYOffset || document.documentElement.scrollTop;
    // 判断高度是否超过屏幕高度 超过就底部固定没有就顶部固定
    if (window_h < r_h) {
      // 判断滚动高度是否超过侧边栏高度(判断侧边栏是否滚动到了底部 侧边栏高度-屏幕高度+头部高度88+上下边距50+20)
      if (scrollTop >= r_h - window_h + 88 + 50 + 20) {
        sidebar_r.style.position = "fixed";
        sidebar_r.style.bottom = "20px";
        sidebar_r.style.top = "auto";
        sidebar_r.style.height = "auto";
      } else {
        sidebar_r.style.position = "static";
      }
    } else {
      sidebar_r.style.position = "sticky";
      sidebar_r.style.top = "88px";
      sidebar_r.style.height = "100%";
      sidebar_r.style.bottom = "auto";
    }
  })
  // 监听页面大小变化
  window.addEventListener("resize", () => {
    // 获取屏幕高度宽度
    window_w = window.innerWidth;
    window_h = window.innerHeight;
    window_w < 1200 ? window_w = 1200 : window_w;
    sidebar_r.style.left = ((window_w - 1200) / 2) + 901 + "px";
  });
})

html原生方法

需要手动计算右边侧边栏高度,可以直接复制运行看效果

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            text-align: center;
        }

        .head {
            width: 100%;
            height: 88px;
            background-color: pink;
            position: sticky;
            top: 0;
            left: 0;
            z-index: 999;
        }

        .body {
            display: flex;
            width: 1200px;
            margin: 0 auto;
        }

        .sidebar_l {
            width: 150px;
            height: 100%;
            background-color: blue;
            margin-top: 50px;
            position: sticky;
            /* 定位到导航栏下面 */
            top: 88px;
            left: 0;
        }

        .content {
            width: 660px;
            margin: 50px;
            background-color: #ccc;
        }

        .sidebar_r {
            width: 290px;
            margin-top: 50px;
        }

        .box1 {
            width: 100%;
            height: 600px;
            background-color: #0bf349;
        }

        .box2 {
            width: 100%;
            height: 6000px;
            background-color: #27d8f0;
        }

        .box3 {
            width: 100%;
            height: 2000px;
            background-color: #ed9a15;
            position: relative;
        }

        .bottom {
            position: absolute;
            bottom: 0;
        }
    </style>
</head>

<body>
    <!-- 导航栏 -->
    <div class="head">头部</div>
    <!-- 内容区域 -->
    <div class="body">
        <div class="sidebar_l">
            <div class="box1">左边侧边栏</div>
        </div>
        <div class="content">
            <!-- 内容 -->
            <div class="box2">中间内容</div>
        </div>
        <div class="sidebar_r">
            <!-- 内容 -->
            <div class="box3">
                <p>右边侧边栏</p>
                <p class="bottom">右边侧边栏底部</p>
            </div>
        </div>
    </div>
</body>
<script>
    // 获取元素
    let sidebar_r = document.querySelector('.sidebar_r');
    // 获取元素高度 html元素因为父元素使用了flex让子元素的高度都变成了一样高,所以获取不到真实的高度,需要手动计算赋值盒子高度,vue可以通过生命周期获取真实的元素高度
    // let r_h = sidebar_r.offsetHeight;
    let r_h = 2000;
    console.log("右边侧边栏高度:", r_h);
    // 获取屏幕宽度
    var window_w = window.innerWidth;
    // 获取屏幕高度
    var window_h = window.innerHeight;
    // 宽度至少1200
    window_w < 1200 ? window_w = 1200 : window_w;
    // 获取的屏幕宽度加了滚动条的宽度9px,中间内容的左边加中间是910 - 9,所以加901
    sidebar_r.style.left = ((window_w - 1200) / 2) + 901 + "px";
    // 监听页面滚动
    window.addEventListener("scroll", () => {
        // 获取滚动高度
        let scrollTop = window.pageYOffset || document.documentElement.scrollTop;
        // 判断高度是否超过屏幕高度 超过就底部固定没有就顶部固定
        if (window_h < r_h) {
            // 判断滚动高度是否超过侧边栏高度(判断侧边栏是否滚动到了底部 侧边栏高度-屏幕高度+头部高度88+上下边距50+20)
            if (scrollTop >= r_h - window_h + 88 + 50 + 20) {
                sidebar_r.style.position = "fixed";
                sidebar_r.style.bottom = "20px";
                sidebar_r.style.top = "auto";
                sidebar_r.style.height = "auto";
            } else {
                sidebar_r.style.position = "static";
            }
        } else {
            sidebar_r.style.position = "sticky";
            sidebar_r.style.top = "88px";
            sidebar_r.style.height = "100%";
            sidebar_r.style.bottom = "auto";
        }
    })
    // 监听页面大小变化
    window.addEventListener("resize", () => {
        // 获取屏幕高度宽度
        window_w = window.innerWidth;
        window_h = window.innerHeight;
        window_w < 1200 ? window_w = 1200 : window_w;
        sidebar_r.style.left = ((window_w - 1200) / 2) + 901 + "px";
    });
</script>

</html>

计算思路:

高度判断:屏幕高度 - 元素高度 + 顶部离边框的距离

左边定位:屏幕宽度 - 左边元素宽度和间距 + 滚动条宽度

标签:style,高度,1200,侧边,width,window,固定,sidebar,页面
From: https://blog.csdn.net/weixin_70563937/article/details/136684515

相关文章

  • 微信小程序(页面导航)
      如果跳转到非tabBar页面,可以省略open-type          在onload获取到参数后,可以保存到data中供其他方法使用,常见的是使用query:{}接收 ......
  • el-table 根据窗框大小 高度变化 固定表头
     <el-table:data="tableData"style="width:100%":height="tableHeight"><el-table-columnprop="date"label="日期"width="180"></el-table-column></el-table>......
  • 【若依前后端分离+app】app页面首页添加动态轮播图
    首页文件路径:pages/work/index.vue1. Vue组件的模板部分包括创建模板、视图容器、视图、轮播图组件以及相关的属性和事件监听器。以下部分为轮播图代码:<template><viewclass="work-container"><view><!--轮播图--><uni-swiper-dotclass="uni-s......
  • 实现不同页面不同页眉
    1.第一页的页眉2.点击分隔符-下一页分节符,一定要选这个3.关闭同前节4.编辑第二页的页眉 5.成功,这样就实现啦 ......
  • 6.闲置、求购页面
    闲置页面搜索框与首页搜索框一致uview官网https://vkuviewdoc.fsq.pub/components/search.html搜索框<u-search:show-action="true"action-text="搜索":animation="true"></u-search>增加外边距margin="20rpx0rpx"tabs标签uview官网https:......
  • vue中router页面之间参数传递,params失效,建议使用query
    vue中router页面之间参数传递,params失效,建议使用query简介:本文讲解vue中router页面之间参数传递,params失效,建议使用query。在vue中有一个router功能,他可以用来页面之间的参数传递,他有两种方式一种是params方式,一种是query方式,但是params方式特别容易导致参数的丢失问......
  • Java登陆第三十五天——VUE初始页面解析
    Vite创建的默认Vue3项目中package.json文件信息如下:{"name":"vmoudle1","private":true,"version":"0.0.0","type":"module","scripts":{"dev":"vite",......
  • Web 页面制作基础——HTML基础
    HTML......
  • Vue中怎么使用router进行页面传参
    在响应式编程中,使用VueRouter传递参数通常涉及到以下几个方面:1.动态路由匹配动态路由匹配允许你根据URL中的参数来渲染不同的组件。这在显示用户信息、博客文章等需要根据ID或其他标识符来区分内容的情况下非常有用。例如,如果你想根据用户ID显示不同的用户信息......
  • 第三章 页面布局 总结
    1、盒子模型    微信小程序的视图层由WXML和WXSS组成。其中,WXSS(WeiXinStyleSheets)是基于CSS拓展的样式语言,用于描述WXMI的组成样式,决定WXMI的组件如何显示。WXSS具有CSS的大部分特性。    在页面设计中,只有掌握了盒子模型以及盒子模型的各个属性和应......