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