CSS躬行记(11)——管理后台响应式改造
为了提升业务人员操作管理后台的体验,花了点时间进行响应式的改造,紧急情况时,掏出手机就能工作。
利用CSS3的媒体查询,就能根据不同屏幕的尺寸采用不同的样式来渲染,目前使用的移动端屏幕阈值为750px。
为了便于管理,基于Less的语法,声明了一个常量,专门记录屏幕尺寸。
@mobile-screen: ~"(max-width:750px)";
我们当前使用的管理后台基于UmiJS3.X和Ant Design 3.X。
一、结构改造
首先是管理后台整体结构的改造,包括左边的菜单栏,右边的快捷按钮,登录信息等。

1)菜单栏
左边的菜单在手机界面还是蛮占地方的,默认情况下需要将其隐藏,还有那张Logo图,也需要隐藏,最大限度的将区域留给菜单。
在下面的代码中,当URL的路径发生变化时,判断屏幕尺寸,如果当前是显示状态,那么就更新成隐藏状态。
// 响应式处理
const mobileHandle = () => {
// 屏幕尺寸小于750的就认为是移动设备的屏幕
if (window.screen.width <= 750 && !siderFold) {
dispatch({
type: "app/switchSider"
});
}
};
// 当路径变化时,隐藏菜单栏
useEffect(() => {
mobileHandle();
}, [location.pathname]);
在Chrome的控制台,切换成手机屏幕时,右半部分会出现挤压的问题。

可以将右半部分设置为绝对定位,脱离正常流,再向左偏移菜单栏的宽度就能避免内容被挤压。
.main {
width: 100%;
position: absolute;
left: 250px;
}
2)快捷按钮
快捷按钮有3个,PC界面这块的高度是固定的,并且是横向布局。移动端的屏幕比较窄,更适合纵向布局。
并且为了节约空间,登录后的昵称,也隐藏了,免得破坏布局。

3)全局样式
这些按钮默认是没有上下间距的,需要手动添加,例如修改Ant Design 的下拉框、搜索框、日期选择框的下边距,存储在 global.css 文件中。
.ant-select,
.ant-input-search,
.ant-calendar-picker {
margin-bottom: 5px;
}
有一点需要注意,不能将上述这些样式写在 less 文件内,因为在JavaScript文件中引用(CSS in JS)时,默认会带各种随机后缀。
@media @mobile-screen {
.ant-select, .ant-input-search {
margin-bottom: 5px;
}
}
/* 编译结果 */
@media (max-width: 750px) {
.ant-select___1JpXW,
.ant-input-search___WeNgK {
margin-bottom: 5px;
}
}
全局声明需要权衡,当涉及的页面很多时,也许某条样式会破坏某处的结构。
二、页面改造
在页面中使用了大量的组件,包括自定义和第三方的,默认情况下,都不支持响应式,需要进行手动改造。
1)表格
管理后台包含很多表格,这些表格都会包含很多列,直接平铺会将页面撑开,出现左右滚动条。
在观察Ant Design表格滚动的源码后,发现了一个 max-content 关键字,表示宽度就是内容的长度。
.ant-table-body, /* 表格 */
.ant-tabs-tabpane { /* 标签栏切换内容 */
overflow-x: scroll;
width: 100%;
-webkit-overflow-scrolling: touch;
}
.ant-table-body table,
.ant-tabs-tabpane table {
width: max-content;
}
在表格的父级元素中声明横向滚动,就能避免布局被破坏了。

2)内联样式
在之前的页面开发中,很多组件的宽度都是以内联的方式声明的。当时的确很方便,但是现在改造给我制造了障碍。
如果直接在CSS文件中声明,那么特殊性不会比内联的高,也就不会生效,所以得用另一种方式。
后面就想用脚本来做样式的更新,脚本比较好写。但是需要考虑一种情况。
那就是页面初始化时不存在的DOM元素,需要点击或其他交互后才能被添加进来。
需要监听DOM的变化,自然就想到了MutationObserver,在下面的代码中会监听 body 元素的直系后代的DOM变化。
useEffect(() => {
const isMobile = window.screen.width <= 750;
// 选择器,数字框,文本框,卡片
const selector = ".ant-input-number[style],.ant-input[style],.ant-calendar-picker[style],.ant-card[style],.ant-input[style]";
if (!isMobile) return;
const callback = function (mutationsList, observer) {
// 为了响应式,将style中的宽度修改成 100%
const nodes = document.querySelectorAll(selector);
[...nodes].forEach((item) => {
if (item.style.width && item.style.width != "100%") {
item.style.width = "100%";
}
});
};
// 观察器的配置,直接子节点的更改
const config = { childList: true };
const observer = new MutationObserver(callback);
// 观察目标节点
observer.observe(document.body, config);
}, []);
3)弹框
在PC界面中,弹框中的内容会比较多,高度也会被撑开。
当在移动端显示时,会超过屏幕的底部,无法看到弹框中的内容。
可以手动的声明弹框的高度,利用calc()函数,以及vh单位,100vh就是视口高度的100%。
height: calc(100vh - 100px)
CSS躬行记(11)——管理后台响应式改造的更多相关文章
- CSS躬行记(1)——CSS基础拾遗
一.box-decoration-break CSS3新增的box-decoration-break属性可指定行内非替换元素在跨行.跨列或跨页时的样式渲染,它包含两个值: (1)slice:默认值,盒 ...
- CSS躬行记(2)——伪类和伪元素
一.伪类选择器 伪选择器弥补了常规选择器的不足,能够实现一些特殊情况下的样式,例如在鼠标悬停时或只给字符串中的第一个字符指定样式.与类选择器类似,可以从HTML元素的class属性中查看到,但伪选择器 ...
- CSS躬行记(6)——滤镜
滤镜(filter)可改造元素的视觉呈现,CSS内置的滤镜有10种,通过SVG文件还能自定义滤镜. 一.调色滤镜 调色滤镜可控制元素的模糊.颜色.亮度等变化,并且多个滤镜可组合在一起使用.这些滤镜大部 ...
- CSS躬行记(7)——合成
在图形编辑软件中,可以按特定地方式处理不同图层的合成,最新的CSS规范也引入了该功能,并提供了mix-blend-mode和background-blend-mode两个属性.混合模式(blendin ...
- CSS躬行记(8)——裁剪和遮罩
一. 裁剪 裁剪(clipping)能让元素显示指定形状的区域,在布局时可起点缀的作用,丰富了视觉呈现.注意,裁剪本质上只是让元素的部分区域透明,由此可知,裁剪完后元素所占的空间仍旧会保留.裁剪最早是 ...
- CSS躬行记(9)——网格布局
网格布局(Grid Layout)也叫栅格布局,与表格布局类似,也依赖行和列.但与之不同的是,网格布局能直接控制HTML文档中元素的顺序.位置和大小等,而不用再借助辅助元素. 一.术语 下图展示了CS ...
- CSS躬行记(3)——CSS属性拾遗
一.粘滞定位 粘滞定位(sticky)与相对定位类似,既不会脱离正常流,也不会改变元素盒类型,并且会保留原先所占的空间.它会相对于包含块偏移,它的包含块分为两种,第一种和绝对定位一样:第二种是最近的滚 ...
- CSS躬行记(4)——浮动形状
CSS规范新增了一个模块:CSS Shapes,shape-outside属性属于该模块,它能影响浮动元素周边内容流的形状(即浮动形状),可接收三类值:形状盒子.函数和图像. 一.形状盒子 形状盒子( ...
- CSS躬行记(10)——CSS方法论
方法论是一个哲学术语,会对一系列具体的方法进行分析研究.系统总结并最终提出较为一般性的原则.CSS方法论是一种面向CSS.由个人和组织设计.已被诸多项目检验且公认有效的最佳实践.这些方法论都会涉及结构 ...
随机推荐
- JVM内存模型小结
JVM运行时的数据区域划分图如下,该图是JVM内存模型最主要的内容. 从图中可以看出来,JVM将内存主要划分为五个部分:程序计数器.Java虚拟机栈.本地方法栈.Java堆和方法区.这些被划分为用途不 ...
- Django用mongoengine操作mongodb
最近在写Django项目,使用的是mongodb,虽然Django不支持NoSQL,但是mongoengine可以帮助我们像ORM一样在Django项目中去操作mongodb 推荐一个可视化工具 R ...
- 学习Docker(二)
一.Docker快速入门 Docker 改变了什么? 1.简化配置 2.流水线管理 3.应用隔离 4.提高开发效率 5.快速部署 6.面向产品:产品交付 7.面向开发:简化环境配置 8.面向测试:多版 ...
- django-debug-toolbar 开发利器的使用教程
django-debug-toolbar介绍 django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息. 下载安装 ...
- 玩转 React(四)- 创造一个新的 HTML 标签
在第二篇文章 <新型前端开发方式> 中有说到 React 有很爽的一点就是给我们一种创造 HTML 标签的能力,那么今天这篇文章就详细讲解下 React 是如何提供这种能力的,作为前端开发 ...
- 无需Flash录视频——HTML5中级进阶
前言 HTML5的权限越来越大了,浏览器可以直接调用摄像头.麦克风了,好激动啊.我们要用纯洁的HTML代码造出自己的天地. 视频采集 本篇介绍的栗子 都是在chrome 47 版本以上的,低版本的可能 ...
- 视频Video放器的部分实例方法
***创建一个视频播放器实例 let myPlayer = this.$video(myVideo, { controls: true, autoplay: 'muted', preload: &qu ...
- Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found 解决办法
问题 每次vs重启都提示安装证书,即使执行dotnet dev-certs https --clean,dotnet dev-certs https -t然后重启vs也不行. 环境 win10, vs ...
- 接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理)
接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理) 1.抽象类 以下说辞可能不太准确,但是会让你醍醐灌顶 抽象类是把一些具有共同属性(包括行为)的东西抽象出来,比如: 小狗有身高,体重,颜 ...
- DTO数据传输对象详解
文章目录 一.DTO是什么? 二.DTO解决的问题 三.代码演示 一.DTO是什么? DTO (数据传输对象) 数据传输对象(DTO),是一种设计模式之间传输数据的软件应用系统.数据传输目标往往是数据 ...