目錄: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
複製代碼
解決了高度問題後,這個就更簡單了。
完事。
此時效果圖以下:(假設按鈕比較多的極端狀況效果圖)