android显示布局边界的边距_vivo 悟空活动中台 - 栅格布局方案

44b34f9e3f487a0c79dcb1d5cf272130.png
本文首发于 vivo互联网技术 微信公众号
链接: 悟空活动中台 - 栅格布局方案
作者:悟空中台研发团队

一、背景

今天来给大家分享一下栅格布局方案。在后台展示页面中,常见卡片列表的展示需求。但是这类展示型需求其实不容易满足,有以下两个问题。

1、优化前的问题

(1)PC分辨率不统一

用户在使用管理后台时,打开浏览器页面宽度不一。主流的显示宽度1920像素,但也存在1366,1600等其他宽度的场景。而且用户在桌面端搭建页面时,同时在操作的内容不仅仅是管理后台,可能会适当缩小页面宽度来做其他的事情。这样我们在页面布局时需要考虑到兼容广泛的屏幕宽度。

(2)一份设计稿

无论是前端开发还是设计师,在页面布局时,都希望能兼顾到不同终端场景下的展示差异,但是设计师不可能去针对性做出多套设计稿,来针对内容进行自适应设计。尚待有一种更加通用,且又轻量的方案供参考使用。

2、优化前的方案

在卡片列表展示的页面,往往会实现一种统一尺寸的卡片依次排列,或者一行展示固定数量的卡片,宽度动态调整。这两种布局方式是我们实现展示类需求的常备方案。

但是这两种常备方案,只是简单的解决了设计稿所呈现的分辨率展示诉求,在页面宽度有调整时,展示效果就不尽如人意了。

42364ab4d7741805a32815a3be89a6b2.png
(图1 - 优化前的方案)

(1)固定卡片宽度

在页面宽度进行调整时,页面左右侧会有较大幅度的空白,没有展示具体的内容。

(2)固定卡片个数

在页面宽度过大或者宽度过小时,卡片容易放大缩小至非常夸张的比例,展示的效果欠佳。

二、布局方案分析

鉴于目前简单的方案无法满足广泛页面宽度的诉求,我们可以对行业内多种自适应布局方案进行调研,来对我们最终的布局方案做出一定程度的参考。为了兼容页面不同宽度的情况,我们先将页面上布局元素进行一个简单的分类,布局的组成部分为卡片宽度,卡片外边距,容器内边距。自适应栅格布局,就是动态的调整这三个影响因子,来实现页面更理想的展示。

  • 卡片宽度:卡片的宽度随着页面宽度自适应调整
  • 卡片外边距:卡片互相之间的边距随着页面宽度自适应调整
  • 容器内边距:容器的内边距随着页面宽度自适应调整

a67d99f108446245d87e0f99720d7519.png
(图2 - 影响因子)

1、行业内的方案

我们这里收集了三种常见的行业内解决方案,来进行一一列举。

(1)谷歌 Material Design

谷歌的 Material Design ,是一套大一统的自适应布局解决方案,将页面宽度划分为13种场景,在达到这13种场景的临界点时,调整自适应布局的三个影响因子,来实现统一的自适应效果。该方案的优点是以谷歌的设计规范为蓝本,能够在一类产品中实现统一的布局风格。如果你的产品希望以谷歌的设计规范为依托,并且后期不会做个性化调整,谷歌的 Material Design 是很好的选择。

ddc40f95241ffe5fcc70b9e95c2c38d1.png
(图3 - 谷歌 Material Design)

(2)定制栅格的方案

定制栅格方案常用于企业官网或者视频网站。国内常见的视频网站,在首页展示视频内容时,就用到了这种定制栅格的方案,本质上就是在不同的分辨率区间,使用不同的设计稿。这种方案适合于设计资源比较丰富的团队,能够基于自适应的要求,给出多套实现的设计稿,并给出一套内部的定制化栅格方案。

2f960a389912e40042006db28f178869.png
(图4 - 定制栅格的方案)

(3)自适应栅格方案

自适应栅格方案,就是有一套计算公式,可以套用给页面宽度和页面布局三个影响因子,通过固定其中两项因子的值,计算出第三项因子的值,来实现页面布局的效果。这个方案适合于团队对设计资源要求不高,并且对展示效果有较高的要求的场景。

2、自适应方案分析

下面简要阐述三种自适应栅格方案各自的使用场景,和优缺点分析:

d7850345c1955f7f8c8b1ffce31dd1c3.png
(表1 - 自适应栅格方案对比)

(1)自适应卡片方案

通过固定页面边距和卡片边距的尺寸来计算出卡片宽度,该方案的优点是整体框架稳定,卡片自适应伸缩。缺点是调整浏览器宽度时,卡片尺寸不可避免时大时小,卡片内部的元素要按照百分比布局,一定要做好自适应。

6870492086a82a6ef851656a022b69ed.png
(图5 - 自适应卡片方案)

(2)自适应内边距方案

通过固定卡片边距和卡片宽度的尺寸来计算出页面边距,该方案的优点是,卡片展示内容整体居中,卡片宽度也不会有变化,卡片内部可以严格还原设计稿;但缺点是,卡片内容在大屏内会显得太小,但是在小屏上会显得很大。

5079c54fed947512ed3f6b2bf040f5e5.png
(图6 - 自适应内边距方案)

(3)自适应边距方案

通过固定页面边距和卡片宽度的尺寸来计算出卡片边距,该方案的优点是,页面左右两侧不会有太大的空白区域,卡片宽度也不会有变化,卡片内部可以严格还原设计稿;但缺点是卡片边距会动态调整,这种场景中卡片直接的距离往往比较大,这样视觉效果更好。

eea628297d659fab4cc07462dd6650ab.png
(图7 - 自适应边距方案)

3、方案总结

行业内这三个方案各有不同的适用场景。

  • Material Design 方案适合于团队设计资源投入少,设计风格以谷歌 Material Design UI 为准,且后期不会做个性化调整的团队。
  • 定制化栅格方案适合于团队设计资源丰富且定制化强的团队。
  • 自适应栅格方案适合于团队设计资源投入少且栅格风格更加个性化的团队。

悟空团队基于团队业务需求和设计效果,决定使用自适应栅格方案,下面是我们的栅格方案实现。

aa3c9a4328bcb35daad792cb7c895999.gif
(图8 - 悟空栅格实现)

三、自适应栅格方案 - 栅格组件实现

我们根据自适应栅格方案实现了自适应栅格组件,三种自适应栅格方案可以使用同一个组件来实现,我们首先看看栅格组件如何进行使用。

1、组件使用方式

自适应栅格组件包含外层的容器组件 Grid 和内置的卡片组件 GridItem,容器组件有四个基础配置项和三个定制化配置项。

以下是容器组件 Grid 的基础配置项,Grid根据基础配置项粗算出一行展示的栅格个数。

(1)组件配置项

377f52002756cf1da0ff7c6f0cda5402.png
(表2 - 自适应栅格基础配置项)

以下是容器组件 Grid 的定制配置项,根据栅格个数和限制条件判断是否需要调整栅格个数,进行自适应调整。

0610e090eef0d0bf60a588c646fe0245.png
(表3 - 自适应栅格定制配置项)

(2)组件使用范例

这里我们使用项目展示列表来举例。在项目展示的场景,我们将卡片容器使用 Grid 组件,并且在卡片素材使用 GridItem 组件进行包裹,不修改默认的 Grid 参数。

<grid ref="grid" :gridType="'autoMargin'" :baseW="250">
  <grid-item v-for="project in projectList" 
    :key="project.projectId"
    class="project-item"
    >
    <div class="name">{{ project.name }}</div>
  </grid-item>
</grid>

2、组件核心逻辑

下面简要描述一下栅格布局组件 Grid 的核心逻辑:

  • 组件 mounted 后,监听 window 的 resize 事件。
  • 页面宽度发生变化时,清除当前计算数据,并重新计算出自适应效果。
  • 在组件销毁前,移除对 window 的 resize 事件监听。
mounted () {
  window.addEventListener('resize', this.calcGridSize, false)
  this.reset()
},
beforeDestroy () {
  window.removeEventListener('resize', this.calcGridSize, false)
},
methods: {
  reset () {
    // 清除计算数据
    this.calcGridSize()
  },
  calcGridSize () {
    // 重新进行计算
  }
}

3、自适应效果计算

不同的自适应方案对应有不同的计算规则,但是其核心方案都是一致的,需要根据三个数值配置项作为基准,求解在页面宽度变化时,其中某一个配置项如何自适应变化。以下整理三种自适应方案的计算方式:

d8aa3dd55bc0433ff5809e1692121721.png
(表4 - 自适应栅格实现方式)

以下整理三种方案的计算公式:

979ee8df4723fa437d0f31e2c6acef60.png
(表5 - 自适应栅格计算公式)

以下根据自适应卡片宽度为例分析具体的流程:

  • calcGridSize 根据当前配置项选择计算方式;
  • getGridNum 计算出一行同时存在的卡片个数;
  • 根据 limitW 计算是否需要调整卡片个数,计算出最终的卡片宽度。
calcGridSize () {
  // step 1,选择计算方式
  if (this.gridType === 'autoMargin') {
    this.calcAutoMg()
  } else if (this.gridType === 'autoPadding') {
    this.calcAutoPd()
  } else {
    this.calcAutoWd()
  }
},
// 自适应卡片宽度
calcAutoWd () {
  const containW = this.$el.clientWidth
  const { baseMg, baseW, limitW } = this
  // step 2,计算 grid 个数
  const caclW = containW - baseMg
  let gridNum = Math.floor(caclW / baseW)
  let gridW = caclW % baseW / gridNum + baseW - baseMg
  // step 3,修正 grid 个数,计算出最终卡片宽度
  if (caclW % baseW > limitW) {
    gridW = caclW / (1 + gridNum) - baseMg
  }
  this.gridW = gridW
},
// 自适应外边距
calcAutoMg() {
  const containW = this.$el.clientWidth
  const { baseMg, baseW, limitMg } = this
  // step 2,计算 grid 个数
  const caclW = containW - baseMg
  let gridNum = Math.floor(caclW / baseW)
  let gridMg = (containW - baseW * gridNum) / (gridNum + 1)
  // step 3,修正 grid 个数,计算出最终外边距
  if (gridMg < limitMg) {
    gridNum--
    gridMg = (containW - baseW * gridNum) / (gridNum + 1)
  }
  this.gridMg = gridMg;
},
// 容器自适应内边距
calcAutoPd() {
  const containW = this.$el.clientWidth
  const { baseMg, baseW, limitPd } = this
  // step 2,计算内边距
  let gridPd = ((containW + baseMg) % (baseW + baseMg)) / 2
  // step 3,修正 grid 个数,计算最终内边距
  if (gridPd < limitPd) {
    gridPd =
      (((containW + baseMg) % (baseW + baseMg)) + baseW + baseMg) / 2
  }
  this.gridPd = gridPd;
}

4、自适应样式传值 - CSS变量

上一步骤,我们通过以自适应卡片宽度为例子,计算出来自适应参数后,需要有一种方式来实现CSS样式的父子传值。

在基于vue的管理后台项目上,我们有两种实现方式来解决CSS样式的父子传值。

  • 通过 父子组件props 来传值
  • 通过 CSS变量来传值

考虑到CSS变量实现方式更加轻量而且兼容性符合我们项目要求。我们通过使用CSS变量来完成自适应样式传值,下面简要介绍一下CSS变量在前端页面中的使用。

(1)声明与使用

声明CSS变量时,需要在变量名前面增加两根连词线(--)。变量名大小写敏感,并且变量的值可以是色值、数字和字符串。

使用CSS变量时,需要使用var()函数进行包裹。var()函数默认接受两个参数,第一个参数是前文定义的CSS变量,第二个参数是默认值(可不传)。

下面代码展示了如何声明并使用CSS变量

  • 在 grids 中声明了变量 --gridW,并且在 grid-item 中进行使用。
  • 在 grid-item 中使用变量 --gridH作为高度,如果获取不到,则使用默认值 50px
<style>
.grids {
  --gridW: 200px;
}
.grids .grid-item {
  width: var(--gridW);
  height: var(--gridH, 50px);
}
</style>

(2)作用域与优先级

CSS变量 可以在多个选择器内进行定义和使用,优先级与CSS层叠优先级一致,作用范围则是在变量定义的选择器范围内均生效。

(3)兼容性

我们在业务开发中已经开始使用CSS变量了,通过 CanIUse 网站可以看出目前CSS变量已经兼容了众多主流浏览器,并且在前文中提到的谷歌 Material Design 方案也是使用CSS变量来实现谷歌的栅格布局方案。所以兼容性上,大家可以放心使用。

d771a5fbcc940c6f8ad7d0f9d9154116.png
(图9 - CSS变量兼容性)

如果要考虑兼容性处理,建议在使用CSS变量时考虑下述方法进行兼容。

<style>
.grids .grid-item {
  width: 200px;
  width: var(--gridW);
}
</style>

(4)样式传值实现

栅格布局组件在父组件上定义卡片宽度,卡片边距。通过CSS变量传值给子组件进行使用。

<template>
  <div class="grids" :style="{
    '--gridW': gridW + 'px',
    '--gridMg': gridMg + 'px',
    '--gridPd': gridPd + 'px'
  }">
    <slot></slot>
  </div>
</template>

<script>
// ...
</script>
<style lang="less" scoped>
.grids {
  overflow-y: auto;
  display: flex;
  flex-wrap: wrap;
  -webkit-box-pack: start;
  -ms-flex-pack: start;
  justify-content: flex-start;
  align-content: flex-start;
  padding: 0 var(--gridPd) 0 calc(var(--gridPd) - var(--gridMg));
  >>> .grid-item {
    width: var(--gridW);
    margin-left: var(--gridMg);
  }
}
</style>

四、小结

我们从提升卡片类页面展示效果的诉求出发,历经:

  1. 当前布局问题分析
  2. 行业内布局方案筛选
  3. 栅格布局方案实现
  4. CSS变量优化

等一系列手段,探索出适合管理后台的栅布局方案,更好的服务了中台页面的展示场景。悟空中台开发团队将永不止步,持续研究和思考,为大家带来更多的实战技巧,感谢您的阅读。


悟空活动中台】系列往期精彩文章:

  • 《揭秘 vivo 如何打造千万级 DAU 活动中台 - 启航篇》 主要为大家讲述 vivo 活动中台的能力与创新。
  • 《悟空活动中台 - 微组件状态管理(上)》介绍了活动页内 RSC 组件之间的状态管理和背后的设计思路。
  • 《悟空活动中台 - 微组件状态管理(下)》探索平台和跨沙箱环境下的微组件状态管理。
  • 《vivo 悟空活动中台-基于行为预设的动态布局方案》本文以“满屏”场景下的页面布局思考为切入点,以微组件为元素单元,提供了一种新的布局方案设计思路——基于行为预设的动态布局方案,并详细的分享了设计目的及具体实现方案。
  • 《vivo悟空活动中台 - 微组件多端探索》是基于自助多端扩展,也就意味着多端 微 组件选择越丰富,内容越通用,玩法越多样,产品价值也会越高。
  • 《vivo 悟空活动中台 - H5 活动加载优化》从提高资源请求速度,资源压缩、缓存、渲染等多种角度出发,寻找悟空活动专题加载优化方案。
  • 《vivo悟空活动中台 - 基于 WebP 的图片高性能加载方案》 从技术选型、架构设计到方案落地,全方位的呈现悟空活动中台基于 WebP 的图片高性能加载方案。
深入探索Android布局优化(上) 前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。 Android的绘制优化其实可以分为两个部分,即布局(UI)优化和卡顿优化,而布局优化的核心问题就是要解决因布局渲染性能不佳而导致应用卡顿的问题,所以它可以认为是卡顿优化的一个子集。对于Android开发来说,写布局可以说是一个比较简单的工作,但是如果想将写的每一个布局的渲染性能提升到比较好的程度,要付出的努力是要远远超过写布局所付出的。由于布局优化这一主题包含的内容太多,因此,笔者将它分为了上、 阅读详情

相关推荐

(七)Android布局类型(网格布局GridLayout)

Android布局类型(网格布局GridLayout)

以秘 2648

Android布局之GridLayout网格布局

网格布局标签是GridLayout。这个布局android4.0新增的布局。这个布局只有4.0之后的版本才能使用。 不过新增了一些东东 ①跟LinearLayout(线性布局)一样,他可以设置容器中组件的对齐方式 ②容器中的组件可以跨多行也可以跨多列(相比TableLayout直接放组件,占一行相比较) 因为是android 4.0新增的,API Level 14,在这个版本以前的sdk 都需要导入项目,等下会详细介绍 常用属性: 排列对齐: ①设置组件的排列方式:   android:orientation=””     vertical(竖直,默认)或者horizontal(水平) ②设

安卓讲课笔记3.4 网格布局

1. 了解网格布局特点; 2. 熟悉网格布局常用属性; 3. 掌握线性布局嵌套网格布局

howard2005的专栏 2243

Android - UI开发基础

spread会占用所有符合条件的空间,且因为spread时默认的layout_constraintWidth_default,所以可以不写,在使用spread属性的时候,对应方向的start,end,或者top,bottom方向都要进行设置,不然扩展属性不会生效。​ 浮点值,表示宽度和高度之间的比率;flow流式布局可以控制当元素个数过多形成多行的链时的显示规则,有none,chain,align等规则,同时,我们也可以控制每行显示的view的数量和每行上的view的对齐方式。

liu_12345_liu的博客 2170

android显示布局边界查看布局

安卓开发者查看布局边界的步骤: 设置 - 开发人员选项 - (勾选)显示布局界限 立马就可以看到屏幕上,很多线条 红色:一个view的上,下,左,右 边界线 蓝色:一个view的角,比如长方形的四个角 粉红色:margin系列的,比如layout_marginLeft 、layout_marginBottom (注意:padding系列的,没有边界线,也没有颜色,不容易看出来)

ming_csdn_的博客 1万+

布局查看(显示布局边界

开发者选项-显示布局边界

xiyangyang8110的博客 536

栅格布局(GridRow/GridCol)

栅格布局是一种通用的辅助定位工具,对移动设备的界面设计有较好的借鉴作用。提供可循的规律:栅格布局可以为布局提供规律性的结构,解决多尺寸多设备的动态布局问题。通过将页面划分为等宽的列数和行数,可以方便地对页面元素进行定位和排版。统一的定位标注:栅格布局可以为系统提供一种统一的定位标注,保证不同设备上各个模块的布局一致性。这可以减少设计和开发的复杂度,提高工作效率。灵活的间调整方法:栅格布局可以提供一种灵活的间调整方法,满足特殊场景布局调整的需求。

4663

Android布局总结一:GridLayout布局(网格布局)

GridLayout布局简介GridLayout布局Android4.0(API Level 14)新引入的网格矩阵形式的布局控件。GridLayout属性介绍本身属性 android:alignmentMode 说明:当设置alignMargins,使视图的外边界之间进行校准。可以取以下值: alignBounds – 对齐子视图边界。 alignMargins – 对齐子视内容。 an

lixpjita39的专栏 8万+

android显示布局边界_设置word的4个技巧

1、左右两无白怎么设置默认情况下,文档的左右两侧是有白的,若不想留白,该如何删除呢?其实,在Word中两侧的白大小是可以通过页来实现的,点击布局——页面设置——页——自定义页,然后在左右两侧输入0即可取消白。注意:一般为了美观,左右页都会设置一定的离的。如何用word制作菜单?​www.wdashi.com2、装订线怎么设置为了方便装订,往往需要设置装订线,在哪里设置呢...

weixin_32770297的博客 726

CSS网格布局

网格容器 display设置为grid时,网格按行排列,宽度自动占满整个屏幕 display设置为inline-grid时,网格按行排列,宽度为元素本身宽度 .box1 { display: grid; } .box2 { height: 50px; background-color: aquamarine; margin-bottom: 10px; } .box1 { display: inlin

jwz934738949的博客 372

8.11 移动端布局排版思考

一.活动卡片布局 1.例:活动卡片页之间的水平间和屏幕两侧的水平间皆为10px B站: 给主体盒子设置一个左右为5px的内 再给每个盒子设置一个左右为5px内从而达到两侧和盒子之间的离皆为10px 二.宽度用flex / 定宽 百分比/? 1.如果单行水平布局的盒子各个不固定 首先先给大盒子display : flex 给第一个盒子和第三个盒子定宽 随后给中间的盒子设置flex :1; 2.单行水平布局的盒子宽度皆相同 大盒子display : fl...

m0_51975836的博客 453

css-calc数值计算(加 减 乘 除)以及使用注意

css-calc数值计算(加 减 乘 除)以及计算属性值失效

岂不闻 2168

安卓开发学习4-常用布局

是线性布局的下级视图各自拥有多大比例的宽高。该属性不在LinearLayout节点设置,而在线性布局的直接下级视图设置,表示该下级视图占据的宽高比例。水平滚动布局中嵌套线性水平布局,线性水平布局中包含两个视图。垂直滚动布局中嵌套线性垂直布局,线性垂直布局中包含两个视图。例如:指定视图的左侧:layout_toLeftOf和layout_alignTop。指定视图的上侧:layout_above和layout_alignLeft。相对布局的下级视图位置由其它视图决定。网格布局支持多行多列的表格排列。

weixin_55715269的博客 1253

响应式设计:12列栅格布局与移动用户界面模式

本文深入探讨了12列栅格布局系统的应用,以及在不同设备屏幕尺寸下内容如何适应。此外,文章详细介绍了移动应用中常见的用户界面设计模式,包括导航菜单的不同类型及其优缺点,以帮助设计师在实际应用中做出更明智的选择。

weixin_42527589的博客 608

android显示布局边界_Android 布局之GridLayout

Android 布局之GridLayout1 GridLayout简介GridLayout是Android4.0新提供的网格矩阵形式的布局控件。GridLayout的继承关系如下:java.lang.Object--> android.view.View--> android.view.ViewGroup--> android.widget.GridLayoutGridLayou...

weixin_30569443的博客 1026

android constraintlayout垂直居中_Android Material Design控件使用——ConstraintLayout 约束布局

本章节将分为两个模块给大家推送,觉得不错的可以关注下哦介绍Android ConstraintLayout是谷歌推出替代PrecentLayout的组件。支持相对布局、线性布局、帧布局,看来更像是FrameLayout 、LinearLayout、`RelativeLayout·三者的结合体,并且比这三者更强大的是实现了百分比布局。大家都知道安卓碎片严重,使用百分比适配,那么将彻底解决适配问题总结...

weixin_39645308的博客 1034

Android基本布局-GridLayout_网格布局

Android基本布局-GridLayout_网格布局

m0_59586434的博客 1万+
上一篇: windows python读取.bz2_扔掉压缩工具,让我们用 Python 管理压缩包。
下一篇: python requests html格式图片打不开_爬虫下载图片打不开是什么原因,最新简易爬虫教程...
weixin_39782832
博客等级 码龄9年 56粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值