大家好,欢迎来到停止重构的频道。

本期讨论网页UI布局

网页UI布局是前端开发中占比较多的部分,做完网页布局也就差不多完成了一半的工作。

本期视频,我们不再讨论基础的UI布局。

我们希望满足响应式布局,一份代码适配PC/平板/手机等多端设备,希望尽可能适配视窗/内容变化。

我们按以下顺序展开讨论

  1. 网页布局核心问题
  2. 视窗变化
  3. 内容变化
  4. 我们的解决方案

网页布局核心问题

我们先抛开一切解决方案,观察网页布局本身。

一个网页像是一个大盒子,上面整齐放着小盒子或零件,小盒子中又可以放小盒子或零件。

如果所有的零件和盒子尺寸都是固定的,网页布局将是较为简单的工作,基本上就是将UI设计图翻译为HTML语言,甚至很多UI设计工具都可以直接导出HTML文件。

但是,现实的前端开发工作并不是这么简单的事情,核心问题是,网页布局中的这些盒子和零件的尺寸是变化的

尺寸变化的问题又分为视窗变化和内容变化,以下将分别讨论其解决方案。

视窗变化

首先是视窗变化

整个网页的大盒子,也就是网页的视窗是变化的。

比如仅仅用作PC端的网页,最终运行的视窗尺寸也是有变化的,因为用户显示器的尺寸不是固定的,而且PC浏览器的窗口大小也可以随意调整。

如果一个网页仅用于PC端或者手机端,即使视窗尺寸有所浮动,网页的整体布局一般是不需要有太大变化的,一般只需要微调局部,让内容可以正常显示。

但是,如果一个网页需要同时适配手机/平板/PC等多端的话,则可能会引起整体网页布局的变化

以我们的手册网页为例,PC网页是左目录右内容,手机网页是上目录下内容,且详细目录需要隐藏起来。

这里需要特别说明的是,手机/平板/PC多端适配的前提,是网页结构是类似的

比如仅仅是换一下区域的位置,或者仅仅需要某几个区域建立分身做特殊适配。

若网页特别复杂,且PC/手机网页的设计风格完全不一致的话,则适配工作量会非常大,还不如独立分开PC/手机端网页。

针对视窗的变化,我们一般是根据视窗宽度调整CSS样式。

视窗的宽度我们推荐以下几个梯度,其中视窗宽度小于768px的话,一般为手机等移动设备。需要考虑是否重新调整网页整体布局

这里有个点需要注意,移动设备一般是可以横向、纵向旋转的

以IPhone为例,竖着的时候,视窗宽度为390px 横着的时候,视窗宽度为844px。

所以,768px这个移动设备分水岭并不是绝对的,需要根据具体项目的适配要求而定。

这里需要补充说明的是,屏幕分辨率尺寸和浏览器视窗尺寸并不是完全等效的

根据系统设置,一般1-3个物理像素等于1个网页视窗像素,比如iPhone的横向分辨率为1170,其浏览器视窗宽度为390px。

如果网页需要在移动设备运行HTML的head中需要添加meta标识,不然网页会自动缩小。

针对视窗变化,一般是在CSS设置中,通过@media筛选视窗宽度进行样式覆盖,在网页开发调试时,需要测试这些推荐梯度下网页是否正常。

内容变化

接下来是内容变化

网页的局部内容并不都是固定的,特别是某些内容是从服务端获取的。

比如需要做一个信息卡片的布局,左边的图片需要固定为25%的宽度,且长宽比为1:1,图片高度也决定了整个卡片的高度。

标题旁边需要紧挨着标签,说明区域占据一行且贴紧底部,内容区域自动占满剩余高度。

若按照经典的布局方式,比如float、flex等布局方式。

会非常的麻烦,需要一层一层设置下来,且样式改版时非常麻烦。

那有没有一种更为直观的方式,更贴近表格的布局方式呢。

这里推荐使用Grid布局,Grid布局的详细语法非常丰富,但是我们只推荐这样的做法:

我们希望先规划好网格的尺寸,然后通过标识绑定具体的网格区域。

以上面的信息卡片为例子,我们需要先规划好网格,包括行高、列宽、区域标识。

对应的CSS代码为,在最外层元素的CSS样式上开启grid布局,且通过grid-template设置网格行高、列宽、区域标识,通过gap设置网格间的间隙。

具体的子区域通过区域标识绑定,即可插入对应的位置。

相比于经典的flex、float布局,Grid布局的HTML结构也更加简洁。

这里需要补充说明的是,在网格设置中 行高、列宽中包含了2个较为特殊的单位:auto和fr

auto指的是自动适配区域内部的宽度或者高度,比如标题title的宽度设置为auto,则标签的位置会自动根据标题的宽度自动左右移动。

fr指的是自动占满剩下的区域宽度或者高度,比如内容content高度设置为1fr,则自动填充剩余高度。

若说明区域也设置为1fr,则内容和说明区域平分剩余高度。

若说明区域设置为2fr,则说明区域的高度将会是内容高度的两倍。

Grid布局的好处十分明显,可以在一个地方管理网格设置。在修改网格布局时,会非常的清晰方便, HTML结构也更简单易懂。

比如,信息卡片在手机端需要改变布局方式,可以简单地设置手机布局样式,而不需要修改子区域的样式。

值得一题的是,仅通过调整布局来适配所有视窗是不现实的,某些区域可能需要建立分身进行特殊适配,在不同的视窗宽度显示不同的分身。

当然,Grid布局也有局限性,就是老旧浏览器对其支持有限。

老旧浏览器一般也就是IE11及之前版本,若网页没有IE的适配要求,则可以放心地使用Grid布局。

我们的解决方案

以上是原生CSS解决方案。

在我们的前端框架Trick2中,也更新了_BoxGrid组件,通过设置组件参数,即可快速实现Grid布局。

另外,为了适配复杂的多层布局,组件参数允许嵌套设置快速实现多层布局

一些时候,若需要给某些区域添加a标签跳转,这个组件也提供了_as参数,可以设置为a标签,并直接设置跳转路径。

总结

以上就是我们目前比较推荐的UI布局方式,这种方式最为直观,更接近直觉中网页是一个表格的感觉。

这里强调一下,我们并非推荐网页布局仅使用Grid布局,而是推荐在全局或者大片区域的布局上使用Grid布局,小局部可能使用经典的flex、float等布局方式更为方便。

在两年前,我们也讨论过响应式布局,但在这两年的实践中,我们发现Grid布局实现起来更为简单直观,维护起来也更加方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88050.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88050.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88050.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【郑大二年级信安小学期】Day4上午:Bool盲注时间盲注堆叠查询post注入HTTP头部注入ua字段

目录 0 录制文件 1 SQL注入-布尔盲注 1.1 布尔盲注优缺点 1.2 先看一下第八关嗯页面特征 1.3 步骤 1.4 常用函数 1.5 判断是否字符型 1.6 判断闭合 1.7 查询库名 1.8 查询数据表 1.9 获取字段名 1.10 获取数据 1.11 布尔盲注缺陷 2 时间盲注 2.1 基础知识 2.2 判…

如何设计一个“真正可复用”的前端组件?

🧱 如何设计一个“真正可复用”的前端组件?🔧 一个按钮可以写10次,也可以封装一次复用全场;组件是前端的积木,而设计模式才是组装它们的说明书。你真的在写“可复用”组件吗?🧠 什么…

AlpineLinux安装RabbitMQ及其管理界面

AlpineLinux安装RabbitMQ及其管理界面 本文以 alpine linux 的 3.21版本为例,演示对于 RabbitMQ 在Linux 下的安装,其他发行版本大同小异。主要是包管理软件的命令区别,以及在线仓库提供的 RabbitMQ 版本差异而已。 (一)安装 Erlang 因为 RabbitMQ 是用 Erlang 语言编写…

3S技术+ArcGIS/ENVI全流程实战:水文、气象、灾害、生态、环境及卫生等领域应用

系统梳理3S技术的核心理论与实战应用,涵盖ArcGIS与ENVI软件操作、空间数据管理、地图投影转换、遥感影像解译、DEM地形分析、空间插值建模等关键技能,并结合农业、气象、生态、灾害等跨学科案例,提供从数据获取到高级可视化的完整解决方案。无…

弹窗中el+table,二次打开弹窗,选择列会携带第一次选择的数据

1第一次打开弹窗选择的数据,正确,然后关闭弹窗再次打开弹窗,重新选择,第二次的数据,错误在打开弹窗/关闭弹窗等位置全部做了置空处理,以下是代码:最后的原因是:el-dailog 自带缓存&a…

RocketMQ在Spring Boot中的详细使用指南

📋 目录 🚀 RocketMQ简介 什么是RocketMQ? 核心概念 🏗️ 基础架构组件 📝 重要概念解释 🔧 环境搭建 1. RocketMQ服务端安装 Docker方式(推荐初学者) 手动安装方式 2. 验证安装 🏗️ Spring Boot集成配置 1. 添加依赖 2. 配置文件 application.y…

基于Java+Springboot的医院档案管理系统

源码编号:S597源码名称:基于Springboot的医院档案管理系统用户类型:多角色,用户、医护人员、管理员数据库表数量:11 张表主要技术:Java、Vue、ElementUl 、SpringBoot、Maven运行环境:Windows/M…

Pandas 学习教程

目录 定义 基本操作 一维数组操作 二维数组操作 数据选择过滤 数据处理 数据清洗 数据转换 数据分析 排序 分组聚合 数据透视表 高级操作 合并数据 时间序列处理 自定义函数调用 数据可视化集成 数据导出和导入 大数据分块处理 定义 全称: panel da…

QueryWrapper 类的作用与示例详解

通俗易懂的解释想象一下你去图书馆找书:QueryWrapper 就像是一个智能的图书管理员你告诉管理员你的需求:"我要找计算机类、2020年后出版的、作者是张三的书"管理员会根据你的要求组合查询条件,然后去书库帮你找书在编程中&#xff…

【PyTorch】PyTorch中torch.nn模块的循环层

PyTorch深度学习总结 第九章 PyTorch中torch.nn模块的循环层 文章目录PyTorch深度学习总结前言一、循环层1. 简单循环层(RNN)2. 长短期记忆网络(LSTM)3. 门控循环单元(GRU)4. 双向循环层二、循环层参数1. …

Ubuntu 24.04 LTS 服务器配置:安装 JDK、Nginx、Redis。

Ubuntu 24.04 LTS 服务器配置:安装 JDK、Nginx、Redis。新建用来放置软件安装包的目录 mkdir /home/software 配置目录所有者为 ubuntu 用户: chown ubuntu /home/software将软件安装包上传到 /home/software配置 JDK-8 新建 jdk 安装目录 mkdir /usr/ja…

工作中用到过哪些设计模式?是怎么实现的?

1. 单例模式(结合 Spring Component)场景:配置中心、全局状态管理 Spring 实现:java// 自动注册为Spring Bean(默认单例) Component public class AppConfig {Value("${server.port}")private in…

Leetcode 3609. Minimum Moves to Reach Target in Grid

Leetcode 3609. Minimum Moves to Reach Target in Grid 1. 解题思路2. 代码实现 题目链接:3609. Minimum Moves to Reach Target in Grid 1. 解题思路 这一题我一开始走岔了,走了一个正向遍历走法的思路,无论怎么剪枝都一直超时。后来看了…

工作流引擎:IDEA没有actiBPMN插件怎么办?

文章目录一、问题描述二、替代方案一、问题描述 我们在学习activiti7工作流引擎的时候,需要设计流程图。 一般推荐的就是使用IDEA插件actiBPMN进行开发。 但是,这个插件在IDEA2019后的版本都不在支持。 也就是搜不到 那么,怎么办了&#x…

Android音视频探索之旅 | CMake基础语法 创建支持Ffmpeg的Android项目

一.CMake语法 CMake语法非常多,我们知道如何导入静态库和动态库以及最基础的使用,目前是够用的。其它方面则根据实际项目同步学习。 1.1.基础语法-常用 cmake_minimum_required:指定cmake最小版本include_directories:引入&#x…

React Native 初始化项目和模拟器运行

中文官方文档:https://reactnative.cn/docs/environment-setup 英文官方文档:https://reactnative.dev/docs/getting-started-without-a-framework#step-1-creating-a-new-application 创建新项目 1、初始化 # 如果你之前全局安装过旧的react-native-cli…

20250706-5-Docker 快速入门(上)-创建容器常用选项_笔记

一、创建容器常用选项1. 创建容器常用选项1)常用选项创建容器常用选项交互式选项:-i:保持标准输入打开,允许交互式操作-t:分配伪终端,使容器像传统终端一…

插值与拟合(3):B样条曲线

在路径规划问题中,通常会用到B样条来平滑路径,本文实现并封装了三次准均匀开放B样条曲线,供大学学习使用。作者提供了三套代码方案。可以用于不同平台:方案1:MATLAB;方案2:标准C;方案…

[免费]基于Python豆瓣电影数据分析及可视化系统(Flask+echarts+pandas)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的于Python豆瓣电影数据分析及可视化系统(Flaskechartpandas)【论文源码SQL脚本】,分享下哈。项目介绍随着如今电影越来越多,各种各样的烂片和捞钱的商业片也层出不穷,而有意…

SQL127 月总刷题数和日均刷题数

SQL127 月总刷题数和日均刷题数 withtemp as (selectDATE_FORMAT(submit_time, "%Y%m") as submit_month,count(question_id) as month_q_cnt,round(count(question_id) / day(last_day(max(submit_time))),3) as avg_day_q_cntfrompractice_recordwhereyear(submit…