基于FlexBox的无约束自适应
全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/11972664.html,多谢,=。=~
一、背景描述
对于通用型带过滤条件的列表查询项目中,列举下面两种常见功能需求,要满足内容高度、宽度自适应:
1、上中下布局,包括查询条件、卡片数据、分页;
2、上中下布局,包括查询条件、表格数据、分页;
二、现状分析
最常用的经典方法是position定位加上top和bottom属性实现高度自适应,该方式存在的最大问题在于只能实现上中下其中一个模块的高度自适应,剩余模块的高度需要固定,与此同时还需满足查询条件的宽度自适应。
常见的实现方式有以下3种,并分别阐述它们存在的问题。
方式1:固定查询条件的高度和最小宽度,需要让视觉量身定制出一套完美的展现方式,控制每项查询条件的宽度,使得在浏览器宽度变窄时也能完全展示。
存在的问题:查询条件数量较多时通常会被固定成两行或三行展示,导致多余空间占用,如果使用iframe嵌套时最小宽度与容器不统一还会出现内部滚动条。若新需求需要新增查询条件,则需要视觉重新设计,同时前端人员需要修改样式代码。
方式2:采用媒体查询@media,需要让视觉根据常见屏幕宽度做适配,前端再根据不同屏幕宽度撰写相应样式代码。
存在的问题:代码量大、复杂度高,屏幕尺寸覆盖不全,范围边界值不准确会导致显示异常,同样对于有需求新增查询条件的情况,视觉设计及前端代码变动较大。
方式3:查询条件高度自适应,表格高度固定。
存在的问题:页面空间没有充分利用,有大量留白,不利于用户体验。
三、解决方案
针对上面的问题,我们可以采用flexbox布局解决,同时实现查询条件、卡片/列表数据两个模块高度自适应和全局宽度自适应。
1、基本概念
(1)容器(container):一个设有display:flex;的元素;
(2)项目(item):容器的直接子元素;
2、属性及参数
FlexBox布局属性分为容器属性和项目属性,具体属性、参数值及其含义可以参见我之前写的:https://www.cnblogs.com/dreamsqin/p/10883286.html
3、关键代码
在撰写页面样式前,首先我们需要设置一个全局的100%高度。对于vue项目,需要设置入口组件App.vue的高度样式:
#app{
height: 100%;
}
对于html静态页面,需要设置html及body的高度样式:
html,body{
height: 100%
}
接下来就可以愉快的编写页面代码了,demo的视图组件用Element-ui实现,页面结构关键代码如下:
<div class="search-page">
<div class="top">
<div class="top-main">
<!--这里通常是el-form的查询条件表单-->
<div class="form-button">
<el-button
class="conditionButton"
type="primary"
@click="handleSearch">
查询
</el-button>
<el-button
class="conditionButton"
@click="onReset">
重置
</el-button>
</div>
</div>
</div>
<div class="bottom">
<div class="bottom-main-export">
<!--这里一般放数据导出的按钮或者下拉菜单-->
</div>
<div class="bottom-main-data">
<!--这里一般放el-table表格数据或者el-scrollbar可以滚动的卡片数据-->
</div>
<div class="bottom-main-paging">
<div class="block">
<!--这里一般放el-pagination分页组件,我们的分页表格采用了表格和分页组件分开的方式,在HUI2.X中也去除了分页表格组件,所以该布局完全适用于HUI2.X-->
</div>
</div>
</div>
</div>
下面是对应页面的less样式关键代码:
.search-page{
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.top{
width: 100%;
padding-top: 16px;
.top-main{
display: flex;
.form-button{
min-width: 202px;
display: flex;
align-items: flex-end;
.el-button{
width: 96px;
margin-bottom: 16px;
}
}
}
}
.bottom{
width: 100%;
border: 8px solid #f6f6f6;
flex: 1;
display: flex;
flex-direction: column;
.bottom-main-export{
width: 100%;
height: 48px;
padding: 8px;
display: flex;
justify-content: flex-end;
}
.bottom-main-data{
width: 100%;
flex: 1;
display: flex;
}
.bottom-main-paging{
width: 100%;
height: 49px;
}
}
}
4、可实现效果
(1)查询条件高度自适应,对于没有表格数据的情况也能撑开整个页面
(2)查询条件随页面宽度自动换行,同时不影响表格数据高度的自适应
(3)对于大量查询条件同样适用
基于FlexBox的无约束自适应的更多相关文章
- 基于粒子群优化的无约束50维Rosenbrock函数求解
基于粒子群优化的无约束50维Rosenbrock函数求解 一.问题重述 无约束50维的Rosenbrock函数可以描述如下: 其中, 0 要求按PSO算法思想设计一个该问题的求解算法. Rosenbr ...
- Kerberos无约束委派的攻击和防御
0x00 前言简介 当Active Directory首次与Windows 2000 Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身 ...
- 基于jQuery编写的横向自适应幻灯片切换特效
基于jQuery编写的横向自适应幻灯片切换特效 全屏自适应jquery焦点图切换特效,在IE6这个蛋疼的浏览器兼容性问题上得到了和谐,兼容IE6. 适用浏览器:IE6.IE7.IE8.360.Fire ...
- Bulma - 基于 Flexbox 的现代化的 CSS 框架
Bulma 是一个基于 Flexbox 的现代化的 CSS 框架,设计的初衷就是移动优先(Mobile First),模块化设计,可以轻松用来实现各种简单或者复制的内容布局,浏览器支持:浏览器支持:C ...
- 基于统计的无词典的高频词抽取(二)——根据LCP数组计算词频
接着上文[基于统计的无词典的高频词抽取(一)——后缀数组字典序排序],本文主要讲解高频子串抽取部分. 如果看过上一篇文章的朋友都知道,我们通过 快排 或 基数排序算出了存储后缀数组字典序的PAT数组, ...
- 02(e)多元无约束优化问题- 梯度的两种求解方法以及有约束转化为无约束问题
2.1 求解梯度的两种方法 以$f(x,y)={{x}^{2}}+{{y}^{3}}$为例,很容易得到: $\nabla f=\left[ \begin{aligned}& \frac{\pa ...
- elf,基于flexbox的响应式CSS框架
官网地址:http://jrainlau.github.io/elf/项目地址:https://github.com/jrainlau/elf 介绍 取名为"精灵"的elf,是一个 ...
- 聊聊高并发(三十二)实现一个基于链表的无锁Set集合
Set表示一种没有反复元素的集合类,在JDK里面有HashSet的实现,底层是基于HashMap来实现的.这里实现一个简化版本号的Set,有下面约束: 1. 基于链表实现.链表节点依照对象的hashC ...
- 基于Office 365 无代码工作流分析-需求基本分析!
客户需求分析: 嘉昊信息是一家IT创业型公司,因为公司初创,有较多的招聘员工的需求,公司近期购买了Office 365,因为招聘工作繁琐,HR人员须要做非常多反复繁琐工作,HR主管提议开发一个招 ...
随机推荐
- ios开发的技巧
http://www.cocoachina.com/ios/20141231/10783.html
- vue学习指南:第六篇(详细) - Vue的组件 component
1. 什么是组件?有两种解释 1. 第一种解释: 什么是组件? 1. 组件是 vue 中的一个可复用的实例,所以new Vue() 是vue中最大的那个组件(根组件),有名字,使用的时候以单标签或双标 ...
- JS 判断设备来源
1.js代码判断当前设备: function deviceType(){ var ua = navigator.userAgent; var agent = ["Android", ...
- SqlServer数据库优化之添加主键和自增长
今天需要给有500万条数据的表添加主键和自增长列,其中最大的难度在于如何UPDATE这500万多条数据,开始吧! 1.先给表添加一个字段叫ID,并允许空 2.查询表,我想到了使用其中的时间列排序来创建 ...
- [TCP/IP] TCP报文长度是由什么确定的
MTU:最大传输单元,以太网的MTU为1500Bytes MSS:最大分解大小,为每次TCP数据包每次传输的最大数据的分段大小,由发送端通知接收端,发送大于MTU就会被分片 TCP最小数据长度为146 ...
- 其他综合-搭建本地yum仓库及自制rpm包
搭建本地yum仓库及自制rpm包 实验目的 为方便本地 yum 的管理,建本地 yum 仓库,实现局域网内部快速安装常用软件 实验环境 VMware:12版本 系统版本:CentOS Linux re ...
- SQLServer常用快捷键汇总
菜单激活键盘快捷键 操作 SQL Server 2017 SQL Server 2008 R2 移到 SQL Server Management Studio 菜单栏 Alt Alt 激活工具组件的菜 ...
- 不知道多大的文件不要用cat查看!
今天长清女子学校的主任给我微信上发了一图片,说登录服务器的时候就查看了一个文件,结果服务器的风扇忽然变的特别响,系统慢了好多,让我看看是什么回事!我当时心里想,无缘无故怎么会这样,难不成是进病毒了?查 ...
- mysql性能优化随笔
mysql性能优化是一个很大的命题,这里只记录一下近期的一些小经验. 曾经以为看了点create table时加index的语法就觉得自己知道怎么做mysql优化了,后来又看了点介绍mysql索引底层 ...
- MySQL数据库的下载与安装
1.百度:MySQL,点击MySQL官网 2. 进入官网后,点击DOWNLOADS,然后点击Windows 3.点击MySQL Installer 4.下载第二个MSI文佳,点击downloads 5 ...