From d0b0b5f857ec00f00471f035d6b9165df9405d48 Mon Sep 17 00:00:00 2001 From: 720 <71604450+T34-active@users.noreply.github.com> Date: Sun, 1 Dec 2024 09:44:10 +0800 Subject: [PATCH 001/202] [zh-cn]: update the translation of History `forward()` method (#24839) --- files/zh-cn/web/api/history/forward/index.md | 43 +++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/files/zh-cn/web/api/history/forward/index.md b/files/zh-cn/web/api/history/forward/index.md index a19c2b8063b77b..80cb1550d0d67f 100644 --- a/files/zh-cn/web/api/history/forward/index.md +++ b/files/zh-cn/web/api/history/forward/index.md @@ -1,36 +1,51 @@ --- -title: forward() +title: History:forward() 方法 slug: Web/API/History/forward +l10n: + sourceCommit: fa980709ec5dd768d46b50b8c4833cc2f8346e21 --- {{APIRef("History API")}} -在会话历史中向前移动一页。它与使用`delta`参数为 1 时调用 `history.go(delta)`的效果相同。 +{{domxref("History")}} 接口的 **`forward()`** 方法使浏览器在会话历史中向前移动一页。它的调用效果与 {{domxref("History.go", "history.go(1)")}} 相同。 + +此方法是{{glossary("asynchronous", "异步")}}的。请添加一个监听器来监听 {{domxref("Window/popstate_event", "popstate")}} 事件,以便确定导航何时完成。 ## 语法 -```js -window.history.forward(); +```js-nolint +forward() ``` +### 参数 + +无。 + +### 返回值 + +无({{jsxref("undefined")}})。 + +### 异常 + +- `SecurityError` {{domxref("DOMException")}} + - : 如果关联的文档未完全激活,则会抛出此异常。浏览器还会限制导航操作,如果调用过于频繁,可能会抛出此错误、生成警告或忽略该调用。 + ## 示例 -下述例子创建了一个按钮,该按钮会在会话历史中向前移动一步。 +以下示例创建了一个在会话历史中向前移动一步的按钮。 ### HTML ```html - + ``` ### JavaScript ```js -window.onload = function (e) { - document.getElementById("go-forward").addEventListener("click", (e) => { - window.history.forward(); - }); -}; +document.getElementById("go-forward").addEventListener("click", (e) => { + history.forward(); +}); ``` ## 规范 @@ -40,3 +55,9 @@ window.onload = function (e) { ## 浏览器兼容性 {{Compat}} + +## 参见 + +- {{domxref("History")}} +- {{domxref("Window/popstate_event", "popstate")}} +- [使用历史记录 API](/zh-CN/docs/Web/API/History_API/Working_with_the_History_API) From 7fa481ea78492303bb2f9fec9fd20ba27dd0f625 Mon Sep 17 00:00:00 2001 From: Chunhui Fu Date: Sun, 1 Dec 2024 10:02:07 +0800 Subject: [PATCH 002/202] [zh-cn]: create docs for Fence (#24648) Co-authored-by: A1lo --- .../web/api/fence/getnestedconfigs/index.md | 53 +++++++++++++++ files/zh-cn/web/api/fence/index.md | 49 ++++++++++++++ .../zh-cn/web/api/fence/reportevent/index.md | 63 ++++++++++++++++++ .../index.md | 65 +++++++++++++++++++ 4 files changed, 230 insertions(+) create mode 100644 files/zh-cn/web/api/fence/getnestedconfigs/index.md create mode 100644 files/zh-cn/web/api/fence/index.md create mode 100644 files/zh-cn/web/api/fence/reportevent/index.md create mode 100644 files/zh-cn/web/api/fence/setreporteventdataforautomaticbeacons/index.md diff --git a/files/zh-cn/web/api/fence/getnestedconfigs/index.md b/files/zh-cn/web/api/fence/getnestedconfigs/index.md new file mode 100644 index 00000000000000..3dff5f2ab01b44 --- /dev/null +++ b/files/zh-cn/web/api/fence/getnestedconfigs/index.md @@ -0,0 +1,53 @@ +--- +title: Fence:getNestedConfigs() 方法 +slug: Web/API/Fence/getNestedConfigs +l10n: + sourceCommit: f430d277573ba0b06b1ac33ae8017fd90f170bef +--- + +{{SeeCompatTable}}{{APIRef("Fenced Frame API")}} + +{{domxref("Fence")}} 接口的 **`getNestedConfigs()`** 方法返回加载到当前 `` 内部嵌入的 `` 中的 {{domxref("FencedFrameConfig")}} 配置。 + +## 语法 + +```js-nolint +getNestedConfigs() +``` + +### 参数 + +无。 + +### 返回值 + +`getNestedConfigs()` 有两个可能的返回值: + +- 如果当前 `` 的配置是通过支持嵌套配置的 API(例如[受保护的受众](https://developers.google.cn/privacy-sandbox/private-advertising/protected-audience))创建的,则为一个包含 20 个 {{domxref("FencedFrameConfig")}} 对象的数组。在这 20 个配置中,前 N 个配置是通过 API 注册的,其余的是将导航到 `about:blank` 的填充配置,以便隐藏配置的数量并防止任何信息泄露。 +- 如果当前 `` 的配置是通过不支持嵌套配置的 API(例如[共享存储](/zh-CN/docs/Web/API/Shared_Storage_API))创建的,则为 `null`。 + +## 示例 + +```js +// 在 内部运行 + +// 获取嵌入围栏框架的配置 +const configs = window.fence.getNestedConfigs(); + +// 将新的围栏框架配置设置为与检索到的某个配置相同 +const frame = document.createElement("fencedframe"); +frame.config = configs[0]; +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- developers.google.cn 上的[围栏框架](https://developers.google.cn/privacy-sandbox/private-advertising/fenced-frame) +- developers.google.cn 上的[隐私沙盒](https://developers.google.cn/privacy-sandbox) diff --git a/files/zh-cn/web/api/fence/index.md b/files/zh-cn/web/api/fence/index.md new file mode 100644 index 00000000000000..c13ccb0c909990 --- /dev/null +++ b/files/zh-cn/web/api/fence/index.md @@ -0,0 +1,49 @@ +--- +title: Fence +slug: Web/API/Fence +l10n: + sourceCommit: f430d277573ba0b06b1ac33ae8017fd90f170bef +--- + +{{SeeCompatTable}}{{APIRef("Fenced Frame API")}} + +{{domxref("Fenced Frame API", "围栏框架 API", "", "nocode")}} 的 **`Fence`** 接口包含与 {{htmlelement("fencedframe")}} 功能相关的几个函数。 + +`Fence` 对象可以通过 {{domxref("Window.fence")}} 属性访问,但它们仅对嵌入在 {{htmlelement("fencedframe")}}(通过 {{domxref("FencedFrameConfig")}} 加载)或 {{htmlelement("iframe")}}(通过不透明 URN 加载)中的文档可用。 + +> [!NOTE] +> 参见 [`` 的工作原理](/zh-CN/docs/Web/API/Fenced_frame_API#fencedframe_的工作原理)了解有关 `FencedFrameConfig` 和不透明 URN 的一些描述。 + +{{InheritanceDiagram}} + +## 实例方法 + +- {{domxref("Fence.getNestedConfigs", "getNestedConfigs()")}} {{Experimental_Inline}} + - : 返回加载到当前 `` 内部嵌入的 `` 中的 {{domxref("FencedFrameConfig")}} 配置。 +- {{domxref("Fence.reportEvent", "reportEvent()")}} {{Experimental_Inline}} + - : 通过[信标](/zh-CN/docs/Web/API/Beacon_API)触发报告数据的提交,将数据发送到通过[受保护的受众 API](https://developers.google.cn/privacy-sandbox/private-advertising/protected-audience) 的 {{domxref("InterestGroupReportingScriptRunnerGlobalScope.registerAdBeacon", "registerAdBeacon()")}} 方法注册的一个或多个特定 URL,以收集广告的竞价结果。 +- {{domxref("Fence.setReportEventDataForAutomaticBeacons", "setReportEventDataForAutomaticBeacons()")}} {{Experimental_Inline}} + - : 指定在 `` 内部发生导航时将发送的事件数据。这些数据将通过自动信标发送到通过[受保护的受众 API](https://developers.google.cn/privacy-sandbox/private-advertising/protected-audience) 的 {{domxref("InterestGroupReportingScriptRunnerGlobalScope.registerAdBeacon", "registerAdBeacon()")}} 方法注册的一个或多个特定 URL,以收集广告竞价结果的报告数据。 + +## 示例 + +```js +window.fence.reportEvent({ + eventType: "click", + eventData: JSON.stringify({ clickX: "123", clickY: "456" }), + destination: ["buyer", "seller"], +}); +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- developers.google.cn 上的[围栏框架](https://developers.google.cn/privacy-sandbox/private-advertising/fenced-frame) +- developers.google.cn 上的[隐私沙盒](https://developers.google.cn/privacy-sandbox) diff --git a/files/zh-cn/web/api/fence/reportevent/index.md b/files/zh-cn/web/api/fence/reportevent/index.md new file mode 100644 index 00000000000000..39bfe2cab5a0a9 --- /dev/null +++ b/files/zh-cn/web/api/fence/reportevent/index.md @@ -0,0 +1,63 @@ +--- +title: Fence:reportEvent() 方法 +slug: Web/API/Fence/reportEvent +l10n: + sourceCommit: f430d277573ba0b06b1ac33ae8017fd90f170bef +--- + +{{SeeCompatTable}}{{APIRef("Fenced Frame API")}} + +{{domxref("Fence")}} 接口的 **`reportEvent()`** 方法通过[信标](/zh-CN/docs/Web/API/Beacon_API)触发报告数据的提交,将数据发送到通过[受保护的受众 API](https://developers.google.cn/privacy-sandbox/private-advertising/protected-audience) 的 {{domxref("InterestGroupReportingScriptRunnerGlobalScope.registerAdBeacon", "registerAdBeacon()")}} 方法注册的一个或多个特定 URL,以收集广告竞价结果。 + +> **备注:** {{domxref("Fence.setReportEventDataForAutomaticBeacons", "setReportEventDataForAutomaticBeacons()")}} 提供类似的报告数据提交功能,除非提交是通过导航而不是显式的方法调用触发的。 + +## 语法 + +```js-nolint +reportEvent(event) +``` + +### 参数 + +- `event` + - : 表示要发送的数据的对象或字符串。 + - 对象值定义一个你想要发送的特定报告事件。必需属性如下: + - `eventType` + - : 表示正在报告的事件类型的字符串——例如,你可能想要了解广告被点击的次数。这个字符串可以是任何相关的事件名称(例如 [`click`](/zh-CN/docs/Web/API/Element/click_event))。这需要与[受保护的受众 API](https://developers.google.cn/privacy-sandbox/private-advertising/protected-audience) worklet 中关联的 {{domxref("InterestGroupReportingScriptRunnerGlobalScope.registerAdBeacon", "registerAdBeacon()")}} 调用指定的事件类型相匹配。 + - `eventData` + - : 表示要发送的数据的字符串。 + - `destination` + - : 包含一个或多个枚举值的数组,这些值代表目标类型。这些是将接收数据到其注册 URL(即通过 {{domxref("InterestGroupReportingScriptRunnerGlobalScope.registerAdBeacon", "registerAdBeacon()")}})的涉及方。可能的值包括: + - `"buyer"`:广告竞价中的出价方。 + - `"seller"`:运行广告竞价的顶级卖方。 + - `"component-seller"`:多级竞价中组成竞价的卖方。 + - `"direct-seller"`:直接运行买家投标竞价的卖方。如果广告是单级竞价,则使用的值为 `"seller"`。如果广告是多级竞价,则使用的值为 `"component-seller"`。 + - `"shared-storage-select-url"`:[共享存储 API](https://developers.google.cn/privacy-sandbox/private-advertising/shared-storage) 存储位置,如在 {{domxref("WindowSharedStorage.selectURL", "Window.sharedStorage.selectURL()")}} 方法调用中所定义。 + - 字符串值表示一个 `eventType`,例如 `"click"`(参见前面 `eventType` 的定义)。当将 `eventType` 字符串作为 `reportEvent()` 的值传递时,它会触发所有基于该事件类型(例如通过 {{domxref("PrivateAggregation.contributeToHistogramOnEvent()")}})做出的隐私聚合贡献的发送。 + +### 返回值 + +无(`undefined`)。 + +## 示例 + +```js +window.fence.reportEvent({ + eventType: "click", + eventData: JSON.stringify({ clickX: "123", clickY: "456" }), + destination: ["buyer", "seller"], +}); +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- developers.google.cn 上的[围栏框架](https://developers.google.cn/privacy-sandbox/private-advertising/fenced-frame) +- developers.google.cn 上的[隐私沙盒](https://developers.google.cn/privacy-sandbox) diff --git a/files/zh-cn/web/api/fence/setreporteventdataforautomaticbeacons/index.md b/files/zh-cn/web/api/fence/setreporteventdataforautomaticbeacons/index.md new file mode 100644 index 00000000000000..443bf7edd8fe74 --- /dev/null +++ b/files/zh-cn/web/api/fence/setreporteventdataforautomaticbeacons/index.md @@ -0,0 +1,65 @@ +--- +title: Fence:setReportEventDataForAutomaticBeacons() 方法 +slug: Web/API/Fence/setReportEventDataForAutomaticBeacons +l10n: + sourceCommit: f430d277573ba0b06b1ac33ae8017fd90f170bef +--- + +{{SeeCompatTable}}{{APIRef("Fenced Frame API")}} + +{{domxref("Fence")}} 接口的 **`setReportEventDataForAutomaticBeacons()`** 方法指定在 `` 内部发生导航时将发送的事件数据。这些数据将通过自动[信标](/zh-CN/docs/Web/API/Beacon_API)发送到通过[受保护的受众 API](https://developers.google.cn/privacy-sandbox/private-advertising/protected-audience) 的 {{domxref("InterestGroupReportingScriptRunnerGlobalScope.registerAdBeacon", "registerAdBeacon()")}} 方法注册的一个或多个特定 URL,以收集广告竞价结果的报告数据。 + +> **备注:** {{domxref("Fence.reportEvent", "reportEvent()")}} 提供类似的报告数据提交功能,除非提交是通过显式方法调用而不是导航触发的。 + +## 语法 + +```js-nolint +setReportEventDataForAutomaticBeacons(event) +``` + +### 参数 + +- `event` + - : 表示要发送数据的对象。可能的属性如下: + - `eventType` + - : 一个字符串,表示正在报告的事件类型。可用值包括: + - `reserved.top_navigation_start`:当顶级导航开始时触发的事件。 + - `reserved.top_navigation_commit`:当顶级导航完成时触发的事件。 + - `eventData` + - : 表示要发送的数据的字符串。 + - `destination` + - : 包含一个或多个枚举值的数组,这些值代表目标类型。这些是将接收数据到其注册 URL(即通过 {{domxref("InterestGroupReportingScriptRunnerGlobalScope.registerAdBeacon", "registerAdBeacon()")}})的涉及方。可能的值包括: + - `"buyer"`:广告竞价中的出价方。 + - `"seller"`:运行广告竞价的顶级卖方。 + - `"component-seller"`:多级竞价中组成竞价的卖方。 + - `"direct-seller"`:直接运行买家投标竞价的卖方。如果广告是单级竞价,则使用的值为 `"seller"`。如果广告是多级竞价,则使用的值为 `"component-seller"`。 + - `"shared-storage-select-url"`:[共享存储 API](https://developers.google.cn/privacy-sandbox/private-advertising/shared-storage) 存储位置,如在 {{domxref("WindowSharedStorage.selectURL", "Window.sharedStorage.selectURL()")}} 方法调用中所定义。 + - `once` {{optional_inline}} + - : 一个布尔值。如果设置为 `true`,则仅会为下一个事件发送自动信标,并且在再次调用 `setReportEventDataForAutomaticBeacons()` 之前,不会为后续事件发送信标。例如,当与 `click` 处理程序一起使用时,这可用于仅为特定的顶级导航发送信标数据,而不是为每次顶级导航都发送。此属性的默认值为 `false`。 + +### 返回值 + +无(`undefined`)。 + +## 示例 + +```js +window.fence.setReportEventDataForAutomaticBeacons({ + eventType: "reserved.top_navigation_start", + eventData: "示例字符串", + destination: ["seller", "buyer"], +}); +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- developers.google.cn 上的[围栏框架](https://developers.google.cn/privacy-sandbox/private-advertising/fenced-frame) +- developers.google.cn 上的[隐私沙盒](https://developers.google.cn/privacy-sandbox) From f4fc962131e624964608d7c63a46c0f043ff106b Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Wed, 27 Nov 2024 14:59:57 +0900 Subject: [PATCH 003/202] =?UTF-8?q?2024/11/07=20=E6=99=82=E7=82=B9?= =?UTF-8?q?=E3=81=AE=E8=8B=B1=E8=AA=9E=E7=89=88=E3=81=AB=E5=9F=BA=E3=81=A5?= =?UTF-8?q?=E3=81=8D=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mastering_wrapping_of_flex_items/index.md | 326 ++++++++++++++-- .../ordering_flex_items/index.md | 214 +++++++++-- .../ordering_flex_items/order-card.png | Bin 0 -> 7043 bytes .../typical_use_cases_of_flexbox/index.md | 350 ++++++++++++++++-- 4 files changed, 786 insertions(+), 104 deletions(-) create mode 100644 files/ja/web/css/css_flexible_box_layout/ordering_flex_items/order-card.png diff --git a/files/ja/web/css/css_flexible_box_layout/mastering_wrapping_of_flex_items/index.md b/files/ja/web/css/css_flexible_box_layout/mastering_wrapping_of_flex_items/index.md index f01a57d592da5e..e73550714c1ec9 100644 --- a/files/ja/web/css/css_flexible_box_layout/mastering_wrapping_of_flex_items/index.md +++ b/files/ja/web/css/css_flexible_box_layout/mastering_wrapping_of_flex_items/index.md @@ -2,30 +2,123 @@ title: フレックスアイテムの折り返しをマスターする slug: Web/CSS/CSS_flexible_box_layout/Mastering_wrapping_of_flex_items l10n: - sourceCommit: ec9d2eb49c0916c394842d5caa923e1d86ed47ed + sourceCommit: 8a7e911652fcb4a61cc95f458d53f39ad08c0946 --- {{CSSRef}} -フレックスボックスは一次元のレイアウトとして設計されており、つまりアイテムを行または列として扱います。 — しかし、同時ではありません。しかし、フレックスアイテムを新しい行に折り返し、 {{cssxref("flex-direction")}} が `row` の場合は新しい行を、 `flex-direction` が `column` の場合は新しい列を生成します。このガイドでは、これがどのように動作するのか、何のために設計されているのか、どのような場合にフレックスボックスより [CSS グリッドレイアウト](/ja/docs/Web/CSS/CSS_grid_layout)が必要になるかを説明します。 +フレックスボックスは一次元のレイアウトツールとして設計されており、アイテムを単一の行または列として扱います(両方同時ではありません)。しかし、フレックスアイテムを改行し、 {{cssxref("flex-direction")}} が `row` の場合は新しい行を、 `flex-direction` が `column` の場合は新しい列を生成することができます。このガイドでは、フレックスボックスの折り返しについて、何のために設計されているのか、どのような場合にフレックスボックスより [CSS グリッドレイアウト](/ja/docs/Web/CSS/CSS_grid_layout)が必要になるかを説明します。 ## 折り返しを行う -{{cssxref("flex-wrap")}} プロパティの初期値は `nowrap` です。つまり、コンテナーに対して幅が広すぎるフレックスアイテムのセットがあると、コンテナーからはみ出してしまいます。幅が広くなりすぎたら折り返すようにしたい場合は、`flex-wrap` プロパティを追加して `wrap` の値を設定するか、一括指定の {{cssxref("flex-flow")}} を使用して `row wrap` または `column wrap` の値を設定する必要があります。 - -アイテムはコンテナーの中に収まります。次の例では、10 個のアイテムを配置しています。すべてのアイテムの `flex-basis` は 160px で、伸長と縮小が可能です。最初の列で 160 ピクセルのアイテムを配置する空間がなくなると、新しいフレックス行が作成され、すべてのアイテムが配置されるまで繰り返されます。アイテムが成長すると、各列を完全に埋めるために、160 ピクセルよりも大きく拡張されます。最終行にアイテムが 1 つしかない場合は、行全体を埋めるように伸縮します。 - -{{EmbedGHLiveSample("css-examples/flexbox/wrapping/row-wrap.html", '100%', 650)}} - -これと同じことが列でも起こります。アイテムが折り返して新しい列を作り始め、それぞれの列を完全に埋めるためにアイテムを伸長するようにするためには、コンテナーに高さを設定する必要があります。 - -{{EmbedGHLiveSample("css-examples/flexbox/wrapping/column-wrap.html", '100%', 810)}} +{{cssxref("flex-wrap")}} プロパティの初期値は `nowrap` です。つまり、一連のフレックスアイテムがフレックスコンテナーと比べて幅が広くなると、はみ出してしまいます。幅が広いときに折り返すようにしたい場合は、`flex-wrap` プロパティを追加して `wrap` の値を設定するか、一括指定の {{cssxref("flex-flow")}} を使用して `row wrap` または `column wrap` の値を設定する必要があります。そうするとアイテムは、コンテナーをあふれる場合に改行するようになります。 + +この例では、伸長・縮小可能な 10 個のフレックスアイテムがあり、 `flex-basis` は `160px` です。 160 ピクセルのアイテムのある行にもう配置する空間がなくなった時点で、新しいフレックス行が作成されます。すべてのアイテムが配置されるまで、必要に応じて改行が生成されます。アイテムが伸長するにつれ、展開された行が完全に埋め尽くされます。最終行にアイテムが 1 つだけしかない場合、その行全体がそのアイテムで埋め尽くされます。 + +```html live-sample___row-wrap +
+
One
+
Two
+
Three
+
Four
+
Five
+
Six
+
Seven
+
Eight
+
Nine
+
Ten
+
+``` + +```css live-sample___row-wrap +.box { + width: 500px; + border: 2px dotted rgb(96 139 168); + display: flex; + flex-wrap: wrap; +} + +.box > * { + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + flex: 1 1 160px; +} +``` + +{{EmbedLiveSample("row-wrap")}} + +フレックス列でも同じことが起こります。 列を折り返して新しい列を作成するには、コンテナーに高さを指定する必要があります。 列の場合、アイテムは垂直方向に伸縮し、各列を完全に埋めます。 + +```html live-sample___column-wrap +
+
One
+
Two
+
Three
+
Four
+
Five
+
Six
+
Seven
+
Eight
+
Nine
+
Ten
+
+``` + +```css live-sample___column-wrap +.box { + border: 2px dotted rgb(96 139 168); + height: 300px; + display: flex; + flex-direction: column; + flex-wrap: wrap; +} +.box > * { + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + flex: 1 1 80px; +} +``` + +{{EmbedLiveSample("column-wrap", "", "320px")}} ## 折り返しと flex-direction 折り返しは、`flex-direction` と組み合わせることで、期待通りの効果を発揮します。`flex-direction` が `row-reverse` に設定されている場合、アイテムはコンテナーの端から始まり、逆順に並んでいきます。 -{{EmbedGHLiveSample("css-examples/flexbox/wrapping/row-reverse-wrap.html", '100%', 750)}} +```html live-sample___row-reverse-wrap +
+
One
+
Two
+
Three
+
Four
+
Five
+
Six
+
Seven
+
Eight
+
Nine
+
Ten
+
+``` + +```css live-sample___row-reverse-wrap +.box { + border: 2px dotted rgb(96 139 168); + display: flex; + flex-wrap: wrap; + flex-direction: row-reverse; + width: 500px; +} +.box > * { + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + flex: 1 1 160px; +} +``` + +{{EmbedLiveSample("row-reverse-wrap")}} なお、反転は行内方向にのみ行われます。右から開始して 2 行目に進み、再び右から開始します。下から開始してコンテナーを上がっていくという、両方の方向で反転しているわけではありません。 @@ -33,35 +126,133 @@ l10n: 上の例で見たように、アイテムが伸縮することが許されていれば、最後の行や列のアイテムが少なくなると、それらのアイテムは空いた空間を埋めるように伸びていきます。 -フレックスボックスには、ある行のアイテムとその上の行のアイテムの位置を揃える方法はありません。各フレックス行は新しいフレックスコンテナーのように機能します。これが主軸の空間分配を行います。アイテムが 1 つだけで、そのアイテムが成長することが許可されている場合、1 つのアイテムのフレックスコンテナーがある場合と同様に、その軸いっぱいに表示されます。 - -2 次元でのレイアウトが必要な場合は、おそらくグリッドレイアウトを使用します。上記の折り返し行の例を CSS グリッド版のレイアウトと比較すると、違いが分かります。次のライブサンプルでは、CSS グリッドレイアウトを使用して、160 ピクセル以上の列が収まるだけのレイアウトを作成し、余分な空間をすべての列に分配しています。ただし、この場合、アイテムはグリッド内に留まり、最終行のアイテム数が少なくなっても伸びることはありません。 - -{{EmbedGHLiveSample("css-examples/flexbox/wrapping/grid-example.html", '100%', 700)}} - -これが一次元と二次元のレイアウトの違いです。フレックスボックスのような一次元方式では、行または列のみを制御します。グリッドのような二次元のレイアウトでは、両方を同時に制御します。行ごとに空間を分配したい場合は、フレックスボックスを使用してください。そうでない場合は、グリッドを使用してください。 +フレックスボックスには、ある行のアイテムとその上の行のアイテムの位置を揃える機能はありません。各フレックス行は新しいフレックスコンテナーのように機能します。これが主軸の空間分配を行います。アイテムが 1 つだけで、そのアイテムが成長することが許可されている場合、1 つのアイテムのフレックスコンテナーがある場合と同様に、その軸いっぱいに表示されます。二次元でのレイアウトが必要な場合は、おそらくグリッドレイアウトを使用します。 + +この例では、 CSS グリッドレイアウトを使用して、収まるだけ多くの `160px` 以上の列を持つレイアウトを作成し、余った空間をすべての列に分配することで、その違いを示しています。 HTML は、上記の[フレックスボックスで折り返された行](#折り返しを行う)の例と同じものを使用しますが、 `display: grid` を設定します。 フレックスボックスの外では効果のない {{cssxref("flex")}} 一括指定の代わりに、アイテムの最小幅とコンテナー上で直接成長する能力を {{cssxref("grid-template-columns")}} で設定します。 CSS グリッドを使用すると、最後のアイテムはグリッドセル内に留まります。最後の行のアイテムが少ない場合でも、グリッドアイテムは伸張しません。 + +```html live-sample___grid-example +
+
One
+
Two
+
Three
+
Four
+
Five
+
Six
+
Seven
+
Eight
+
Nine
+
Ten
+
+``` + +```css live-sample___grid-example +.box { + border: 2px dotted rgb(96 139 168); + display: grid; + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + width: 500px; +} + +.box > * { + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); +} +``` + +{{EmbedLiveSample("grid-example")}} + +これが一次元と二次元のレイアウトの違いです。フレックスボックスのような一次元レイアウト方式では、行または列のみを制御します。グリッドのような二次元のグリッドレイアウトでは、両方を同時に制御します。行ごとに空間を分配したい場合は、フレックスボックスを使用してください。そうでない場合は、 CSS グリッドを使用してください。 ## フレックスボックスベースのグリッドシステムはどのように機能するか -通常、フレックスボックスベースのグリッドシステムは、フレックスボックスを馴染みのある float ベースのレイアウトの世界に戻すことで機能します。フレックスアイテムにパーセント値の幅を割り当てると、`flex-basis` として、または `flex-basis` の値を `auto` のままにしてアイテム自体に幅を追加することで、2 次元のレイアウトのような印象を与えることができます。以下の例では、この機能を確認できます。 - -ここでは、`flex-grow` と `flex-shrink` を `0` に設定して、柔軟性のないフレックスアイテムを作り、フロートレイアウトで行っていたように、パーセント値を使って柔軟性をコントロールしています。 - -{{EmbedGHLiveSample("css-examples/flexbox/wrapping/flex-grid.html", '100%', 650)}} - -フレックスアイテムを横軸に並べる必要がある場合は、この方法で幅を制御することで実現できます。しかし、ほとんどの場合、この方法でフレックスアイテムに幅を追加する場合は、その部分をグリッドレイアウトに変更した方がよいことがわかります。 +フレックスボックスベースのレイアウトはグリッドシステムとして強制的に整列させることができますが、それはフレックスボックスの意図通りの使い方ではありません。フレックスアイテムに `flex-basis` で、または `flex-basis` を `auto` してアイテム自体に幅を追加することで、フレックスアイテムにパーセント値の幅を割り当てると、二次元のレイアウトのような印象を与えることができます。 + +ここでは、`flex-grow` と `flex-shrink` を `0` に設定して、柔軟性のないフレックスアイテムを作っています。柔軟性はパーセント値で制御しています。 + +```html live-sample___flex-grid +
+
One
+
Two
+
Three
+
Four
+
Five
+
Six
+
Seven
+
Eight
+
Nine
+
Ten
+
+``` + +```css live-sample___flex-grid +* { + box-sizing: border-box; +} + +.box { + width: 500px; + border: 2px dotted rgb(96 139 168); + display: flex; + flex-wrap: wrap; +} + +.box > * { + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + flex: 0 0 33.3333%; +} +``` + +{{EmbedLiveSample("flex-grid")}} + +このテクニックを用いると、フレックスアイテムを交差軸上に整列させることができます。しかし、この方法でフレックスアイテムに幅を追加したり、スペースを取るために空のフレックスアイテムを追加している場合は、そのコンポーネントを CSS グリッドレイアウトに変更した方がよいことを示します。 ## アイテム間のすき間の生成 -フレックスアイテム間にすき間または溝を作成するには、 {{CSSXref('gap')}} プロパティを使用します。 - -CSS の gap プロパティは `row-gap` と `column-gap` の一括指定で、グリッド、フレックス、段組みレイアウトにおける行や列の間の空間である溝の大きさを指定します。 +フレックスアイテム間にすき間または溝を作成するには、 {{CSSXref("gap")}} プロパティをフレックスコンテナーに直接使用することで、その子のフレックスアイテム間に固定幅のすき間を生成することができます。 `gap` プロパティは、 `row-gap` と `column-gap` の一括指定です。これらのプロパティは、グリッド、フレックス、段組みレイアウト内の行と列の間のすき間の寸法を指定します。 -フレックスボックスでは、 `gap` プロパティをフレックスコンテナーに適用します。これは隣接するフレックスアイテムの間に固定された空間を作成します。しかし、アイテムの間に空間を作ることができるのは `gap` プロパティだけではありません。マージン、パディング、`justify-content`、`align-content` も溝のサイズを大きくすることができ、実際のすき間のサイズに影響を与えます。 +アイテムの間に空間を追加することができるのは `gap` プロパティだけではありません。マージン、パディング、`justify-content`、`align-content` もすき間の寸法を大きくすることができ、実際のすき間の寸法に影響を与えます。 両方の軸で `gap` プロパティが `margin` とどのように異なるかを確認するには、コンテナー `.box` の `gap` 値を変更し、下記スタイルシートの `.box > *` ルールに `margin` 値を追加してみてください。リセットボタンをクリックすると前回の値に戻ります。 -{{EmbedGHLiveSample("css-examples/flexbox/wrapping/gaps.html", '100%', 830)}} +```html live-sample___gaps +
+
+
One
+
Two
+
Three
+
Four
+
Five
+
Six
+
Seven
+
Eight
+
Nine
+
Ten
+
+
+``` + +```css live-sample___gaps +.wrapper { + border: 2px dotted rgb(96 139 168); + width: 500px; +} +.box { + display: flex; + flex-wrap: wrap; + gap: 10px; +} +.box > * { + flex: 1 1 160px; + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); +} +``` + +{{EmbedLiveSample("gaps", "", "220px")}} ## アイテムの折り畳み @@ -71,24 +262,83 @@ CSS の gap プロパティは `row-gap` と `column-gap` の一括指定で、 この動作は、 JavaScript を使用してフレックスアイテムを対象にし、コンテンツの表示・非表示を行う場合などに便利です。仕様書の例では、そのようなパターンの一つを示しています。 -次のライブ例では、折り返しのないフレックスコンテナーを使用しています。3 番目のアイテムは他のアイテムよりも内容物が多いのですが、 `visibility: collapse` に設定されているため、フレックスコンテナーはこのアイテムを表示するために必要な高さの*支柱*を保持しています。CSS から `visibility: collapse` を削除したり、値を `visible` に変更したりすると、アイテムが現れ、折り畳まれていないアイテムに空間が再分配されますが、フレックスコンテナーの高さは変わりません。 +次のライブサンプルでは、折り返しのないフレックスコンテナーを使用しています。3 番目のアイテムは他のアイテムよりも内容物が多いのですが、 `visibility: collapse` に設定されているため、フレックスコンテナーはこのアイテムを表示するために必要な高さの*支柱*を保持しています。CSS から `visibility: collapse` を削除したり、値を `visible` に変更したりすると、アイテムが現れ、折り畳まれていないアイテムに空間が再分配されますが、フレックスコンテナーの高さは変わりません。 > [!NOTE] > Chrome や Safari では折りたたまれている部分は非表示として扱われるため、以下の 2 つの例は Firefox を使用してください。 -{{EmbedGHLiveSample("css-examples/flexbox/wrapping/visibility-collapse.html", '100%', 650)}} +```html live-sample___visibility-collapse +
+
One
+
Two
+
Three
has
extra
text
+
+``` + +```css live-sample___visibility-collapse +.box { + border: 2px dotted rgb(96 139 168); + display: flex; + width: 600px; +} +.box > * { + flex: 1 1 200px; + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); +} +.hide { + visibility: collapse; +} +``` + +{{EmbedLiveSample("visibility-collapse")}} しかし、複数行のフレックスコンテナーを扱う場合は、折り返しが折り返しの後に再実行されることを理解する必要があります。つまり、ブラウザーは折り畳まれたアイテムがインライン方向に残した新しい空間を考慮して、折り返しの動作を再実行する必要があります。 つまり、アイテムが最初の行とは別の行になってしまう可能性があるのです。アイテムを表示したり隠したりすると、アイテムが別の行になってしまうこともあります。 -次のライブ例では、この動作を作成しました。折り畳まれたアイテムの位置に基づいて、引き伸ばされている行が変化している様子がわかります。2 番目のアイテムにさらにコンテンツを追加すると、十分な長さになった時点で行が変更されます。その結果、一番上の行は、テキストの 1 行分の高さにしかなりません。 - -{{EmbedGHLiveSample("css-examples/flexbox/wrapping/wrapped-visibility-collapse.html", '100%', 750)}} +次のライブサンプルでは、この動作を作成しました。折り畳まれたアイテムの位置に基づいて、引き伸ばされている行が変化している様子がわかります。2 番目のアイテムにさらにコンテンツを追加すると、十分な長さになった時点で行が変更されます。その結果、一番上の行は、テキストの 1 行分の高さにしかなりません。 + +```html live-sample___wrapped-visibility-collapse +
+
One
+
Add more text to this box to make it grow
+
Three
has
extra
text
+
Four
+
Five
+
Six
+
Seven
+
Eight
+
Nine
+
Ten
+
+``` + +```css live-sample___wrapped-visibility-collapse +.box { + border: 2px dotted rgb(96 139 168); + width: 500px; + display: flex; + flex-wrap: wrap; +} +.box > * { + padding: 10px; + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + flex: 1 1 auto; +} +.hide { + visibility: collapse; +} +``` + +{{EmbedLiveSample("wrapped-visibility-collapse")}} これによりレイアウトに問題が生じる場合は、構造を見直す必要があるかもしれません。たとえば、各行を別々のフレックスコンテナーに入れて、行がずれないようにするなどです。 -### `visibility: hidden` や `display: none` との違い +### `visibility: hidden` と `display: none` の使用 -前回のライブ例では、 `visiblity: collapse` の代わりに `visibility: hidden` または `display: none` を使用してみてください。 `visibility: hidden` を使用すると、アイテムは見えなくなりますが、ボックスは書式構造内に保持されるので、レイアウトの一部であるかのように動作します。 +上のライブサンプルにおいて、 `visiblity: collapse` の代わりに `visibility: hidden` または `display: none` を使用してみてください。 `visibility: hidden` を使用すると、アイテムは見えなくなりますが、ボックスは書式構造内に保持されるので、レイアウトの一部であるかのように動作します。 `display: none` を使用すると、項目は完全に書式構造から除去されます。見えないだけでなく、構造も除去されます。これはカウンターがそれを無視し、トランジションなどのことが実行されないことを意味しています。 diff --git a/files/ja/web/css/css_flexible_box_layout/ordering_flex_items/index.md b/files/ja/web/css/css_flexible_box_layout/ordering_flex_items/index.md index 9dd22291616187..5fec032f89b3eb 100644 --- a/files/ja/web/css/css_flexible_box_layout/ordering_flex_items/index.md +++ b/files/ja/web/css/css_flexible_box_layout/ordering_flex_items/index.md @@ -2,12 +2,12 @@ title: フレックスアイテムの順序 slug: Web/CSS/CSS_flexible_box_layout/Ordering_flex_items l10n: - sourceCommit: 883b021c97375f872d0702f0d0747b1373155cef + sourceCommit: 8a7e911652fcb4a61cc95f458d53f39ad08c0946 --- {{CSSRef}} -フレックスボックスやグリッドといった新しいレイアウト方式には、コンテンツの順序を制御する機能があります。この記事では、フレックスボックスを使っている場合にコンテンツの見た目上の順序を変更する方法について見ていきます。またアクセシビリティの観点における、アイテム順の変更による影響についても考察します。 +フレックスボックスやグリッドなどのレイアウト方式には、コンテンツの順序を制御することができます。この記事では、フレックスボックスを使っている場合にコンテンツの視覚的な順序を変更する方法について見ていきます。また、アイテムの順序の変更が、アクセシビリティにどう影響するかについても考察します。 ## アイテムを逆順に表示する @@ -34,30 +34,53 @@ l10n: ![アラビア文字の場合に row が右から始まり、 row-reverse では左から始まることを示すフレックスコンテナー](order-rtl.png) -これは、アイテムが*表示上*でのみ逆順になるという点に注意が必要ではあるものの、アイテムを逆順に表示するための素晴らしい方法にみえます。この点については仕様の中で以下の様に触れられています。 +これは、アイテムを逆順で表示する簡単な方法のように思えるかもしれません。しかし、アイテムは視覚的にのみ逆順で表示されることに留意すべきです。フレックスレイアウトの並び替え機能は、視覚的なレンダリングのみに影響します。タブ順序と読み上げ順序はソースコードの順序に従います。つまり、視覚的な表示のみが変更され、ソース順序は同じままなので、 CSS 非対応の UA (Siri や Alexa を考えてください)や支援技術のユーザーには使い勝手が異なるものになります。ナビゲーションバーの順序を変更しても、タブ順は文書内のソース順のまま変わりません。これは、視覚的な順序ではなく、認知的に混乱を招く可能性があります。 -> 「注:フレックスレイアウトの順序変更の機能は、意図的に表示のレンダリングにのみ影響するようになっており、読み上げの順序やナビゲーションがソースコード順に従うという挙動には影響しません。これにより作成者は、CSS 非対応の UA や読み上げや逐次ナビゲーションといった線形のモデルをソースの順序に保ったまま、視覚表現についての操作をすることができるようになります。」 - [Ordering and Orientation](https://www.w3.org/TR/css-flexbox-1/#flow-order) +逆順の値を設定しているときや、そのほかの方法でアイテムの順序を変更している場合、ソース内の論理的な順序を変更すべきかどうかを考慮する必要があります。 -仮にアイテムがリンクなどのようなタブで移動できる要素であったとすると、その移動順は表示されている順序ではなく、文書のソースに現れる順となります。 +フレックスボックスレイアウトの仕様書では、ソースの課題を修正する方法として並べ替えを使用しないよう警告しています。 -逆順の値を設定しているときやそのほかの方法でアイテムの順序を変更している場合、本当にソース上で論理的な順序を変更しなくてよいか考慮する必要があります。仕様の中でも先ほどの注に続けて、ソースの問題を修正するために順序設定を利用するべきではないという記載があります。 +> 「文書のアクセシビリティを損なうため、 order や {{cssxref("flex-flow")}}/`flex-direction` の \*-reverse 値をソース順序の修正の代用として利用してはいけません。」 -> 「文書のアクセシビリティを損なうため、order や flex-flow/flex-direction の \*-reverse 値をソース順序の修正の代用として利用してはいけません。」 +次の例ではでリンクからリンクへとタブキーを押していくと、フォーカススタイルが強調表示されます。これで、 `flex-direction` を使用してフレックスアイテムの順序を変更しても、タブ順序は変更されず、ソースコードの順序に従うことで続けることが分かります。 -> [!NOTE] -> 数年間にわたって Firefox には、ブラウザーの挙動と異なりソース上の順序ではなく表示上の順序に従うというバグがありました。このバグは現在は修正されています。最新のユーザーエージェントは仕様に従っているものとして、常にソース上の順序を文書の論理的な順序として扱うべきです。 +```html live-sample___flex-direction +
+ + + +
+``` -以下の例ではリンクからリンクにタブ移動した際に、どれが強調されているかわかりやすいように focus スタイルを加えています。`flex-direction` を使って表示順を変更した場合でも、タブ順序はソース上の順序に従って移動することがわかります。 +```css live-sample___flex-direction +.box > * { + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + padding: 10px; +} -{{EmbedGHLiveSample("css-examples/flexbox/order/flex-direction.html", '100%', 440)}} +.box > * a:focus { + background-color: yellow; + color: black; +} -`flex-direction` の変更がナビゲーションの順序を変更しないのと同様に、描画の順序についても変更されることはありません。あくまでアイテムの表示上の順序が逆転するだけです。 +.box { + border: 2px dotted rgb(96 139 168); + display: flex; + flex-direction: row-reverse; +} +``` + +{{EmbedLiveSample("flex-direction")}} + +`flex-direction` の変更がタブ順を変更しないのと同様に、描画の順序についても変更されることはありません。あくまでアイテムの表示上の順序が逆転するだけです。 ## order プロパティ フレックスアイテムが表示される順序を逆転することができましたが、それに加えて {{cssxref("order")}} プロパティを使用することでアイテム個別に表示される順序を変更することができます。 -`order` プロパティは、アイテムを*数字で順序づけたグループ*でレイアウトするよう設計されています。つまりアイテムはグループ内での順序を表す整数に割り当てられ、その数字が小さい順に表示されるということです。同じ数字が複数のアイテムに割り当てられているときは、ソース上に現れる順に表示されます。 +{{cssxref("order")}} プロパティは、アイテムを*数字で順序づけたグループ*でレイアウトするよう設計されています。つまりアイテムはグループ内での順序を表す整数に割り当てられ、その数字が小さい順に表示されるということです。同じ数字が複数のアイテムに割り当てられているときは、ソース上に現れる順に表示されます。 例として、5 つのアイテムに対して以下のように `order` を割り当てます。 @@ -79,33 +102,109 @@ l10n: 以下の例で値を変更して、表示順がどのように変わるか試してみてください。また `flex-direction` を `row-reverse` に変えたときに何が起こるか、つまり先頭が変わるために反対側から並べられることを確かめましょう。 -{{EmbedGHLiveSample("css-examples/flexbox/order/order.html", '100%', 500)}} - -フレックスアイテムの既定の `order` は `0` です。したがって 0 より大きい `order` をもつアイテムは、明示的に `order` を指定されていないアイテムの後ろに表示されます。 - -`order` には負の値を指定することもでき、ほかのアイテムはそのままの順序を保ちながら一つのアイテムだけを先頭に表示したい場合になどに有用です。先頭に表示したいアイテムの順序を `-1` を設定することで、0 より小さい `order` のこのアイテムが常に先頭に表示されるようになります。 +```html live-sample___order +
+ + + + + +
+``` + +```css live-sample___order +.box > * { + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + padding: 10px; +} + +.box { + border: 2px dotted rgb(96 139 168); + display: flex; + flex-direction: row; +} +.box :nth-child(1) { + order: 2; +} +.box :nth-child(2) { + order: 3; +} +.box :nth-child(3) { + order: 1; +} +.box :nth-child(4) { + order: 3; +} +.box :nth-child(5) { + order: 1; +} +``` + +{{EmbedLiveSample("order")}} + +フレックスアイテムの既定の `order` は `0` です。したがって `0` より大きい `order` をもつアイテムは、明示的に `order` を指定されていないアイテムの後ろに表示されます。 + +`order` には負の値を指定することもでき、ほかのアイテムはそのままの順序を保ちながら一つのアイテムだけを先頭に表示したい場合になどに有用です。先頭に表示したいアイテムの順序を `-1` を設定することで、 `0` より小さい `order` のこのアイテムが常に先頭に表示されるようになります。 以下の例では フレックスボックスを使ってレイアウトをしています。HTML の中で指定されている `active` クラスを別のアイテムに付け替えることで、レイアウトの先頭に幅すべてを使って表示されるアイテムを変更することができ、残りのアイテムは次の行に表示されるようになります。 -{{EmbedGHLiveSample("css-examples/flexbox/order/negative-order.html", '100%', 520)}} +```html live-sample___negative-order +
+ + + + + +
+``` + +```css live-sample___negative-order +* { + box-sizing: border-box; +} + +.box > * { + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + padding: 10px; +} + +.box { + width: 500px; + border: 2px dotted rgb(96 139 168); + display: flex; + flex-wrap: wrap; + flex-direction: row; +} + +.active { + order: -1; + flex: 1 0 100%; +} +``` + +{{EmbedLiveSample("negative-order")}} アイテムは仕様書の中で _order-modified document order_ として述べられているものに従って表示されます。アイテムが表示される前に、`order` プロパティの値が考慮されます。 -`order` はアイテムの描画順についても変更します。`order` の値が小さいものから先に描画され、大きくなる順に描画されていきます。 +`order` はアイテムの描画順も変更します。 `order` の値が低いアイテムが最初に描画され、 `order` の値が高いアイテムがその後に描画されます。 ## order プロパティとアクセシビリティ -`order` プロパティの使用は、`flex-direction` による方向の変更と同様のアクセシビリティに対する影響があります。`order` は描画の順序および表示上の順序を変更しますが、逐次的なナビゲーションの順序は変更しません。そのため、もしユーザーがアイテム間の移動をタブによって行った場合、レイアウト中を混乱するような動作で飛び回っているように見えるでしょう。 +`order` プロパティを使用するとのアクセシビリティの影響は、 `flex-direction` で方向を変更することと同じ影響があります。 `order` を使用すると、アイテムが描画される順番と、視覚的に表示される順番が変更されます。アイテムの順次ナビゲーション順は変更されません。そのため、ユーザーがページ上のコンテンツをキーボードでタブキーで移動している場合、コンテンツ内をとても混乱した方法でジャンプしてしまう可能性があります。 -この記事中の例でタブ移動を試すことで、`order` がポインティングデバイスを使わないユーザーにおかしな経験をさせてしまう可能性があることがわかるでしょう。表示上の順序と論理的な順序の分断とそれによって起こりうるアクセシビリティの問題についてさらに理解するためには、以下のページを参照してください。 +この記事中の例でタブ移動を試すと、 `order` がマウスのようなポインティングデバイスを使わないユーザーにおかしな体験をさせてしまう可能性があることがわかるでしょう。表示上の順序と論理的な順序の分断とそれによって起こりうるアクセシビリティの問題についてさらに理解するためには、以下のページを参照してください。 -- [Flexbox and the keyboard navigation disconnect](https://tink.uk/flexbox-the-keyboard-navigation-disconnect/) -- [HTML Source Order vs CSS Display Order](https://adrianroselli.com/2015/10/html-source-order-vs-css-display-order.html) -- [The Responsive Order Conflict for Keyboard Focus](https://alastairc.uk/2017/06/the-responsive-order-conflict/) +- [Flexbox and the keyboard navigation disconnect](https://tink.uk/flexbox-the-keyboard-navigation-disconnect/) (tink.uk, 2016) +- [HTML Source Order vs CSS Display Order](https://adrianroselli.com/2015/10/html-source-order-vs-css-display-order.html) (adrianroselli.com, 2015) +- [The Responsive Order Conflict for Keyboard Focus](https://alastairc.uk/2017/06/the-responsive-order-conflict/) (alastairc.uk, 2017) -## order の用途 +## `order` の用途 -フレックスアイテムの論理的な順序、そして読むときの順序が表示上の順序と分かれていることが役に立つ場合があります。気をつけて使えば `order` プロパティは、いくつかのよくあるパターンを簡単に実装するために役に立ちます。 +一部の用途では、論理的なフレックスアイテムの順序(したがって読み取り順)と視覚的な順序が異なることが有益な場合があります。気をつけて使えば `order` プロパティは、いくつかのよくあるパターンを簡単に実装するために役に立ちます。 例えばニュース記事を表示するカードのデザインがあったとします。ニュースの見出しはハイライトされる重要なもので、またユーザーが読みたいものを探すためにタブでほかの見出しからジャンプする対象となる要素でもあります。カードには日付もあり、作りたいデザインは以下のようなものであるとします。 @@ -113,8 +212,59 @@ l10n: 表示上では日付が見出しの上に現れています。しかしスクリーンリーダーによって読み上げられるときには、タイトルが先に読まれて日付はその後が望ましいと思っているとします。こういったことを `order` プロパティで実現することができます。 -カードをフレックスコンテナーとして、 `flex-direction` を `column` に設定します。そして、日付は `order` を `-1` に設定します。これによって見出しの上に日付を引き上げることができます。 - -{{EmbedGHLiveSample("css-examples/flexbox/order/usecase-order.html", '100%', 730)}} - -この例のような細かな調整は `order` プロパティを使うのにふさわしい状況です。読むためやタブ移動のための論理的な順序を保ち、アクセシビリティと構造化された形を維持してください。そして `order` プロパティは純粋に視覚的なデザインの調整のために使ってください。その際にはユーザーがキーボードでタブ移動をする対象となるアイテムの順序変更をしていないか留意してください。特に比較的新しいレイアウトを使うときには、マウスやタッチ画面ではなく、キーボードのみによるサイト操作の確認を確実にテストに含めた方がよいでしょう。そのテストで、開発時の選択がコンテンツの移動を難しくしてしまっているかどうか、すぐにわかるようになるでしょう。 +カードをフレックスコンテナーとして、 `flex-direction` を `column` に設定します。そして、日付は `order` を `-1` に設定することで、見出しの上に配置します。 + +```html live-sample___usecase-order +
+
+

ニュースアイテムのタイトル

+
2017 年 11 月 1 日
+

ニュースアイテムのコンテンツです。とても価値のあるニュースです。

+
+
+

もう一つのタイトル

+
2017 年 11 月 6 日
+

ニュースアイテムのコンテンツです。とても価値のあるニュースです。

+
+
+``` + +```css live-sample___usecase-order +body { + font-family: sans-serif; +} + +.wrapper { + display: flex; + flex: 1 1 200px; + gap: 1em; +} + +.card { + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + padding: 1em; + display: flex; + flex-direction: column; +} + +.date { + order: -1; + text-align: right; +} +``` + +{{EmbedLiveSample("usecase-order", "", "220px")}} + +この例のような細かな調整は `order` プロパティを使うのにふさわしい状況です。文書内の読み上げ順やタブ順と同じ論理順を維持し、最もアクセシビリティが高く構造化された方法で維持しましょう。そして `order` プロパティは純粋に視覚的なデザインの調整のために使いましょう。その際にはユーザーがキーボードでタブ移動をする対象となるアイテムの順序変更をしていないか留意してください。特に比較的新しいレイアウトを使うときには、マウスやタッチ画面ではなく、キーボードのみによるサイト操作の確認を確実にテストに含めた方がよいでしょう。そのテストで、開発時の選択がコンテンツの移動を難しくしてしまっているかどうか、すぐにわかるようになるでしょう。 + +## 関連情報 + +- [フレックスボックスの概要](/ja/docs/Web/CSS/CSS_flexible_box_layout/Basic_concepts_of_flexbox) +- [フレックスボックスと他のレイアウト方法の関係](/ja/docs/Web/CSS/CSS_flexible_box_layout/Relationship_of_flexbox_to_other_layout_methods) +- [フレックスコンテナー内のアイテムの配置](/ja/docs/Web/CSS/CSS_flexible_box_layout/Aligning_items_in_a_flex_container) +- [主軸方向のフレックスアイテムの比率の制御](/ja/docs/Web/CSS/CSS_flexible_box_layout/Controlling_ratios_of_flex_items_along_the_main_axis) +- [フレックスアイテムの折り返しをマスターする](/ja/docs/Web/CSS/CSS_flexible_box_layout/Mastering_wrapping_of_flex_items) +- [フレックスボックスの典型的な用途](/ja/docs/Web/CSS/CSS_flexible_box_layout/Typical_use_cases_of_flexbox) +- [CSS フレックスボックスレイアウト](/ja/docs/Web/CSS/CSS_flexible_box_layout)モジュール diff --git a/files/ja/web/css/css_flexible_box_layout/ordering_flex_items/order-card.png b/files/ja/web/css/css_flexible_box_layout/ordering_flex_items/order-card.png new file mode 100644 index 0000000000000000000000000000000000000000..3bcd5c7ad52d6b395cc0677e03f62f5882ead260 GIT binary patch literal 7043 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 + + +``` + +```css live-sample___navigation +nav { + border: 2px solid #eeeeee; +} + +nav a { + text-decoration: none; + color: #000; + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + padding: 10px; + display: block; +} + +nav ul { + list-style: none; + margin: 0; + padding: 0; + display: flex; + justify-content: space-between; +} +``` -{{EmbedGHLiveSample("css-examples/flexbox/use-cases/navigation.html", '100%', 550)}} +{{EmbedLiveSample("navigation")}} ### アイテムの内側に余白を分配 -ナビゲーションでのもう一つのパターンは、余白をアイテムの間ではなく、アイテム自身の内部に配置することです。この場合は、 {{cssxref("flex")}} プロパティを使うことで、アイテムを互いの比率を保ったまま伸縮することができます。[主軸方向のフレックスアイテムの比率の制御](/ja/docs/Web/CSS/CSS_flexible_box_layout/Controlling_ratios_of_flex_items_along_the_main_axis)に書かれている通りです。 +ナビゲーションでのもう一つのパターンは、余白をアイテムの間ではなく、アイテム自身の内部に配置することです。 {{cssxref("flex")}} プロパティを使うことで、アイテムを互いの比率を保ったまま伸縮することができます。[主軸方向のフレックスアイテムの比率の制御](/ja/docs/Web/CSS/CSS_flexible_box_layout/Controlling_ratios_of_flex_items_along_the_main_axis)に書かれている通りです。 -もしナビゲーションアイテムの size プロパティを尊重しつつ、利用できる空間を均等に共有したいのであれば、 `flex: auto` を使用することができます。これは `flex: 1 1 auto` の一括指定で、すべてのアイテムは flex-basis が auto の状態から伸縮します。これは、より大きなアイテムは、利用できる空間の大きさの割り当てが他と同じだけであったとしても、より大きなサイズから始めるので、より大きな空間を占めることということです。 +もしナビゲーションアイテムの size プロパティを尊重しつつ、利用できる空間を均等に共有したいのであれば、 `flex: auto` を使用することができます。これは `flex: 1 1 auto` の一括指定で、すべてのアイテムは flex-basis が `auto` の状態から伸縮します。これは、より大きなアイテムは、利用できる空間の大きさの割り当てが他と同じだけであったとしても、より大きなサイズから始めるので、より大きな空間を占めることということです。 -下記のライブサンプルの `flex: auto` を `flex: 1` に変えてみてください。これは `flex: 1 1 0` の短縮版で、すべてのアイテムの幅が同じになります。なぜなら、 flex-basis が 0 となって空間が均等に分配されるからです。 +下記のライブサンプルの `flex: auto` を `flex: 1` に変えてみてください。これは `flex: 1 1 0` の短縮版で、すべてのアイテムの幅が同じになります。なぜなら、 `flex-basis` が `0` となって空間が均等に分配されるからです。 -{{EmbedGHLiveSample("css-examples/flexbox/use-cases/navigation-flex.html", '100%', 550)}} +```html live-sample___navigation-flex + +``` + +```css live-sample___navigation-flex +nav { + border: 2px solid #eeeeee; +} +nav ul { + list-style: none; + margin: 0; + padding: 0; + display: flex; +} + +nav a { + text-decoration: none; + color: #000; + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + padding: 10px; + display: block; +} + +nav li { + flex: auto; +} +``` + +{{EmbedLiveSample("navigation-flex")}} ## ナビゲーションの分割 主軸(横軸)でアイテムを整列するもうひとつの方法は、マージンを auto にすることです。これにより、一方のアイテム群を左揃えにして別のアイテム群を右揃えにする、というナビゲーションバーのデザインパターンが可能になります。下記の例では、 [auto マージンを使用した主軸上での配置](/ja/docs/Web/CSS/CSS_flexible_box_layout/Aligning_items_in_a_flex_container#auto_マージンを使用した主軸上での配置)に書かれている、マージンを auto にする技法を使っています。 -アイテムは、フレックスボックスの初期動作である `flex-start` で主軸に配置されています。 [`gap`](/ja/docs/Web/CSS/gap) プロパティを使用してアイテム間にすき間を作成しています。そして、左マージンを auto にすることで、最後のアイテムを右に配置しています。このクラスをあるアイテムから別のアイテムに移動させることで、分割される位置を変更することができます。 +アイテムは、フレックスボックスの初期動作である `normal` であり、これが `start` として動作します。 [`gap`](/ja/docs/Web/CSS/gap) プロパティを使用してアイテム間にすき間を作成しています。そして、 `margin-left` を `auto` にすることで、最後のアイテムを右に配置しています。このクラスをあるアイテムから別のアイテムに移動させることで、分割される位置を変更することができます。 + +```html-nolint live-sample___split-navigation + +``` -{{EmbedGHLiveSample("css-examples/flexbox/use-cases/split-navigation.html", '100%', 550)}} +```css live-sample___split-navigation +nav { + border: 2px solid #eeeeee; +} + +nav a { + text-decoration: none; + color: #000; + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + padding: 10px; + display: block; +} + +nav ul { + list-style: none; + margin: 0; + padding: 0; + display: flex; + gap: 20px; +} + +.push-right { + margin-left: auto; +} +``` + +{{EmbedLiveSample("split-navigation")}} ## アイテムの中央揃え フレックスボックスの登場以前、開発者たちは「ウェブデザインで最も難しいのは垂直方向の中央揃えだ」と冗談を言っていました。下記のライブ例のとおり、フレックスボックスの配置プロパティを使用することで、簡単に解決できるようになりました。 -配置では、 `flex-start` でアイテムを先頭に、 `flex-end` で末尾に配置することができます。 +配置では、 `start` でアイテムを先頭に、 `end` で末尾に配置することができます。 + +```html live-sample___center +
+
+
+``` + +```css live-sample___center +.box { + height: 300px; + border: 2px dotted rgb(96 139 168); + display: flex; + align-items: center; + justify-content: center; +} + +.box div { + border: 2px solid rgb(96 139 168); + border-radius: 5px; + background-color: rgb(96 139 168 / 0.2); + width: 100px; + height: 100px; +} +``` -{{EmbedGHLiveSample("css-examples/flexbox/use-cases/center.html", '100%', 700)}} +{{EmbedLiveSample("center", "", "320px")}} -将来、ボックス配置の各プロパティがブロック要素のレイアウト方法として完全に実装されれば、単一のアイテムの中央揃えのためにフレックスコンテナーを作る必要はなくなります。しかし現状では、1 つのものを別のものの中で正確に中央に配置したければ、フレックスボックスを使うことになります。上記の例のように、コンテナーをフレックスコンテナーとして扱ってフレックスコンテナーに `align-items` を指定するか、フレックスアイテム自身に `align-self` を指定してください。 +[CSS ボックス配置](/ja/docs/Web/CSS/CSS_box_alignment)プロパティを使用すると、フレックスボックスを使用せずに、ある要素の内部で別の要素を垂直方向に中央揃えすることができます。例えば、ボックスからフレックスプロパティを除去し、 `align-content: center` を追加してみてください。次に、水平方向に中央揃えしたい要素に `margin: auto` を追加します。 ## フッターが下端に張り付くカード @@ -63,23 +196,101 @@ l10n: ![2 枚のカード部品は、部品の内部がラッパーと一緒に伸びることはない。](flex-cards.png) -フレックスボックスはこれを解決できます。カード自身もフレックスコンテナーにして、 {{cssxref("flex-direction")}}`: column` を指定します。そしてカードの本文領域に `flex: 1` を指定します。これは `flex: 1 1 0` の一括指定です。アイテムは `0` の flex-basis をもとに伸縮します。引き伸ばせるフレックスアイテムが本文領域だけの場合、本文領域はフレックスコンテナー内の空間をすべて取り込み、フッターを下端に張り付かせます。ライブサンプルから `flex` プロパティを削除すると、フッターが本文の真下に移動するのを確認できます。 +フレックスボックスはこれを解決できます。カード自身もフレックスコンテナーにして、 {{cssxref("flex-direction", "flex-direction: column")}} を指定します。そしてカードの本文領域に `flex: 1` を指定します。これは `flex: 1 1 0` の一括指定です。アイテムは `0` の `flex-basis` をもとに伸縮します。引き伸ばせるフレックスアイテムが本文領域だけの場合、本文領域はフレックスコンテナー内の空間をすべて取り込み、フッターを下端に張り付かせます。ライブサンプルから `flex` プロパティを削除すると、フッターが本文の真下に移動するのを確認できます。 + +```html live-sample___cards +
+
+
+

このカードにはあまりコンテンツがありません。

+
+
カードフッター
+
+
+
+

+ このカードにはより多くのコンテンツが格納されているため、カードが配置されているコンテナーの高さを定義することになります。カードをグリッドレイアウトで配置したので、カードそのものは同じ高さまで引き伸ばされます。 +

+
+
カードフッター
+
+
+``` -{{EmbedGHLiveSample("css-examples/flexbox/use-cases/cards.html", '100%', 800)}} +```css live-sample___cards +body { + font-family: sans-serif; +} +.cards { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + grid-gap: 10px; +} + +.card { + border: 2px solid rgb(96 139 168); + border-radius: 5px; + display: flex; + flex-direction: column; +} + +.card .content { + padding: 10px; + flex: 1 1 auto; +} + +.card footer { + background-color: rgb(96 139 168 / 0.2); + padding: 10px; +} +``` + +{{EmbedLiveSample("cards", "", "280px")}} ## メディアオブジェクト -メディアオブジェクトは、ウェブデザインでよく見られるパターンです。このパターンでは、画像やその他の要素が片側に、テキストが右側に配置されています。メディアオブジェクトは、反転させることができるのが理想です。すなわち、画像を左から右に移動することです。 +メディアオブジェクト(画像やその他のメディア要素に説明テキストが横に並んでいるもの)は、ウェブデザインでは一般的なパターンです。メディアオブジェクトは反転できるべきであり、画像をもう一方の端へと移動できるようにします。 + +このパターンはコメントや、画像をその説明の隣に置く場所で使用されます。フレックスボックスを使用して、画像を含むメディアオブジェクトの一部が画像からサイズ情報を取得し、メディアオブジェクトのコンテンツが残りの空間を占めるように伸縮することができます。 + +この例では、メディアオブジェクトは `flex-start` に配置され、 `.content` は伸長するように設定され、伸長係数は `1` に設定されています。これらのプロパティは、上記の列のレイアウトカードパターンで使用されているものと同じです。 + +```html-nolint live-sample___media +
+
+ 青空に色とりどりの風船が映える +
+
+ これはメディアオブジェクトのコンテンツです。フレックスコンテナー内に直接配置されたアイテムは、 flex-start に配置されます。 +
+
+``` + +```css live-sample___media +img { + max-width: 100%; + display: block; +} -このパターンは、コメント欄をはじめ、画像や説明を表示する必要がある場所でよく見られます。フレックスボックスを使用すると、画像を含むメディアオブジェクトの部分が画像から大きさを取得し、メディアオブジェクトの本文が残りの空間を確保するように拡大縮小します。 +.media { + border: 2px dotted rgb(96 139 168); + display: flex; + align-items: flex-start; +} -下のライブ例では、メディアオブジェクトが表示されています。配置プロパティを使用して、横軸のアイテムを `flex-start` に揃え、`.content` のフレックスアイテムを `flex: 1` に設定しています。前述のカラムレイアウトカードのパターンと同様に、`flex: 1` を使用することで、カードのこの部分を伸長させることができます。 +.media .content { + flex: 1; + padding: 10px; +} +``` -{{EmbedGHLiveSample("css-examples/flexbox/use-cases/media.html", '100%', 600)}} +{{EmbedLiveSample("media", "", "320px")}} -このライブ例では、デザインの中でメディアオブジェクトを制約するさまざまな方法を試してみることができます。 +このライブサンプルでは、デザインの中でメディアオブジェクトを制約するさまざまな方法を試してみることができます。 -画像が大きくなりすぎるのを防ぐには、 {{cssxref("max-width")}} を画像に指定します。画像領域のフレックスボックスの指定は初期値のままなので、縮むことはできますが伸びることはできません。また、初期値では `flex-basis` は auto なので、画像の {{cssxref("width")}} や max-width が `flex-basis` となります。 +画像が大きくなりすぎるのを防ぐために、 {{cssxref("max-width")}} を画像に指定してください。画像領域のフレックスボックスの指定は初期値のままなので、縮むことはできますが伸びることはできません。また、初期値では `flex-basis` は auto なので、画像の {{cssxref("width")}} や `max-width` が `flex-basis` となります。 ```css .image img { @@ -87,7 +298,7 @@ l10n: } ``` -両方の領域の比率を維持したまま伸縮させることもできます。両者に `flex: 1` を指定すると、0 の {{cssxref("flex-basis")}} をもとに伸縮することになります。つまり両者の幅は同じになります。内容物を元に、両方とも `flex: auto` に設定すると、内容物の寸法や、画像の幅などフレックスアイテムに直接適用される大きさに合わせて拡大縮小することができます。 +両方の領域の比率を維持したまま伸縮させることもできます。両者に `flex: 1` を指定すると、`0` の {{cssxref("flex-basis")}} をもとに伸縮することになります。つまり両者の幅は同じになります。内容物を元に、両方とも `flex: auto` に設定すると、内容物の寸法や、画像の `width` などフレックスアイテムに直接適用される大きさに合わせて伸縮することができます。 ```css .media .content { @@ -113,27 +324,98 @@ l10n: } ``` -### メディアオブジェクトを反転させる +### メディアオブジェクトの反転 + +画像が右で文章が左になるようにメディアオブジェクトの表示を切り替えるには、`flex-direction` プロパティに `row-reverse` を指定します。 + +この例では、 `flipped` クラスを `media` クラスの隣に追加しました。 HTML からクラスを除去すると、表示がどのように変化するかが分かります。 + +```html-nolint live-sample___media-flipped +
+
+ 青空に色とりどりの風船が映える +
+
+ これはメディアオブジェクトのコンテンツです。フレックスコンテナー内に直接配置されたアイテムは、 flex-start に配置されます。 +
+
+``` + +```css live-sample___media-flipped +img { + max-width: 100%; + display: block; +} + +.media { + border: 2px dotted rgb(96 139 168); + display: flex; + align-items: flex-start; +} -画像が右で文章が左になるようにメディアオブジェクトの表示を切り替えるには、`flex-direction` プロパティに `row-reverse` を指定します。下記のライブサンプルでは、`flipped` のクラスを `.media` の隣に追加することで実現しています。 HTML からそのクラスを削除すれば、どのように表示が変わるのかが分かるでしょう。 +.flipped { + flex-direction: row-reverse; +} + +.media .content { + flex: 1; + padding: 10px; +} +``` -{{EmbedGHLiveSample("css-examples/flexbox/use-cases/media-flipped.html", '100%', 650)}} +{{EmbedLiveSample("media-flipped", "", "320px")}} ## フォームコントロール -フレックスボックスはフォームコントロールのスタイル指定に関しては特に便利です。フォームにはたくさんのマークアップや小さな要素があり、それらを配置したいと考えるはずです。よくあるパターンは {{htmlelement("input")}} 要素と {{htmlelement("button")}} の組み合わせでしょう。検索フォームや、単に訪問者にメールアドレスを入力してもらう用途などで使われます。 +フレックスボックスはフォームコントロールのスタイル指定に関しては特に便利です。フォームにはいくつもの小さな要素があり、それらを互いに整列したいと考えるはずです。よくあるパターンは {{htmlelement("label")}} と {{htmlelement("input")}} の組みと、さらに {{htmlelement("button")}} との組み合わせで、おそらく検索フォームやメールマガジンの登録フォームなどの、来訪者がメールアドレスを入力する局面などで使用されます。 + +フレックスボックスならばこのようなレイアウトを簡単に実現できます。 `