【CSS in Depth 2 精译_025】4.3 弹性布局的方向

news2024/9/17 4:11:22

当前内容所在位置(可进入专栏查看其他译好的章节内容)

  • 第一章 层叠、优先级与继承(已完结)
    • 1.1 层叠
    • 1.2 继承
    • 1.3 特殊值
    • 1.4 简写属性
    • 1.5 CSS 渐进式增强技术
    • 1.6 本章小结
  • 第二章 相对单位(已完结)
    • 2.1 相对单位的威力
    • 2.2 em 与 rem
    • 2.3 告别像素思维
    • 2.4 视口的相对单位
    • 2.5 无单位的数值与行高
    • 2.6 自定义属性
    • 2.7 本章小结
  • 第三章 文档流与盒模型(已完结)
    • 3.1 常规文档流
    • 3.2 盒模型
    • 3.3 元素的高度
    • 3.4 负的外边距
    • 3.5 外边距折叠
    • 3.6 容器内的元素间距问题
    • 3.7 本章小结
  • 第四章 Flexbox 布局
    • 4.1 Flexbox 布局原理(已完结)
      • 4.1.1 创建一个基础的 Flexbox 菜单
      • 4.1.2 添加内边距与间隔
    • 4.2 弹性子元素的大小(已完结)
      • 4.2.1 使用 flex-basis 属性
      • 4.2.2 使用 flex-grow 属性
      • 4.2.3 使用 flex-shrink 属性
      • 4.2.4 实际应用
    • 4.3 弹性布局的方向 ✔️
      • 4.3.1 变更弹性布局的方向 ✔️
      • 4.3.2 登录表单的样式设计 ✔️
    • 4.4 对齐、间距等细节处理(精译中 ⏳)

文章目录

    • 4.3 弹性布局的方向
      • 4.3.1 变更弹性布局的方向
      • 4.3.2 登录表单的样式设计

4.3 弹性布局的方向

Flexbox 的另一重要功能是切换主轴与副轴的方向,通过弹性容器上的 flex-direction 属性进行控制。该属性的初始值(row)规定子元素从左至右排列,一如前面演示的案例效果。若改为 flex-direction: column,则沿垂直方向从上到下排列。此外,属性值还支持 row-reverse 从右到左排列,以及 column-reverse 从下到上排列(如图 4.14 所示)。

图 4.14 改变 flex-direction 就改变了主轴的方向,与之垂直的副轴方向也会随之改变

图 4.14 改变 flex-direction 就改变了主轴的方向,与之垂直的副轴方向也会随之改变

本节将在示例页靠右的侧边栏演示该属性的用法,让两个子板块产生纵向堆叠效果。这貌似有些画蛇添足,毕竟它们已经竖直排列好了,块级元素也理应如此。但这样的页面布局存在一个极为隐蔽的漏洞,仅在左边的正文板块包含更多内容时才会显现,如图 4.15 所示。

只要给正文区 column-main 列添加一些标题及段落内容,就会发现主板块的高度超过了右边的侧边栏。按理来说 Flexbox 是可以让两列高度相等的,这里怎么不生效了呢?

图 4.15 主板块延伸到了右侧板块总高度外围(虚线标出了 column-sidebar 的大小)

图 4.15 主板块延伸到了右侧板块总高度外围(虚线标出了 column-sidebar 的大小)

如图 4.15(注意标注的虚线框)所示,左右两个弹性子元素确实是等高的。问题在于右侧子元素中的两个子板块没能填满整个侧边栏区域。

理想的布局效果应如图 4.16 所示。即使左侧内容区更长,右侧的两个子板块也会自动延展开来,填满整个侧边栏。在 Flexbox 出现以前,纯靠 CSS 几乎是无法实现的(需要略微借助 JavaScript 才行)

图 4.16 目标布局效果:右边栏的板块与左边的大板块对齐

图 4.16 目标布局效果:右边栏的板块与左边的大板块对齐。

4.3.1 变更弹性布局的方向

要让两个子板块延展到填满整个容器的高,就得把右边栏(column-sidebar)改为弹性容器,并设置 flex-direction: column;再给其中的两个子板块的 flex-grow 都赋上一个非零的属性值。如代码清单 4.9 所示,将以下样式更新到本地样式表。

代码清单 4.9 在右侧创建一个弹性布局列

.column-sidebar { 
  /* 对外部弹性盒而言是弹性子元素,对内部元素而言则是弹性容器 */
  flex: 1;
  display: flex;          
  flex-direction: column; 
  gap: var(--gap-size);   
}

.column-sidebar > .tile {
  /* 给侧边栏内部的弹性子元素一个非零的 flex-grow 值 */
  flex: 1;
}

至此就创建了一个嵌套的弹性盒子。元素 <div class="column-sidebar"> 既是外层弹性盒子的弹性子元素,又是内部两个子板块的弹性容器。其整体结构如下所示(简洁起见,文本内容已省略):

<main class="flex">
  <div class="column-main tile">
    ...
  </div>
  <div class="column-sidebar">
    <div class="tile">...</div>
    <div class="tile">...</div>
  </div>
</div>

这个内部的弹性盒子,其弹性布局的方向为 column,主轴方向由此转为从上到下(副轴方向则变为从左到右)。也就是说,此时 flex-basisflex-grow 以及 flex-shrink 属性仅对其弹性子元素的高度生效,而非宽度。由于子元素设置了 flex: 1, 它们的高度在必要时会延展到填满整个容器。无论左右两栏的高矮,此时主板块的底边都会和右边第二个小板块的底边始终对齐。

水平弹性盒子的大部分概念对于垂直方向(columncolumn-reverse)同样适用,但有个 关键区别 务必牢记:在 CSS 中高度的处理方式与宽度存在本质上的不同。弹性容器会 100% 填满可用宽度,而高度则始终由自身的内容决定。即便改变主轴方向,也不会改变这个本质特征。

弹性容器的高度则由弹性子元素决定,它们会正好填满容器。在纵向 Flexbox 布局中,子元素的 flex-growflex-shrink 属性不会起作用,除非有其他因素强行改变弹性容器的高度。本例中的“其他因素”就是外层弹性容器衍生过来的高度。

4.3.2 登录表单的样式设计

页面的整体布局告一段落,剩下的工作是给右侧两个子板块中更小的内容元素设计样式,即登录表单和注册链接部分。登录表单就不用弹性盒布局了,但为了演示的完整性再简要过一遍。最终设计好的表单效果如图 4.17 所示。

图 4.17 登录表单的最终效果

图 4.17 登录表单的最终效果

<form> 的样式类 login-form 为 CSS 选择器,分别对登录表单中的标题、输入框及按钮三个部分进行样式设计,并根据代码清单 4.10 更新到示例页面。

代码清单 4.10 登录表单的样式设计

/* 标题设为加粗、右对齐、全大写 */
.login-form h3 {
  margin: 0;
  font-size: 0.9em;
  font-weight: bold;
  text-align: end;
  text-transform: uppercase;
}

/* 仅为文本类型的输入框(不包含复选框与单选按钮)设置样式 */
.login-form input:not([type=checkbox]):not([type=radio]) {
  display: block;
  inline-size: 100%;
}

/* 按钮的样式 */
.login-form button {
  margin-block-start: 1em;
  border: 1px solid #cc6b5a;
  background-color: white;
  padding: 0.5em 1em;
  cursor: pointer;
}

先来看标题,用的都是熟悉的字体属性。text-align 用于文字右对齐,text-transform 则用于设置文字大写。注意观察,示例 HTML 里的内容并没有写成大写形式。当字母大写仅仅视为一种样式时,正常的做法是在 HTML 中按照标准的语法规则书写,再用 CSS 转成大写。这样今后无需重新输入 HTML 中的文字就能控制大小写。

第二组规则集处理的是输入框。这里的选择器比较特殊,主要是因为 <input> 元素很特殊。<input> 元素既可以输入文本和密码,也可以输入很多类似的 HTML5 数据,如数字、电子邮箱及日期;此外还能记录看上去截然不同的表单项数据,比如单选按钮和复选框的选中结果。

示例中 :not() 伪类选择器与属性选择器 [type=checkbox][type=radio] 组合起来的写法(详见附录 A),可以选中除复选框和单选按钮以外的所有 <input> 元素。这是一个黑名单方式:把不想选中的元素剔除掉。也可以采用白名单方式:将想要选中的所有 <input> 元素类型通过属性选择器一一罗列,但这样写起来就会显得十分冗长。

注意

尽管示例表单只出现了文本和密码输入框,但演示的重点在于,该 CSS 样式可能影响到后续其他的 HTML 标记,需要尽量予以兼顾。

在这组规则集中,输入框加上了 display: block 的样式,令其独占一行,同时将宽度设为 100%。通常情况下,块级元素会自动填满可用宽度,但 <input> 比较特殊,其宽度由 size 属性决定。该属性表示输入框在不出现滚动条的情况下大致能够容纳的字符数。若不指定 size 的值,则会赋一个默认值。也可以用 CSS 的 widthinline-size 属性强制设置一个宽度。

第三组规则集处理的是登录按钮。这些样式大多很简单,只有 cursor 属性可能相对陌生。它控制的是鼠标指针悬停在元素上方时的外观效果。其值为 pointer 时,鼠标指针会变成一个具有指示效果的手型,鼠标悬停到链接元素时的默认效果就是这个形状。它告诉用户该元素是可以点击的,这一细节处理可以让按钮样式更加完美。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NISP 一级 | 2.3 身份认证

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;身份认证基本方法 身份认证是用户登录系统或网站面对的第一道安全防线&#xff0c;如输入账号口令来登录。身份认证是在网络中确认操作者身份的过程。身份认证一般依据以下三种情…

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html Thread Index和Thread ID之间有什么关系呢&#xff1f;&#xff08;线程架构参考这里&#xff1a;CUDA C Programming Guide (nvidia.com)open in new window&#xff09; 1维的Thread Index&am…

ORCAD出BOM--位号在同一个Excel格子里

所有相同属性的器件都在同一个格子里 Tools\ Bill of Materials, 注意勾选Open in excel. 勾选Open in excel, 所有相同属性的器件都在同一个格子里 不勾选Open in excel, 5个相同属性的器件都在同一个格子里

代码随想录Day 39|打家劫舍问题,leetcode题目:198.打家劫舍、213.打家劫舍Ⅱ、337.打家劫舍Ⅲ

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一&#xff1a;198.打家劫舍解题思路&#xff1a; 题目二&#xff1a;213.打家劫舍II解题思路&#xff1a; 题目三&#xff1a; 337.打家劫舍 III解题思路暴力递归记忆化递推动态规划 总结…

Linux基础2-权限2(操作权限,粘滞位,umask,目录文件的rwx权限)

上篇内容&#xff1a;Linux基础2-权限1(用户&#xff0c;权限是什么&#xff1f;)-CSDN博客 目录 一. 权限的操作&#xff08;命令&#xff09; 1.1 chmod 1.2 chown 1.3 chgrp 二. 粘滞位 三. umask&#xff08;遮掩码&#xff09; 四. 目录文件的 r w x 权限 一. 权限…

数据库的操作:SQL语言的介绍

一.前言 SQL是一种结构化查询语言。关系型数据库中进行操作的标准语言。 二.特点 ①对大小写不敏感 例如&#xff1a;select与Select是一样的 ②结尾要使用分号 没有分号认为还没结束; 三.分类 ①DDL&#xff1a;数据定义语言&#xff08;数据库对象的操作&#xff08;结…

服务器重装系统,数据备份 容器备份

文章目录 1.前言2.docker备份2.1 容器备份2.2 镜像备份2.3 数据卷备份 3.docker安装4.jdk安装5.导入镜像6.导入容器 本文档只是为了留档方便以后工作运维&#xff0c;或者给同事分享文档内容比较简陋命令也不是特别全&#xff0c;不适合小白观看&#xff0c;如有不懂可以私信&a…

【最新华为OD机试E卷-支持在线评测】计算疫情扩散时间(200分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

DDComponentForAndroid:探索Android组件化方案

在现代Android应用开发中&#xff0c;随着应用规模的不断扩大&#xff0c;传统的单体应用架构已经无法满足快速迭代和维护的需求。组件化架构作为一种解决方案&#xff0c;可以将应用拆分成多个独立的模块&#xff0c;每个模块负责特定的功能&#xff0c;从而提高代码的可维护性…

2.ChatGPT的发展历程:从GPT-1到GPT-4(2/10)

引言 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;是连接人类与机器的重要桥梁。随着技术的不断进步&#xff0c;我们见证了从简单的文本分析到复杂的语言理解的转变。ChatGPT&#xff0c;作为自然语言处理领域的一个里程碑&#xff0c;其发展历程不仅…

【C/C++】C++程序设计基础(继承与派生、多态性)

目录 八、继承与派生8.1 派生类的引入与特性8.2 单继承8.3 同名成员的访问方式8.4 赋值兼容规则8.5 单继承的构造与析构8.6 多继承 九、多态性9.1 运算符重载9.2 虚函数9.3 纯虚函数与抽象类 八、继承与派生 8.1 派生类的引入与特性 -继承:一旦指定了某种事物父代的本质特征&a…

线程相关内容

线程 一、介绍二、thread库1、构造函数&#xff08;1&#xff09;函数&#xff08;2&#xff09;说明&#xff08;3&#xff09;注意 2、join函数3、detach4、joinable函数5、get_id函数 三、mutex的种类1、mutex&#xff08;1&#xff09;介绍&#xff08;2&#xff09;lock&a…

vant UI之van-tab如何实现标题两行显示

前言&#xff1a; 相必大家在开发移动端或者小程序时都会见到如下设计稿 这个时候大家基本上都会想到使用vant UI 的van-tab组件&#xff0c;如果实现不了那就自己封装一个tab组件这样的情况。 其实使用van-tab是可以实现的&#xff0c;不过要借助van-tab的一系列api和css&…

数据结构(2):LinkedList和链表[1]

下面我们来介绍一种新的数据结构&#xff0c;链表。 我们曾经讨论过顺序表。它的数据存储在物理和逻辑上都是有逻辑的。而我们今天要学习的链表&#xff0c;则在物理结构上非连续存储&#xff0c;逻辑上连续。 1.链表的认识 链表由一个一个的节点组成。 我们可以想象一列火…

乐鑫安全制造全流程

主要参考资料&#xff1a; 【乐鑫全球开发者大会】DevCon24 #10 &#xff5c;乐鑫安全制造全流程 乐鑫官方文档Flash加密: https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/security/flash-encryption.html 【ESP32S3】使用 Flash 下载工具完成 Flash 加密功能…

C++ | Leetcode C++题解之第394题字符串解码

题目&#xff1a; 题解&#xff1a; class Solution { public:string src; size_t ptr;int getDigits() {int ret 0;while (ptr < src.size() && isdigit(src[ptr])) {ret ret * 10 src[ptr] - 0;}return ret;}string getString() {if (ptr src.size() || src[…

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目&#xff1a; 题解&#xff1a; static const int MASK1 1 << 7; static const int MASK2 (1 << 7) (1 << 6);bool isValid(int num) {return (num & MASK2) MASK1; }int getBytes(int num) {if ((num & MASK1) 0) {return 1;}int n 0;in…

windows电脑自动倒计时关机

今天聊一聊其他的。我时不时的有一个需求&#xff0c;是关于在windows电脑上定时关机。 不知道怎么地&#xff0c;我好几次都忘了这个自动定时关机的终端命令&#xff0c;于是每一次都要去网上查。 1.鼠标右击【开始菜单】选择【运行】或在键盘上按【 WinR】快捷键打开运行窗口…

【变化检测】基于STANet建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下&#xff1a; 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、STANet模型训练与预测 4、Onnx运行及可视化 运行环境&#xff1a;Python3.8&#xff0c;torch1.12.0cu113 likyoo变化检测源码&#xff1a;https://github.com/likyoo/open-cd 使用情况&#xff1a…

力扣周赛:第414场周赛

&#x1f468;‍&#x1f393;作者简介&#xff1a;爱好技术和算法的研究生 &#x1f30c;上期文章&#xff1a;[首期文章] &#x1f4da;订阅专栏&#xff1a;力扣周赛 希望文章对你们有所帮助 本科打ACM所以用的都是C&#xff0c;未来走的是Java&#xff0c;所以现在敲算法还…