W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
柵格布局是一種通用的輔助定位工具,對(duì)移動(dòng)設(shè)備的界面設(shè)計(jì)有較好的借鑒作用。主要優(yōu)勢(shì)包括:
柵格系統(tǒng)以設(shè)備的水平寬度(屏幕密度像素值,單位vp)作為斷點(diǎn)依據(jù),定義設(shè)備的寬度類型,形成了一套斷點(diǎn)規(guī)則。開發(fā)者可根據(jù)需求在不同的斷點(diǎn)區(qū)間實(shí)現(xiàn)不同的頁(yè)面布局效果。
柵格系統(tǒng)默認(rèn)斷點(diǎn)將設(shè)備寬度分為xs、sm、md、lg四類,尺寸范圍如下:
斷點(diǎn)名稱 | 取值范圍(vp) | 設(shè)備描述 |
---|---|---|
xs | [0, 320) | 最小寬度類型設(shè)備。 |
sm | [320, 520) | 小寬度類型設(shè)備。 |
md | [520, 840) | 中等寬度類型設(shè)備。 |
lg | [840, +∞) | 大寬度類型設(shè)備。 |
在GridRow柵格組件中,允許開發(fā)者使用breakpoints自定義修改斷點(diǎn)的取值范圍,最多支持6個(gè)斷點(diǎn),除了默認(rèn)的四個(gè)斷點(diǎn)外,還可以啟用xl,xxl兩個(gè)斷點(diǎn),支持六種不同尺寸(xs, sm, md, lg, xl, xxl)設(shè)備的布局設(shè)置。
斷點(diǎn)名稱 | 設(shè)備描述 |
---|---|
xs | 最小寬度類型設(shè)備。 |
sm | 小寬度類型設(shè)備。 |
md | 中等寬度類型設(shè)備。 |
lg | 大寬度類型設(shè)備。 |
xl | 特大寬度類型設(shè)備。 |
xxl | 超大寬度類型設(shè)備。 |
針對(duì)斷點(diǎn)位置,開發(fā)者根據(jù)實(shí)際使用場(chǎng)景,通過一個(gè)單調(diào)遞增數(shù)組設(shè)置。由于breakpoints最多支持六個(gè)斷點(diǎn),單調(diào)遞增數(shù)組長(zhǎng)度最大為5。
- breakpoints: {value: ['100vp', '200vp']}
表示啟用xs、sm、md共3個(gè)斷點(diǎn),小于100vp為xs,100vp-200vp為sm,大于200vp為md。
- breakpoints: {value: ['320vp', '520vp', '840vp', '1080vp']}
表示啟用xs、sm、md、lg、xl共5個(gè)斷點(diǎn),小于320vp為xs,320vp-520vp為sm,520vp-840vp為md,840vp-1080vp為lg,大于1080vp為xl。
柵格系統(tǒng)通過監(jiān)聽窗口或容器的尺寸變化進(jìn)行斷點(diǎn),通過reference設(shè)置斷點(diǎn)切換參考物。 考慮到應(yīng)用可能以非全屏窗口的形式顯示,以應(yīng)用窗口寬度為參照物更為通用。
例如,使用柵格的默認(rèn)列數(shù)12列,通過斷點(diǎn)設(shè)置將應(yīng)用寬度分成六個(gè)區(qū)間,在各區(qū)間中,每個(gè)柵格子元素占用的列數(shù)均不同。
- @State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown];
- ...
- GridRow({
- breakpoints: {
- value: ['200vp', '300vp', '400vp', '500vp', '600vp'],
- reference: BreakpointsReference.WindowSize
- }
- }) {
- ForEach(this.bgColors, (color, index) => {
- GridCol({
- span: {
- xs: 2, // 在最小寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器2列。
- sm: 3, // 在小寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器3列。
- md: 4, // 在中等寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器4列。
- lg: 6, // 在大寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器6列。
- xl: 8, // 在特大寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器8列。
- xxl: 12 // 在超大寬度類型設(shè)備上,柵格子組件占據(jù)的柵格容器12列。
- }
- }) {
- Row() {
- Text(`${index}`)
- }.width("100%").height('50vp')
- }.backgroundColor(color)
- })
- }
GridRow中通過columns設(shè)置柵格布局的總列數(shù)。
columns默認(rèn)值為12,即在未設(shè)置columns時(shí),任何斷點(diǎn)下,柵格布局被分成12列。
- @State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown,Color.Red, Color.Orange, Color.Yellow, Color.Green];
- ...
- GridRow() {
- ForEach(this.bgColors, (item, index) => {
- GridCol() {
- Row() {
- Text(`${index + 1}`)
- }.width('100%').height('50')
- }.backgroundColor(item)
- })
- }
當(dāng)columns為自定義值,柵格布局在任何尺寸設(shè)備下都被分為columns列。下面分別設(shè)置柵格布局列數(shù)為4和8,子元素默認(rèn)占一列,效果如下:
- @State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown];
- @State currentBp: string = 'unknown';
- ...
- Row() {
- GridRow({ columns: 4 }) {
- ForEach(this.bgColors, (item, index) => {
- GridCol() {
- Row() {
- Text(`${index + 1}`)
- }.width('100%').height('50')
- }.backgroundColor(item)
- })
- }
- .width('100%').height('100%')
- .onBreakpointChange((breakpoint) => {
- this.currentBp = breakpoint
- })
- }
- .height(160)
- .border({ color: Color.Blue, width: 2 })
- .width('90%')
- Row() {
- GridRow({ columns: 8 }) {
- ForEach(this.bgColors, (item, index) => {
- GridCol() {
- Row() {
- Text(`${index + 1}`)
- }.width('100%').height('50')
- }.backgroundColor(item)
- })
- }
- .width('100%').height('100%')
- .onBreakpointChange((breakpoint) => {
- this.currentBp = breakpoint
- })
- }
- .height(160)
- .border({ color: Color.Blue, width: 2 })
- .width('90%')
當(dāng)columns類型為GridRowColumnOption時(shí),支持下面六種不同尺寸(xs, sm, md, lg, xl, xxl)設(shè)備的總列數(shù)設(shè)置,各個(gè)尺寸下數(shù)值可不同。
- @State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown]
- GridRow({ columns: { sm: 4, md: 8 }, breakpoints: { value: ['200vp', '300vp', '400vp', '500vp', '600vp'] } }) {
- ForEach(this.bgColors, (item, index) => {
- GridCol() {
- Row() {
- Text(`${index + 1}`)
- }.width('100%').height('50')
- }.backgroundColor(item)
- })
- }
若只設(shè)置sm, md的柵格總列數(shù),則較小的尺寸使用默認(rèn)columns值12,較大的尺寸使用前一個(gè)尺寸的columns。這里只設(shè)置sm:4, md:8,則較小尺寸的xs:12,較大尺寸的參照md的設(shè)置,lg:8, xl:8, xxl:8。
柵格布局中,可以通過設(shè)置GridRow的direction屬性來指定柵格子組件在柵格容器中的排列方向。該屬性可以設(shè)置為GridRowDirection.Row(從左往右排列)或GridRowDirection.RowReverse(從右往左排列),以滿足不同的布局需求。通過合理的direction屬性設(shè)置,可以使得頁(yè)面布局更加靈活和符合設(shè)計(jì)要求。
子組件默認(rèn)從左往右排列。
- GridRow({ direction: GridRowDirection.Row }){}
子組件從右往左排列。
- GridRow({ direction: GridRowDirection.RowReverse }){}
GridRow中通過gutter屬性設(shè)置子元素在水平和垂直方向的間距。
當(dāng)gutter類型為number時(shí),同時(shí)設(shè)置柵格子組件間水平和垂直方向邊距且相等。下例中,設(shè)置子組件水平與垂直方向距離相鄰元素的間距為10。
- GridRow({ gutter: 10 }){}
當(dāng)gutter類型為GutterOption時(shí),單獨(dú)設(shè)置柵格子組件水平垂直邊距,x屬性為水平方向間距,y為垂直方向間距。
- GridRow({ gutter: { x: 20, y: 50 } }){}
GridCol組件作為GridRow組件的子組件,通過給GridCol傳參或者設(shè)置屬性兩種方式,設(shè)置span(占用列數(shù)),offset(偏移列數(shù)),order(元素序號(hào))的值。
設(shè)置span。
- GridCol({ span: 2 }){}
- GridCol({ span: { xs: 1, sm: 2, md: 3, lg: 4 } }){}
- GridCol(){}.span(2)
- GridCol(){}.span({ xs: 1, sm: 2, md: 3, lg: 4 })
設(shè)置offset。
- GridCol({ offset: 2 }){}
- GridCol({ offset: { xs: 2, sm: 2, md: 2, lg: 2 } }){}
- GridCol(){}.offset(2)
- GridCol(){}.offset({ xs: 1, sm: 2, md: 3, lg: 4 })
設(shè)置order。
- GridCol({ order: 2 }){}
- GridCol({ order: { xs: 1, sm: 2, md: 3, lg: 4 } }){}
- GridCol(){}.order(2)
- GridCol(){}.order({ xs: 1, sm: 2, md: 3, lg: 4 })
子組件占柵格布局的列數(shù),決定了子組件的寬度,默認(rèn)為1。
當(dāng)類型為number時(shí),子組件在所有尺寸設(shè)備下占用的列數(shù)相同。
- @State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown];
- ...
- GridRow({ columns: 8 }) {
- ForEach(this.bgColors, (color, index) => {
- GridCol({ span: 2 }) {
- Row() {
- Text(`${index}`)
- }.width('100%').height('50vp')
- }
- .backgroundColor(color)
- })
- }
當(dāng)類型為GridColColumnOption時(shí),支持六種不同尺寸(xs, sm, md, lg, xl, xxl)設(shè)備中子組件所占列數(shù)設(shè)置,各個(gè)尺寸下數(shù)值可不同。
- @State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown];
- ...
- GridRow({ columns: 8 }) {
- ForEach(this.bgColors, (color, index) => {
- GridCol({ span: { xs: 1, sm: 2, md: 3, lg: 4 } }) {
- Row() {
- Text(`${index}`)
- }.width('100%').height('50vp')
- }
- .backgroundColor(color)
- })
- }
柵格子組件相對(duì)于前一個(gè)子組件的偏移列數(shù),默認(rèn)為0。
當(dāng)類型為number時(shí),子組件偏移相同列數(shù)。
- @State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown];
- ...
- GridRow() {
- ForEach(this.bgColors, (color, index) => {
- GridCol({ offset: 2 }) {
- Row() {
- Text('' + index)
- }.width('100%').height('50vp')
- }
- .backgroundColor(color)
- })
- }
柵格默認(rèn)分成12列,每一個(gè)子組件默認(rèn)占1列,偏移2列,每個(gè)子組件及間距共占3列,一行放四個(gè)子組件。
當(dāng)類型為GridColColumnOption時(shí),支持六種不同尺寸(xs, sm, md, lg, xl, xxl)設(shè)備中子組件所占列數(shù)設(shè)置,各個(gè)尺寸下數(shù)值可不同。
- @State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown];
- ...
- GridRow() {
- ForEach(this.bgColors, (color, index) => {
- GridCol({ offset: { xs: 1, sm: 2, md: 3, lg: 4 } }) {
- Row() {
- Text('' + index)
- }.width('100%').height('50vp')
- }
- .backgroundColor(color)
- })
- }
柵格子組件的序號(hào),決定子組件排列次序。當(dāng)子組件不設(shè)置order或者設(shè)置相同的order, 子組件按照代碼順序展示。當(dāng)子組件設(shè)置不同的order時(shí),order較小的組件在前,較大的在后。
當(dāng)子組件部分設(shè)置order,部分不設(shè)置order時(shí),未設(shè)置order的子組件依次排序靠前,設(shè)置了order的子組件按照數(shù)值從小到大排列。
當(dāng)類型為number時(shí),子組件在任何尺寸下排序次序一致。
- GridRow() {
- GridCol({ order: 4 }) {
- Row() {
- Text('1')
- }.width('100%').height('50vp')
- }.backgroundColor(Color.Red)
- GridCol({ order: 3 }) {
- Row() {
- Text('2')
- }.width('100%').height('50vp')
- }.backgroundColor(Color.Orange)
- GridCol({ order: 2 }) {
- Row() {
- Text('3')
- }.width('100%').height('50vp')
- }.backgroundColor(Color.Yellow)
- GridCol({ order: 1 }) {
- Row() {
- Text('4')
- }.width('100%').height('50vp')
- }.backgroundColor(Color.Green)
- }
當(dāng)類型為GridColColumnOption時(shí),支持六種不同尺寸(xs, sm, md, lg, xl, xxl)設(shè)備中子組件排序次序設(shè)置。在xs設(shè)備中,子組件排列順序?yàn)?234;sm為2341,md為3412,lg為2431。
- GridRow() {
- GridCol({ order: { xs:1, sm:5, md:3, lg:7}}) {
- Row() {
- Text('1')
- }.width('100%').height('50vp')
- }.backgroundColor(Color.Red)
- GridCol({ order: { xs:2, sm:2, md:6, lg:1} }) {
- Row() {
- Text('2')
- }.width('100%').height('50vp')
- }.backgroundColor(Color.Orange)
- GridCol({ order: { xs:3, sm:3, md:1, lg:6} }) {
- Row() {
- Text('3')
- }.width('100%').height('50vp')
- }.backgroundColor(Color.Yellow)
- GridCol({ order: { xs:4, sm:4, md:2, lg:5} }) {
- Row() {
- Text('4')
- }.width('100%').height('50vp')
- }.backgroundColor(Color.Green)
- }
柵格組件也可以嵌套使用,完成一些復(fù)雜的布局。
以下示例中,柵格把整個(gè)空間分為12份。第一層GridRow嵌套GridCol,分為中間大區(qū)域以及“footer”區(qū)域。第二層GridRow嵌套GridCol,分為“l(fā)eft”和“right”區(qū)域。子組件空間按照上一層父組件的空間劃分,粉色的區(qū)域是屏幕空間的12列,綠色和藍(lán)色的區(qū)域是父組件GridCol的12列,依次進(jìn)行空間的劃分。
- @Entry
- @Component
- struct GridRowExample {
- build() {
- GridRow() {
- GridCol({ span: { sm: 12 } }) {
- GridRow() {
- GridCol({ span: { sm: 2 } }) {
- Row() {
- Text('left').fontSize(24)
- }
- .justifyContent(FlexAlign.Center)
- .height('90%')
- }.backgroundColor('#ff41dbaa')
- GridCol({ span: { sm: 10 } }) {
- Row() {
- Text('right').fontSize(24)
- }
- .justifyContent(FlexAlign.Center)
- .height('90%')
- }.backgroundColor('#ff4168db')
- }
- .backgroundColor('#19000000')
- .height('100%')
- }
- GridCol({ span: { sm: 12 } }) {
- Row() {
- Text('footer').width('100%').textAlign(TextAlign.Center)
- }.width('100%').height('10%').backgroundColor(Color.Pink)
- }
- }.width('100%').height(300)
- }
- }
綜上所述,柵格組件提供了豐富的自定義能力,功能異常靈活和強(qiáng)大。只需要明確柵格在不同斷點(diǎn)下的Columns、Margin、Gutter及span等參數(shù),即可確定最終布局,無(wú)需關(guān)心具體的設(shè)備類型及設(shè)備狀態(tài)(如橫豎屏)等。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: