2025-01-20 15:56:38
本指南完整解释了弹性盒子(Flexible Box)的所有内容,重点介绍了父元素(弹性容器)和子元素(弹性项目)的所有不同可能属性。
提示
快速参考手册经常参考本指南?这里有一张你可以打印的高分辨率图像!免费下载。
Flex 布局(弹性盒子)模块(截至 2017 年 10 月为 W3C 候选推荐)旨在提供一种更有效的方法来布局、对齐和分配容器中项目之间的空间,即使它们的大小未知和/或动态(因此有“弹性(flex)”一词)。
Flex 布局的主要思想是赋予容器调整其项目宽度/高度(和顺序)的能力,以最佳填充可用空间(主要是适应各种显示设备和屏幕尺寸)。一个弹性容器会扩展项目以填充可用的空闲空间,或缩小它们以防止溢出。
最重要的是,Flex 布局是方向无关的,与常规布局(块布局是基于垂直的,而行内布局是基于水平的)相比。虽然这些布局在页面上工作良好,但它们缺乏灵活性(不带双关意味)来支持大型或复杂的应用程序(特别是在方向变化、调整大小、拉伸、收缩等方面)。
注意
Flex 布局最适合应用程序的组件和小规模布局,而 网格布局(Grid) 则用于更大规模的布局。
由于 flexbox 是一个整体模块,而不是单个属性,因此它涉及很多内容,包括其整个属性集。其中一些属性应设置在容器(父元素,称为“弹性容器”)上,而其他属性应设置在子元素(称为“弹性项目”)上。
如果“常规”布局基于块和内联流方向,则弹性布局基于“弹性流方向”。请看规范中的这张图,它解释了弹性布局背后的主要思想。
项目将按照主轴(main axis)或横轴(cross axis)进行布局。
flex-direction
(见下文)。width
或 height
属性。width
或 height
属性。这定义了一个弹性容器;根据给定的值,可以是内联或块级。这为其所有直接子元素启用弹性上下文。
|
|
请注意,CSS 列对弹性容器没有影响。
这建立了主轴,从而定义了弹性项目在弹性容器中放置的方向。Flexbox 是一个单向布局概念(除了可选的换行)。将弹性项目主要视为在水平行或垂直列中布局。
|
|
row
(默认):在 ltr
中从左到右;在 rtl
中从右到左row-reverse
:在 ltr
中从右到左;在 rtl
中从左到右column
:与 row
相同,但从上到下column-reverse
:与 row-reverse
相同,但从下到上默认情况下,所有弹性项目都将尝试适应一行。你可以更改此属性并允许项目根据需要换行。
|
|
nowrap
(默认):所有弹性项目都在一行上。wrap
:弹性项目将换行到多行,从上到下。wrap-reverse
:弹性项目将从下到上换行到多行。这是 flex-direction
和 flex-wrap
属性的简写,它们共同定义了弹性容器的主轴和横轴。默认值是 row nowrap
。
|
|
这定义了沿主轴的对齐方式。它有助于分配当所有弹性项目在一行上都不可调整大小或可调整大小但已达到最大尺寸时剩余的额外空间。它还对项目溢出行时的对齐方式施加了一些控制。
|
|
flex-start
(默认):项目向弹性方向的起点对齐。flex-end
:项目向弹性方向的终点对齐。start
:项目向 writing-mode
方向的起点对齐。end
:项目向 writing-mode
方向的终点对齐。left
:项目向容器的左边缘对齐,除非这与 flex-direction
不符,则表现为 start
。right
:项目向容器的右边缘对齐,除非这与 flex-direction
不符,则表现为 end
。center
:项目在行中居中对齐space-between
:项目在行中均匀分布;第一个项目在起始线,最后一个项目在终止线space-around
:项目在行中均匀分布,周围有相等的空间。请注意,视觉上这些空间并不相等,因为所有项目在两侧都有相等的空间。第一个项目在容器边缘有一个单位的空间,但下一个项目之间有两个单位的空间,因为下一个项目有自己的间距。space-evenly
:项目分布,使得任何两个项目之间的间距(以及到边缘的空间)相等。请注意,这些值的浏览器支持是有差异的。例如,某些版本的 Edge 从未支持 space-between
,而 start/end/left/right 尚未在 Chrome 中实现。MDN 有详细的图表。最安全的值是 flex-start
、flex-end
和 center
。
还有两个附加关键字可以与这些值配对:safe
和 unsafe
。使用 safe
确保无论你如何进行这种类型的定位,都不会将元素推到屏幕外(例如,推到顶部)以至于内容无法滚动到(称为“数据丢失”)。
这定义了当前行上弹性项目沿横轴的默认布局行为。可以将其视为横轴(垂直于主轴)的 justify-content
版本。
|
|
stretch
(默认):拉伸以填充容器(仍然遵守最小宽度/最大宽度)flex-start
/ start
/ self-start
:项目放置在横轴的起点。这些之间的区别很微妙,主要是关于遵守 flex-direction
规则或 writing-mode
规则。flex-end
/ end
/ self-end
:项目放置在横轴的终点。区别再次很微妙,主要是关于遵守 flex-direction
规则与 writing-mode
规则。center
:项目在横轴上居中对齐baseline
:项目对齐,使它们的基线对齐safe
和 unsafe
修饰符关键字可以与所有这些关键字结合使用(尽管请注意浏览器支持),并帮助你防止对齐元素使内容变得不可访问。
这在横轴上有额外空间时对齐弹性容器的行,类似于 justify-content
在主轴上对齐单个项目。
警告
此属性仅在多行弹性容器上生效,其中 flex-wrap
设置为 wrap
或 wrap-reverse
。单行弹性容器(即 flex-wrap
设置为其默认值 no-wrap
)将不反映 align-content
。
|
|
normal
(默认):项目按默认位置打包,仿佛未设置任何值。flex-start
/ start
:项目打包到容器的起点。(更多支持的)flex-start
遵守 flex-direction
,而 start
遵守 writing-mode
方向。flex-end
/ end
:项目打包到容器的终点。(更多支持的)flex-end
遵守 flex-direction
,而 end
遵守 writing-mode
方向。center
:项目在容器中居中对齐space-between
:项目均匀分布;第一行在容器的起点,最后一行在终点space-around
:项目均匀分布,每行周围有相等的空间space-evenly
:项目均匀分布,周围有相等的空间stretch
:行拉伸以占据剩余空间safe
和 unsafe
修饰符关键字可以与所有这些关键字结合使用(尽管请注意浏览器支持),并帮助你防止对齐元素使内容变得不可访问。
gap
属性明确控制弹性项目之间的空间。它仅在项目之间应用间距,而不是在外边缘。
|
|
这种行为可以被认为是最小的间隙,如果间隙更大(由于类似 justify-content: space-between;
的原因),则间隙仅在该空间变小的情况下生效。
它不仅适用于 flexbox,gap
也适用于网格和多列布局。
默认情况下,弹性项目按源顺序布局。但是,order
属性控制它们在弹性容器中出现的顺序。
|
|
具有相同顺序的项目恢复为源顺序。
这定义了弹性项目在必要时增长的能力。它接受一个无单位的值,作为比例。它决定了弹性容器内可用空间的多少应该由该项目占据。
如果所有项目的 flex-grow
设置为 1,则容器中的剩余空间将平均分配给所有子元素。如果其中一个子元素的值为 2,则剩余空间将占据其他元素的两倍(或至少尝试这样做)。
|
|
负数无效。
这定义了弹性项目在必要时收缩的能力。
|
|
负数无效。
这定义了在分配剩余空间之前元素的默认大小。它可以是一个长度(例如 20%、5rem 等)或一个关键字。auto
关键字表示“查看我的宽度或高度属性”(这曾经由 main-size
关键字暂时完成,直到被弃用)。content
关键字表示“根据项目的内容调整大小”——这个关键字尚未得到很好的支持,因此很难测试,也很难知道它的兄弟 max-content
、min-content
和 fit-content
的作用。
|
|
如果设置为 0
,则不考虑内容周围的额外空间。如果设置为 auto
,则根据其 flex-grow
值分配额外空间。请参见此图。
这是 flex-grow
、flex-shrink
和 flex-basis
的简写。第二个和第三个参数(flex-shrink
和 flex-basis
)是可选的。默认值是 0 1 auto
,但如果你使用单个数字值设置它,例如 flex: 5;
,则会将 flex-basis
更改为 0%,因此它类似于设置 flex-grow: 5; flex-shrink: 1; flex-basis: 0%;
。
|
|
建议你使用此简写属性,而不是单独设置各个属性。简写智能地设置其他值。
这允许覆盖单个弹性项目的默认对齐方式(或由 align-items
指定的对齐方式)。
请参阅 align-items
解释以了解可用值。
|
|
请注意,floa
t、clear
和 vertical-align
对弹性项目没有影响。
我们可以使用 Sass@mixin
来帮助处理一些浏览器前缀问题。
|
|
本文内容翻译自 Chris Coyier 的 A Complete Guide to Flexbox,感谢原作者的辛勤付出。
除此之外,你还可以通过一些小游戏来学习 Flexbox:
这篇文章的翻译早就想做了,但是一直没有时间,拖了一年,今天终于抽出时间来完成了。
2025-01-14 17:10:09
This is a GitHub Action to generate a list of all hugo-fixit theme components.
You can reference different stable versions of this action. For more information, see Versioning in the GitHub Actions toolkit.
To include the action in a workflow in another repository, you can use the
uses
syntax with the @
symbol to reference a specific branch, tag, or commit
hash.
Star this repository 😉
Go to your repository
Add the following section to your README.md file, you can give whatever
title you want. Just make sure that you use
<!-- HUGO_FIXIT_COMPONENTS:START --><!-- HUGO_FIXIT_COMPONENTS:END -->
in
your readme. The workflow will replace this comment with the actual blog post
list:
|
|
Create a folder named .github
and create a workflows
folder inside it, if
it doesn’t exist.
Create a new file named fixit-component-list.yml
with the following
contents inside the workflows folder:
|
|
Go to repository settings, Click on Actions > General. Update the “Workflow permissions” to “Read and write permissions”. Click on save.
Wait for it to run automatically, or you can also trigger it manually to see the result instantly.
Name | Description | Default |
---|---|---|
comment_tag_name |
The tag name to look for in the readme file | HUGO_FIXIT_COMPONENTS |
readme_path |
Comma separated paths of the readme files you want to update | ./README.md |
exclude_repos |
Comma separated list of repos to exclude from the list | |
template |
Template to use while creating the list of hugo-fixit theme components. It can contain {$repo.name} etc. as variables | - [{$repo.name}]({$repo.html_url}): {$repo.description} |
Name | Description |
---|---|
repos |
The list of hugo-fixit theme components repos that were updated. |
Insert the following code block in your Markdown file to display the list of hugo-fixit components.
|
|
The list of hugo-fixit components will be displayed here.
2025-01-08 17:20:48
一个带有 asciinema-embed
shortcode 的 Hugo 主题组件。
适用于所有 Hugo 主题。
安装方式与 安装主题 相同,有多种安装方式,任选一种即可,这里介绍两种主流方式。
首先确保你的项目本身是一个 Hugo 模块。
然后将此主题组件添加到你的 hugo.toml
配置文件中:
|
|
在 Hugo 的第一次启动时,它将下载所需的文件。
要更新到模块的最新版本,请运行:
|
|
将 FixIt 和此 git 存储库克隆到你的主题文件夹中,并将其作为网站目录的子模块添加。
|
|
接下来编辑项目的 hugo.toml
并将此主题组件添加到你的主题中:
|
|
你可以使用 asciinema
命令记录终端并将其上传到 asciinema.org。
|
|
以下是一个使用示例:
|
|
呈现效果如下:
2024-12-06 10:32:22
在这篇文章中,我们将探讨如何使用 CSS 获取视口尺寸,并展示一个简单的实现示例。
调整浏览器窗口大小,你会发现视口的宽度和高度会实时更新(旧浏览器可能不支持)。
重要的是,这个效果是纯 CSS 实现的,不需要 JavaScript,真的震惊了!
@property
) --vw
和 --vh
,分别表示视口的宽度和高度。tan()
和 atan2()
函数计算视口的宽度和高度。counter
和 counter-reset
属性将计算结果显示在页面上。我们可以使用 vw
和 vh
获取浏览器视口尺寸,但是这是相对单位,所以需要转换为 px
才行。我们先利用自定义属性把相对单位转成 px
,然后最关键的一步是巧妙地利用了三角函数 $tan(arctan(a)) = a$ 来实现这个转换。
在三角函数中,$tan(θ)$ 表示一个角度 $θ$ 的正切值,它等于对边(opposite)与邻边(adjacent)的比值。反过来,$arctan(a)$ 表示一个数值 $a$ 的反正切值,它返回一个角度 $θ$,使得 $tan(θ) = a$,因此得到公式:
$$ tan(arctan(a)) = a $$
CSS 中的 tan()
和 atan2()
函数可以用来计算正切值和反正切值。
tan()
函数的语法如下:
|
|
atan2()
函数接受两个参数,对于所给两值 x
和 y
,函数 atan2(y, x)
计算并返回正半横轴与从原点到点 (x, y)
的射线的夹角。函数的语法如下:
|
|
以下是完整的 HTML 和 CSS 代码,你也可以在我的 html-demo 中查看。
|
|
主要是 counter
和 counter-reset
属性的兼容性问题,看漫山红遍,层林尽染。
2024-12-02 15:29:57
一个基于 translate.js 实现网站自动翻译的组件。
简体中文 | 繁體中文 | English | Français | Русский язык | Español | हिन्दी | deutsch | 한국어 | しろうと无论原站点是多语言还是单语言,都可以通过此组件额外增加自动翻译功能。
在网站右上角切换配置的翻译语言,或者在 URL 中添加 ?lang=
参数指定任意支持的翻译语言。例如:?lang=korean
。
每日翻译字符 200 万!
无语言配置文件、无 API Key、对 SEO 友好!
安装方式与 安装主题 相同,有多种安装方式,任选一种即可,这里介绍两种主流方式。
首先确保你的项目本身是一个 Hugo 模块。
然后将此主题组件添加到你的 hugo.toml
配置文件中:
|
|
在 Hugo 的第一次启动时,它将下载所需的文件。
要更新到模块的最新版本,请运行:
|
|
将 FixIt 和此 git 存储库克隆到你的主题文件夹中,并将其作为网站目录的子模块添加。
|
|
接下来编辑项目的 hugo.toml
并将此主题组件添加到你的主题中:
|
|
为了通过 FixIt 主题在 layouts/partials/custom.html
文件中开放的 自定义块 将 cmpt-translate.html
注入到 custom-assets
中,你需要填写以下必要配置:
|
|
另外,你还可以通过以下配置来自定义翻译的语言:
|
|
enable
:是否启用自动翻译。service
:翻译服务提供商,可选值为 client.edge
和 translate.service
,详见:翻译服务提供商。languages
:要翻译到的语言 ID 列表,例如 ["english", "chinese_simplified", "chinese_traditional", ...]
,详见:完整语言列表。ignoreID
:需要忽略翻译的元素 ID,例如 ["comment", ...]
。ignoreClass
:需要忽略翻译的类名,例如 ["post-category", ...]
。ignoreTag
:需要忽略翻译的标签,例如 ["title", ...]
。ignoreText
:需要忽略翻译的文本,例如 ["FixIt", "Lruihao", ...]
。detectLocalLanguage
:是否检测本地语言。cdn
:translate.js 的 CDN,例如 https://cdn.jsdelivr.net/npm/i18n-jsautotranslate@latest
。enterprise
:是否启用企业级翻译通道。注意
为了避免翻译语言获取失败,即使你的站点本身是单语言的,也需要配置 languageCode
和 languageName
,例如:
|
|
|
|
local
: String
用于指定当前页面的本地语言,例如 local: english
。
默认本地语言同 Hugo 站点配置相同,如果某个页面实际语言与站点配置不同,可以通过 local
参数指定。
fromLanguages
: Array
类型,用于指定当前页面内容中出现的语种是否需要翻译。
例如:网页本身是中文,但是内容中还有其他语言,你可以指定需要翻译的语种,例如:
|
|
onlyLocalLang
: Boolean
类型,用于指定是否只翻译当前页面本地语言,默认为 false
。
例如:网页本身是中文,但是内容中其他语言的摘要引用,设置 onlyLocalLang: true
可以只翻译中文。
在你的项目目录 data
文件夹下创建 nomenclature.yml
文件,然后添加自定义翻译术语,例如:
|
|
企业级稳定翻译通道,仅针对付费用户开放。
体验额度:每天有 5 万字符的体验额度,超出部分将不再翻译!
在 FixIt 里启用企业级翻译通道,设置 params.autoTranslate.enterprise
为 true
即可,企业级翻译通道相对于普通翻译通道有以下优势:
服务 | 开源翻译通道 | 企业级翻译通道 |
---|---|---|
服务端缓存层数 | 1 层 (文件式缓存) | 1 层 (内存 + 文件式缓存) |
翻译响应速度 | 1.5~5 秒 | 0.8~1.5 秒 |
翻译服务器 | 1 台 | >=3 台 |
网络节点 | 2 个 | >=4 个 |
翻译通道 | 手动设置 | 自动匹配最优 |
国内缓存节点 | 无 | 有 |
每日翻译字符 | 200 万 | 5000 万 |
考虑到 FixIt 生态受众群体大多为个人用户,因此我(@Lruihao)以个人名义拿出赞助收入进行补贴。
提示
FixIt 项目补贴价:¥10 ¥50 / 域名 / 月
到期自动禁用,需要重新赞助续费!
符合以下性质的可以免费联系我开通企业级翻译通道:
另外,Hugo FixIt 星球 成员每人补贴赠送 6 个月服务 / 年。
选择赞助金额,然后在留言中备注 AutoTranslate: 你的域名
即可。
通过以下方式联系作者:
1024#lruihao.cn
(将 #
替换为 @
)translate.js 提供技术支持和赞助企业级翻译通道。
2024-11-05 16:23:29
👉 简体中文说明 | English README
一个 canvas 实现的小鱼游动动画效果。
安装方法与 安装主题 相同。有几种安装方式,请选择一种,例如,通过 Hugo 模块安装:
首先确保你的项目本身是一个 Hugo 模块。
然后将此主题组件添加到你的 hugo.toml
配置文件中:
|
|
在 Hugo 的第一次启动时,它将下载所需的文件。
要更新到模块的最新版本,请运行:
|
|
将 FixIt 和此 git 存储库克隆到你的主题文件夹中,并将其作为网站目录的子模块添加。
|
|
接下来编辑项目的 hugo.toml
并将此主题组件添加到你的主题中:
|
|
为了通过 FixIt 主题在 layouts/partials/custom.html
文件中开放的 自定义块 将 cmpt-flyfish.html
注入到 custom-assets
中,你需要填写以下必要配置:
|
|
配置小鱼主题色,并启用动画:
|
|