vbenjs / vue-vben-admin

A modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. It's fast!
https://www.vben.pro
MIT License
25.27k stars 6.88k forks source link

Bug: 内容区域无法用flex布局来做自适应高度 #4377

Open elkon028 opened 2 months ago

elkon028 commented 2 months ago

Version

Vben Admin V5

Describe the bug?

无法用flex布局来做自适应高度

解决方案:

通常flex:1 1 0%;的元素上,最好是加上min-height:0

实际改这个文件就行了

Reproduction

System Info

System:
    OS: macOS 14.6.1
    CPU: (14) arm64 Apple M3 Max
    Memory: 378.88 MB / 36.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 20.16.0 - /usr/local/bin/node
    npm: 10.8.2 - /usr/local/bin/npm
    pnpm: 9.10.0 - /usr/local/bin/pnpm
    Watchman: 2024.09.02.00 - /opt/homebrew/bin/watchman
  Browsers:
    Chrome: 128.0.6613.137
    Safari: 17.6

Relevant log output

No response

Validations

anncwb commented 2 months ago

这样会导致body滚动不符合预期,不同于v2版本,新版本不会去修改滚动条了,浏览器默认的滚动条已经符合用户使用习惯,且无需去对一些modal、backtop之类的组件做特殊处理,如果改为主体滚动,则还需要去考虑这些。我觉得要做的应该是浏览器默认滚动条带来的一些抖动优化

zhenjiang1986 commented 2 months ago

我的想法是能不能给Page控件一个开关,开关打开后,让page 或者page content的高度以具体px的方式 实现height 100% 这样 会好点.

elkon028 commented 2 months ago

我的想法是能不能给Page控件一个开关,开关打开后,让page 或者page content的高度以具体px的方式 实现height 100% 这样 会好点.

官方的Page组件,用CSS怎么弄也不行做不了自适应,因为父级元素的高是auto,而非100%,除非用JS去控制

elkon028 commented 2 months ago

这样会导致body滚动不符合预期,不同于v2版本,新版本不会去修改滚动条了,浏览器默认的滚动条已经符合用户使用习惯,且无需去对一些modal、backtop之类的组件做特殊处理,如果改为主体滚动,则还需要去考虑这些。我觉得要做的应该是浏览器默认滚动条带来的一些抖动优化

老大,你理解错了 这个问题只是让内容区域的所有父级有高度(100%) 这样的话,用户的内容区域就可以用 flex 布局来做自适应高

例如

另外

我也不同意你说的用户习惯在 Document 上滚动

  1. 从布局逻辑上来讲,aside, header, main 是区域的象征,内容区域的溢出,就应该滚动内容区域
  2. 如果用户习惯在 Document 上滚动,那为什么 vben 又要 固定 asideheader呢,我想,这个固定它们是从逻辑功能上的需要,但这是不是违背了你说的用户习惯呢?

目前我的做法是: 

#app {
  /** fix: vben flex layout css bug **/
  > div:first-child {
    height: 100%;

    > aside + div {
      height: 100%;

      > main {
        min-height: 0;
        overflow-y: auto;
      }
    }
  }
}

这样的话,滚动条是在内容区域,但会丢失vben的backtop 问题不大,可以自己在内容区域自己做个useResizeObserver 至于你说的 model、dialog 之类的,我从来没碰到任何问题,我用的组件库是Element-ui、 Element-plus

vince292007 commented 2 months ago

你可以尝试看看,在不影响其他页面的情况下,有好的方式可以提PR。针对你要的这种场景,项目还有另一种方式,直接拿 var(--vben-content-height) 就可以了

elkon028 commented 2 months ago

你可以尝试看看,在不影响其他页面的情况下,有好的方式可以提PR。针对你要的这种场景,项目还有另一种方式,直接拿 var(--vben-content-height) 就可以了

用 var(--vben-content-height) ,会抖出两个滚动条的现象

zhenjiang1986 commented 1 month ago

我的想法是能不能给Page控件一个开关,开关打开后,让page 或者page content的高度以具体px的方式 实现height 100% 这样 会好点.

官方的Page组件,用CSS怎么弄也不行做不了自适应,因为父级元素的高是auto,而非100%,除非用JS去控制

我意思是自己写个算法 直接给page控件设置具体高度! 以具体px的方式 实现height 100% 这句话可能让你产生误会了

cbombonera commented 1 month ago

想问下,如果main下面 ,就是page 下面 自己做的div 用absolute,合理吗 对css不是很了解,但是我有个需求就是 main下面 就是查询和表格 然后表格自适应高度 滚动条 调了一会css 发现main flex:1 1 0% 会导致 子级的div flex:1什么都失效 实在找不到什么好的方案 也不想用js去计算可视区域高度 最后发现main下面自己建的div 设置absolute 宽度百分百 高度百分百 好像是可以满足这个div铺满 自适应的 但是对css由于不是很了解,也很少看别人这么搞,不知道怎么搞可行否

zhenjiang1986 commented 1 month ago

想问下,如果main下面 ,就是page 下面 自己做的div 用absolute,合理吗 对css不是很了解,但是我有个需求就是 main下面 就是查询和表格 然后表格自适应高度 滚动条 调了一会css 发现main flex:1 1 0% 会导致 子级的div flex:1什么都失效 实在找不到什么好的方案 也不想用js去计算可视区域高度 最后发现main下面自己建的div 设置absolute 宽度百分百 高度百分百 好像是可以满足这个div铺满 自适应的 但是对css由于不是很了解,也很少看别人这么搞,不知道怎么搞可行否

其实你可以考虑下我上面说的实现方式 其实我已经实现了,不过我水平有限也没什么验证,自己写个 page-full.vue 看情况使用 提醒你一下 因为动画的存在,top和left也会变 也要考虑.

cbombonera commented 1 month ago

想问下,如果main下面 ,就是page 下面 自己做的div 用absolute,合理吗 对css不是很了解,但是我有个需求就是 main下面 就是查询和表格 然后表格自适应高度 滚动条 调了一会css 发现main flex:1 1 0% 会导致 子级的div flex:1什么都失效 实在找不到什么好的方案 也不想用js去计算可视区域高度 最后发现main下面自己建的div 设置absolute 宽度百分百 高度百分百 好像是可以满足这个div铺满 自适应的 但是对css由于不是很了解,也很少看别人这么搞,不知道怎么搞可行否

其实你可以考虑下我上面说的实现方式 其实我已经实现了,不过我水平有限也没什么验证,自己写个 page-full.vue 看情况使用 提醒你一下 因为动画的存在,top和left也会变 也要考虑.

之前考虑过使用root 作者给的--vben-content-height 变量 但是这个变量是可视区域高度,这个高度是包含底栏 因为动态偏好,所以不想写死 还有看你的评论,是用js吧,我个人是不想去动底层 就是作者写的包,我只想在app下的ep和ant进行开发,因为我想着除了app,其他会随着作者更新而更新 以前写jquery的时候,我就有点强迫证,铺满这种效果的,我就不是很想用js实现,想用纯用css处理 我不是专业的前端,也没经历去调研太多,脑子里始终是觉得 用传统的window.resize 或者现在的reszie挟持为了做自适应高度,计算出px 没有css性能佳,还有以前搞bootstrap框架做布局,用过js实现效果 ,动画效果感觉不佳,会在伸缩窗口高度的时候,因为动画过渡,会提前看到背景,看过一些作者也出现这种问题,所以传统思维想优先考虑css(并且我开发的场景用到铺满的模块不多,可能只会出现在系统管理系的 用户 左边是列表或者树 右边表格这种场景),当然那都是很多年前的事了,我现在主要做后端 也没关心前端,并且水平不行也是一部分。

cbombonera commented 1 month ago

你可以尝试看看,在不影响其他页面的情况下,有好的方式可以提PR。针对你要的这种场景,项目还有另一种方式,直接拿 var(--vben-content-height) 就可以了

用 var(--vben-content-height) ,会抖出两个滚动条的现象

因为有底栏吧 底栏在可视区域的情况下实际就溢出了

cbombonera commented 1 month ago

想问下,如果main下面 ,就是page 下面 自己做的div 用absolute,合理吗 对css不是很了解,但是我有个需求就是 main下面 就是查询和表格 然后表格自适应高度 滚动条 调了一会css 发现main flex:1 1 0% 会导致 子级的div flex:1什么都失效 实在找不到什么好的方案 也不想用js去计算可视区域高度 最后发现main下面自己建的div 设置absolute 宽度百分百 高度百分百 好像是可以满足这个div铺满 自适应的 但是对css由于不是很了解,也很少看别人这么搞,不知道怎么搞可行否

其实你可以考虑下我上面说的实现方式 其实我已经实现了,不过我水平有限也没什么验证,自己写个 page-full.vue 看情况使用 提醒你一下 因为动画的存在,top和left也会变 也要考虑.

其实我也不是纠结铺满,我更钟爱类似禅道那种 我很不喜欢页面铺满 但是表格的话,有的不铺满,尤其对老年人效果不佳 如果能类似禅道,滚动的时候,表格的列头和底部的分页栏一直具备粘附性,我觉得效果更好 比如表格很高,滚动到下方 列头看不到了,上方 又看不到分页栏,看起来没啥 但是我真的遇到很多客户就是说很麻烦,没办法之举就是铺满,表格内滚动

当然这种纯js打造的表格做这种粘性我觉得不难,只是底部计算稍微比头部计算复杂点 但是我不是很会vue,这就变的非常难了