目录:css
前文参照:前端
手把手教你用套路写页面(HTML、CSS初中级前端教学)(第一节):juejin.im/post/5d4a6f…git
咱们先看原型图:github
分析:后端
整体考虑,我认为,这个布局有两种方法。浏览器
第一种(简单版):bash
overflow-y: auto
;第二种(困难版):微信
咱们采用第二种方式进行开发(第一种太简单)。less
第二种状况,纯css一般是没法解决的,所以咱们须要js介入。ide
注:虽然说flex能够,flex在某些老版本浏览器(非IE678)或者手机浏览器,好比IOS10之前,是可能出现bug的。我以前在阿里时,接到过来自客户反馈。所以不采用flex。
下方历史记录的代码思路:
bottom: 0; width: 100%
;h_max = dear的高度 + 单行历史记录的高度 * 最大显示历史记录的个数
;h_count = dear的高度 + 单行历史记录的高度 * 历史数目个数
;h = h_count > h_max ? h_max : h_count
;上方按钮的代码思路:
top: 0
;overflow-y: auto
;这是一个常见场景,一般见于其中一个区域数据来自于后端,另一个区域填充以配合前者。
场景:
解决思路:
方法一(简单,但在极少数状况下会出现兼容性问题):
方法二(复杂,可靠,可配置性强):
参考【套路五、当高度/宽度为动态获取,且相邻联动的两个区域】的方法二的思想。
HTML代码很简单,总体来看是两层DOM结构,代码以下:
<div className="aside">
<div className='aside-nav'
style={navStyle}>
</div>
<div className='aside-my-dear'
style={my-dearStyle}>
</div>
</div>
复制代码
上下两部分的样式也很简单,标准的位置固定但高度不固定(注意,下面代码,我没有写两个子元素的高度)
.aside-nav {
position: absolute;
top: 0;
left: 0;
width: 100%;
// 测试用,查看显示效果是否正常
//background-color: red;
}
.aside-dear {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
// 测试用,查看显示效果是否正常
//background-color: green;
}
复制代码
如今,核心问题在于如何配置其高度,方法以下(见注释和上面的分析):
// 历史记录的数量,最小为1(为0时,该位置为占位符)
let dearLength = asideData.asideDear.length < 1 ? 1 : asideData.asideDear.length
// 最大只容许显示【10】行
const MAXDEARCOUNT = 10;
if (dearLength > MAXDEARCOUNT) {
dearLength = MAXDEARCOUNT
}
// 历史记录的高度 = dear的高度34px(24px字体+5*2px上下部分行间距)
// + 历史记录单行高度22px(12px字体高度+5*2上下行间距)
// + 最下方留白5px
const dearHeight = 34 + 22 * dearLength + 5;
const navStyle = {
bottom: `${dearHeight}px`
}
const dearStyle = {
height: `${dearHeight}px`
}
复制代码
此时咱们已经配置好了两个子元素的高度,而且是动态生成的。
因而,给出 asideData.asideDear 的模拟数据:
asideDear: [
{
// 跳转url
url: '#01',
// 历史文字显示
text: 'gfdsbfdsbdfsb'
},
{
url: '#02',
text: 'hrtnhr12'
},
{
url: '#03',
text: 'mythn13rfe'
}
]
复制代码
此时,咱们更改 asideDear 的元素个数,会发现 dear 区域的高度发生变化。
【缺点】
该方案是没问题的,硬要说缺点的话,就是上方区域按钮比较多的时候,默认出现滚动条比较丑。
解决方案也不难,提供几个参考:
我这里采用第三种解决方案,方法参考【套路6:无痕滚动】
场景描述:
解决思路:
这个太简单了,无非就是按钮里面一图标一文字,就只说一下思路吧。
须要注意的是:
padding-top: 20px;
;代码参照:
src/components/aside/index.jsx
src/components/aside/style.less
复制代码
解决了高度问题后,这个就更简单了。
完事。
此时效果图以下:(假设按钮比较多的极端状况效果图)