From 1c83c9e42c7aac942510f08451a36f8156843793 Mon Sep 17 00:00:00 2001 From: HoJeong Im <39ghwjd@naver.com> Date: Mon, 18 Sep 2023 17:16:28 +0900 Subject: [PATCH 001/268] [ko] add index.md for `web/glossary/certified` (#15704) --- files/ko/glossary/certified/index.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 files/ko/glossary/certified/index.md diff --git a/files/ko/glossary/certified/index.md b/files/ko/glossary/certified/index.md new file mode 100644 index 00000000000000..50be2cfcdf40ff --- /dev/null +++ b/files/ko/glossary/certified/index.md @@ -0,0 +1,16 @@ +--- +title: 인증됨 +slug: Glossary/Certified +l10n: + sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34 +--- + +{{GlossarySidebar}} + +**인증됨**은 애플리케이션, 콘텐츠 또는 데이터 전송이 해당 분야의 전문 지식을 갖춘 전문가에 의해 성공적으로 평가되어 완전성, 보안 및 신뢰성을 가진다는 것을 의미합니다. + +{{glossary("Cryptography", "암호화")}} 인증에 대한 자세한 내용은, {{glossary("Digital Certificate", "디지털 인증서")}}를 참조하세요. + +## 같이 보기 + +- 위키백과의 [인증](https://en.wikipedia.org/wiki/Professional_certification#Computer_technology) From ee1bbb565f754a318a596e1faa9a6294f22fd619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9A=8F=E4=BA=91?= Date: Mon, 18 Sep 2023 16:37:07 +0800 Subject: [PATCH 002/268] [zh-cn]: add View Transitions API document translation (#15643) Co-authored-by: A1lo --- .../api/document/startviewtransition/index.md | 71 ++++ .../web/api/view_transitions_api/index.md | 305 ++++++++++++++++++ .../web/api/viewtransition/finished/index.md | 55 ++++ files/zh-cn/web/api/viewtransition/index.md | 104 ++++++ .../web/api/viewtransition/ready/index.md | 93 ++++++ .../viewtransition/skiptransition/index.md | 45 +++ .../updatecallbackdone/index.md | 40 +++ .../index.md | 71 ++++ .../index.md | 62 ++++ .../_doublecolon_view-transition-new/index.md | 107 ++++++ .../_doublecolon_view-transition-old/index.md | 107 ++++++ .../css/_doublecolon_view-transition/index.md | 50 +++ 12 files changed, 1110 insertions(+) create mode 100644 files/zh-cn/web/api/document/startviewtransition/index.md create mode 100644 files/zh-cn/web/api/view_transitions_api/index.md create mode 100644 files/zh-cn/web/api/viewtransition/finished/index.md create mode 100644 files/zh-cn/web/api/viewtransition/index.md create mode 100644 files/zh-cn/web/api/viewtransition/ready/index.md create mode 100644 files/zh-cn/web/api/viewtransition/skiptransition/index.md create mode 100644 files/zh-cn/web/api/viewtransition/updatecallbackdone/index.md create mode 100644 files/zh-cn/web/css/_doublecolon_view-transition-group/index.md create mode 100644 files/zh-cn/web/css/_doublecolon_view-transition-image-pair/index.md create mode 100644 files/zh-cn/web/css/_doublecolon_view-transition-new/index.md create mode 100644 files/zh-cn/web/css/_doublecolon_view-transition-old/index.md create mode 100644 files/zh-cn/web/css/_doublecolon_view-transition/index.md diff --git a/files/zh-cn/web/api/document/startviewtransition/index.md b/files/zh-cn/web/api/document/startviewtransition/index.md new file mode 100644 index 00000000000000..c3b3db261f27e4 --- /dev/null +++ b/files/zh-cn/web/api/document/startviewtransition/index.md @@ -0,0 +1,71 @@ +--- +title: Document:startViewTransition() 方法 +short-title: startViewTransition() +slug: Web/API/Document/startViewTransition +--- + +{{APIRef("Document")}}{{SeeCompatTable}} + +{{domxref("View Transitions API", "View Transitions API", "", "nocode")}} 的 **`startViewTransition()`** 方法开始一个新的视图过渡,并返回一个 {{domxref("ViewTransition")}} 对象来表示它。 + +当调用 `startViewTransition()` 时,将按照[视图过渡过程](/zh-CN/docs/Web/API/View_Transitions_API#视图过渡过程)中所述的步骤序列进行。 + +## 语法 + +```js-nolint +startViewTransition(callback) +``` + +### 参数 + +- `callback` + - : 一个在视图过渡过程中通常用于更新 DOM 的回调函数,它返回一个 {{jsxref("Promise")}}。这个回调函数在 API 截取了当前页面的屏幕截图后被调用。当回调函数返回的 Promise 兑现时,视图过渡将在下一帧开始。如果回调函数返回的 Promise 拒绝,过渡将被放弃。 + +### 返回值 + +一个 {{domxref("ViewTransition")}} 对象实例。 + +## 示例 + +### 基本用法 + +在[基础视图过渡演示](https://mdn.github.io/dom-examples/view-transitions/)中,`updateView()` 函数处理支持和不支持 View Transitions API 的浏览器。在支持的浏览器中,我们调用 `startViewTransition()` 来启动视图过渡,而不关心返回值。 + +```js +function updateView(event) { + // 处理在 上触发事件的差异 + let targetIdentifier; + if (event.target.firstChild === null) { + targetIdentifier = event.target; + } else { + targetIdentifier = event.target.firstChild; + } + + const displayNewImage = () => { + const mainSrc = `${targetIdentifier.src.split("_th.jpg")[0]}.jpg`; + galleryImg.src = mainSrc; + galleryCaption.textContent = targetIdentifier.alt; + }; + + // 浏览器不支持 View Transitions 时的回退方案: + if (!document.startViewTransition) { + displayNewImage(); + return; + } + + // 开始一次视图过渡: + const transition = document.startViewTransition(() => displayNewImage()); +} +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) diff --git a/files/zh-cn/web/api/view_transitions_api/index.md b/files/zh-cn/web/api/view_transitions_api/index.md new file mode 100644 index 00000000000000..710c2e61365407 --- /dev/null +++ b/files/zh-cn/web/api/view_transitions_api/index.md @@ -0,0 +1,305 @@ +--- +title: View Transitions API +slug: Web/API/View_Transitions_API +--- + +{{SeeCompatTable}}{{DefaultAPISidebar("View Transitions API")}} + +**View Transitions API** 提供了一种机制,可以在更新 DOM 内容的同时,轻松地创建不同 DOM 状态之间的动画过渡。同时还可以在单个步骤中更新 DOM 内容。 + +## 概念和用法 + +视图过渡是一种流行的设计选择,可以减少用户认知负荷,帮助他们保持上下文,并减少他们在应用程序的状态或视图之间移动时感知的加载延迟。 + +但是,在 Web 上创建视图过渡历来很困难。在单页应用程序(SPA)中,状态之间的过渡往往需要编写大量的 CSS 和 JavaScript 来: + +- 处理新旧内容的加载和定位。 +- 为新旧状态添加动画以创建过渡。 +- 防止用户与旧内容的意外交互而导致的问题。 +- 完成过渡后删除旧内容。 + +像阅读位置丢失、焦点混乱和实时区域宣告的奇怪行为等无障碍问题,也可能由于新旧内容同时存在于 DOM 中而导致。此外,跨文档视图过渡(即在常规非 SPA 网站中跨越不同页面)是不可能的。 + +View Transitions API 提供了一种更简单的方法来处理必需的 DOM 更改和过渡动画。 + +> **备注:** View Transitions API 目前不支持跨文档视图过渡,但这已计划在未来的规范版本中实现,并正在积极开发中。 + +### 创建基本视图过渡 + +例如,一个 SPA 应用可能包含获取新内容和响应某种事件并更新 DOM 的功能,例如点击导航链接或从服务器推送更新。在我们的[基础视图过渡演示](https://mdn.github.io/dom-examples/view-transitions/)中,我们将其简化为一个 `displayNewImage()` 函数,该函数根据点击的缩略图显示新的全尺寸图像。我们将其封装在 `updateView()` 函数中,该函数仅在浏览器支持时才调用 View Transitions API: + +```js +function updateView(event) { + // 处理在 上触发事件的差异 + const targetIdentifier = event.target.firstChild || event.target; + + const displayNewImage = () => { + const mainSrc = `${targetIdentifier.src.split("_th.jpg")[0]}.jpg`; + galleryImg.src = mainSrc; + galleryCaption.textContent = targetIdentifier.alt; + }; + + // 浏览器不支持 View Transitions 时的回退方案: + if (!document.startViewTransition) { + displayNewImage(); + return; + } + + // 开始一次视图过渡: + const transition = document.startViewTransition(() => displayNewImage()); +} +``` + +这段代码足以处理显示的图像之间的过渡。支持的浏览器将以平滑的交叉淡入淡出(默认的视图过渡)显示新旧图像和标题的变化。它仍可以在不支持的浏览器中工作,但没有漂亮的动画效果。 + +值得一提的是,`startViewTransition()` 返回一个 {{domxref("ViewTransition")}} 实例,该实例包含了多个 Promise, 允许你在到达视图过渡过程的不同阶段时运行代码。 + +### 视图过渡过程 + +让我们来看看这是如何工作的: + +1. 当调用 {{domxref("Document.startViewTransition()", "document.startViewTransition()")}} 时,API 会截取当前页面的屏幕截图。 +2. 接下来,调用传递给 `startViewTransition()` 的回调函数,即 `displayNewImage`,这会导致 DOM 发生更改。 + + 当回调函数成功运行时,{{domxref("ViewTransition.updateCallbackDone")}} Promise 兑现,允许你响应 DOM 更新。 + +3. API 会捕获页面的新状态并实时展示。 +4. API 构造了一个具有以下结构的伪元素树: + + ```plain + ::view-transition + └─ ::view-transition-group(root) + └─ ::view-transition-image-pair(root) + ├─ ::view-transition-old(root) + └─ ::view-transition-new(root) + ``` + + - {{cssxref("::view-transition")}} 是视图过渡叠加层的根元素,它包含所有视图过渡且位于所有其他页面内容的顶部。 + - {{cssxref("::view-transition-old")}} 是旧页面视图的屏幕截图,且 {{cssxref("::view-transition-new")}} 是新页面视图的实时展示。这两者都呈现为替换内容,就像 {{htmlelement("img")}} 或 {{htmlelement("video")}} 那样,这意味着它们可以方便的使用属性进行样式设置,例如 {{cssxref("object-fit")}} 和 {{cssxref("object-position")}}。 + + 当过渡动画即将运行时,{{domxref("ViewTransition.ready")}} Promise 兑现,你可以响应它进行一些操作,例如运行自定义的 JavaScript 动画,而不是默认的动画。 + +5. 旧页面视图的 {{cssxref("opacity")}} 从 1 过渡到 0,而新视图从 0 过渡到 1,这就是默认的交叉淡入淡出效果。 +6. 当过渡动画结束时,{{domxref("ViewTransition.finished")}} Promise 兑现,你可以响应它进行一些操作。 + +### 为不同的元素使用不同的过渡效果 + +目前,当 DOM 更新时发生变化的不同元素都使用相同的过渡动画。如果你想让不同的元素以不同于默认的“root”动画的方式进行过渡,你可以使用 {{cssxref("view-transition-name")}} 属性将它们分开。例如: + +```css +figcaption { + view-transition-name: figure-caption; +} +``` + +我们给 {{htmlelement("figcaption")}} 元素设置了值为 `figure-caption` 的 `view-transition-name`,以将其与页面上的其余部分分开,便于在视图过渡时进行分离。 + +应用此 CSS 后,伪元素树现在如下所示: + +```plain +::view-transition +├─ ::view-transition-group(root) +│ └─ ::view-transition-image-pair(root) +│ ├─ ::view-transition-old(root) +│ └─ ::view-transition-new(root) +└─ ::view-transition-group(figure-caption) + └─ ::view-transition-image-pair(figure-caption) + ├─ ::view-transition-old(figure-caption) + └─ ::view-transition-new(figure-caption) +``` + +第二组伪元素的存在允许将单独的视图过渡样式仅应用于 `
`。不同的新旧页面视图之间捕获和处理是完全独立的。 + +`view-transition-name` 的值可以是除 `none` 之外的任何值——`none` 值表示该元素不参与视图过渡。 + +> **备注:** `view-transition-name` 必须是唯一的。如果两个渲染元素同时具有相同的 `view-transition-name`,{{domxref("ViewTransition.ready")}} 将拒绝并跳过过渡。 + +### 自定义动画 + +视图过渡伪元素具有默认的 [CSS 动画](/zh-CN/docs/Web/CSS/CSS_animations)(在其[参考页面](#css_扩展)中详细介绍)。 + +值得注意的是,`height`、`width`、`position` 和 `transform` 的过渡不使用平滑的淡入淡出动画。相反,高度和宽度过渡使用平滑的缩放动画。同时,位置和变换过渡将使用平滑的移动动画。 + +你可以使用常规 CSS 以任何你想要的方式修改默认动画。 + +例如,你要调整动画速度: + +```css +::view-transition-old(root), +::view-transition-new(root) { + animation-duration: 0.5s; +} +``` + +让我们看些更有趣的东西——`
` 的自定义动画: + +```css +@keyframes grow-x { + from { + transform: scaleX(0); + } + to { + transform: scaleX(1); + } +} + +@keyframes shrink-x { + from { + transform: scaleX(1); + } + to { + transform: scaleX(0); + } +} + +::view-transition-old(figure-caption), +::view-transition-new(figure-caption) { + height: auto; + right: 0; + left: auto; + transform-origin: right center; +} + +::view-transition-old(figure-caption) { + animation: 0.25s linear both shrink-x; +} + +::view-transition-new(figure-caption) { + animation: 0.25s 0.25s linear both grow-x; +} +``` + +在这里,我们创建了一个自定义 CSS 动画并将其应用到 `::view-transition-old(figure-caption)` 和 `::view-transition-new(figure-caption)` 伪元素上。我们还为两者添加了许多其他样式,以使它们保持在同一位置,并防止默认样式干扰我们的自定义动画。 + +请注意,我们还发现了另一种比上面更简单且产生更好结果的过渡选项。我们最终的 `
` 视图过渡看起来像这样: + +```css +figcaption { + view-transition-name: figure-caption; +} + +::view-transition-old(figure-caption), +::view-transition-new(figure-caption) { + height: 100%; +} +``` + +这是有效的,因为默认情况下,`::view-transition-group` 在新旧视图之间过渡高度和宽度。我们只需要在两个状态上设置固定的高度,就可以使其正常工作。 + +> **备注:** [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/)包含了其他几个自定义示例。 + +### 使用 JavaScript 控制动画 + +{{domxref("Document.startViewTransition()", "document.startViewTransition()")}} 方法返回一个 {{domxref("ViewTransition")}} 对象实例,实例中包含多个 Promise 成员,允许你在到达不同状态的过渡时运行 JavaScript。例如,{{domxref("ViewTransition.ready")}} 在伪元素树创建并且动画即将开始时兑现,而 {{domxref("ViewTransition.finished")}} 在动画结束后兑现,此时新页面视图对用户可见且可交互。 + +例如,下面的 JavaScript 可以用于创建从用户单击位置开始的圆形揭示视图过渡,动画由 {{domxref("Web Animations API", "Web Animations API", "", "nocode")}} 提供。 + +```js +// 保存最后一次点击事件 +let lastClick; +addEventListener("click", (event) => (lastClick = event)); + +function spaNavigate(data) { + // 为不支持此 API 的浏览器提供回退方案: + if (!document.startViewTransition) { + updateTheDOMSomehow(data); + return; + } + + // 获取点击位置,或者回退到屏幕中间 + const x = lastClick?.clientX ?? innerWidth / 2; + const y = lastClick?.clientY ?? innerHeight / 2; + // 获取到最远角的距离 + const endRadius = Math.hypot( + Math.max(x, innerWidth - x), + Math.max(y, innerHeight - y), + ); + + // 开始一次视图过渡: + const transition = document.startViewTransition(() => { + updateTheDOMSomehow(data); + }); + + // 等待伪元素创建完成: + transition.ready.then(() => { + // 新视图的根元素动画 + document.documentElement.animate( + { + clipPath: [ + `circle(0 at ${x}px ${y}px)`, + `circle(${endRadius}px at ${x}px ${y}px)`, + ], + }, + { + duration: 500, + easing: "ease-in", + // 指定要附加动画的伪元素 + pseudoElement: "::view-transition-new(root)", + }, + ); + }); +} +``` + +该动画还需要以下 CSS,以关闭默认的 CSS 动画并防止新旧视图状态以任何方式混合(新状态从旧状态上方“擦除”,而不是过渡): + +```css +::view-transition-image-pair(root) { + isolation: auto; +} + +::view-transition-old(root), +::view-transition-new(root) { + animation: none; + mix-blend-mode: normal; + display: block; +} +``` + +## 接口 + +- {{domxref("ViewTransition")}} + - : 表示视图过渡,并提供了在过渡到达不同状态时运行代码的功能(例如,准备运行动画或动画完成),或跳过视图过渡。 + +## 其他接口扩展 + +- {{domxref("Document.startViewTransition()")}} + - : 开始新的视图过渡并返回一个 {{domxref("ViewTransition")}} 对象来表示它。 + +## CSS 扩展 + +### 属性 + +- {{cssxref("view-transition-name")}} + - : 为选定的元素提供单独的标识名称,并使其参与与根视图过渡不同的单独视图过渡——或者如果指定了 `none` 值,则不参与视图过渡。 + +### 伪元素 + +- {{cssxref("::view-transition")}} + - : 视图过渡叠加层的根元素,它包含所有视图过渡且位于所有其他页面内容的顶部。 +- {{cssxref("::view-transition-group", "::view-transition-group()")}} + - : 单个视图过渡的根元素。 +- {{cssxref("::view-transition-image-pair", "::view-transition-image-pair()")}} + - : 视图过渡的旧视图和新视图的容器——过渡前和过渡后。 +- {{cssxref("::view-transition-old", "::view-transition-old()")}} + - : 转换前的旧视图的静态屏幕截图。 +- {{cssxref("::view-transition-new", "::view-transition-new()")}} + - : 转换后的新视图的实时表示。 + +## 示例 + +- [基础视图过渡演示](https://mdn.github.io/dom-examples/view-transitions/):一个基本的图像库演示,其中包含新旧图像之间的单独过渡,以及新旧标题之间的单独过渡。 +- [HTTP 203 播放列表](https://http203-playlist.netlify.app/):一个更复杂的视频播放器演示应用程序,包含了许多不同的视图过渡,在[使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/)中解释了其中的很多视图过渡。 + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) +- [View Transitions API:创建平滑的页面过渡](https://stackdiary.com/view-transitions-api/) diff --git a/files/zh-cn/web/api/viewtransition/finished/index.md b/files/zh-cn/web/api/viewtransition/finished/index.md new file mode 100644 index 00000000000000..2b18bb99966331 --- /dev/null +++ b/files/zh-cn/web/api/viewtransition/finished/index.md @@ -0,0 +1,55 @@ +--- +title: ViewTransition:finished 属性 +short-title: finished +slug: Web/API/ViewTransition/finished +--- + +{{APIRef("View Transitions API")}}{{SeeCompatTable}} + +{{domxref("ViewTransition")}} 接口的 **`finished`** 只读属性是一个 {{jsxref("Promise")}}。会在过渡动画完成(新的页面视图对用户可见且可交互)时兑现。 + +仅当传递给 {{domxref("Document.startViewTransition()", "document.startViewTransition()")}} 的回调函数抛出异常或返回的 Promise 被拒绝时,`finished` 才会被拒绝,这表示页面的新状态未被创建。 + +如果过渡动画无法开始,或在动画期间使用 {{domxref("ViewTransition.skipTransition()")}} 跳过了过渡动画,那么视图过渡依旧可以到达最终状态,因此 `finished` 依旧会被兑现。 + +## 值 + +一个 promise。 + +## 示例 + +### 不同的导航使用不同的过渡效果 + +有时,某些导航需要特定的过渡效果,例如后退导航可能与前进导航的过渡效果不同。处理这种情况的最佳实践是在 `` 元素上设置一个类名以处理过渡(使用特定的选择器应用正确的动画),然后在过渡结束后删除该类名。 + +```js +async function handleTransition() { + if (isBackNavigation) { + document.documentElement.classList.add("back-transition"); + } + + const transition = document.startViewTransition(() => + updateTheDOMSomehow(data), + ); + + try { + await transition.finished; + } finally { + document.documentElement.classList.remove("back-transition"); + } +} +``` + +> **备注:** `isBackNavigation` 不是内置特性;它是一个理论上存在的函数,可以使用 [Navigation API](/zh-CN/docs/Web/API/Navigation_API) 或类似的特性实现。 + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) diff --git a/files/zh-cn/web/api/viewtransition/index.md b/files/zh-cn/web/api/viewtransition/index.md new file mode 100644 index 00000000000000..9b621ecccda8c7 --- /dev/null +++ b/files/zh-cn/web/api/viewtransition/index.md @@ -0,0 +1,104 @@ +--- +title: ViewTransition +slug: Web/API/ViewTransition +--- + +{{APIRef("View Transitions API")}}{{SeeCompatTable}} + +{{domxref("View Transitions API", "View Transitions API", "", "nocode")}} 的 **`ViewTransition`** 接口表示视图过渡,并提供了在过渡到达不同状态时运行代码的功能(例如,准备运行动画,或动画完成),或跳过视图过渡。 + +此对象类型由 {{domxref("Document.startViewTransition()", "document.startViewTransition()")}} 方法返回。当调用 `startViewTransition()` 时,将按照[视图过渡过程](/zh-CN/docs/Web/API/View_Transitions_API#视图过渡过程)中所述的步骤序列进行。这也解释了不同的 Promise 何时兑现。 + +{{InheritanceDiagram}} + +## 实例属性 + +- {{domxref("ViewTransition.finished")}} {{Experimental_Inline}} + - : 一个在过渡动画完成后兑现的 {{jsxref("Promise")}},新的页面视图对用户可见且可交互。 +- {{domxref("ViewTransition.ready")}} {{Experimental_Inline}} + - : 一个在伪元素树创建且过渡动画即将开始时兑现的 {{jsxref("Promise")}}。 +- {{domxref("ViewTransition.updateCallbackDone")}} {{Experimental_Inline}} + - : 当 {{domxref("Document.startViewTransition()", "document.startViewTransition()")}} 的回调返回的 {{jsxref("Promise")}} 兑现时,该 {{jsxref("Promise")}} 也会兑现。 + +## 实例方法 + +- {{domxref("ViewTransition.skipTransition", "skipTransition()")}} {{Experimental_Inline}} + - : 跳过视图过渡的动画部分,但不会跳过运行 {{domxref("Document.startViewTransition()", "document.startViewTransition()")}} 的回调,该回调会更新 DOM。 + +## 示例 + +在下面的示例中,{{domxref("ViewTransition.ready")}} 用于触发从用户点击位置开始的自定义圆形揭示视图过渡,动画由 {{domxref("Web Animations API", "Web Animations API", "", "nocode")}} 提供。 + +```js +// 保存最后一次点击事件 +let lastClick; +addEventListener("click", (event) => (lastClick = event)); + +function spaNavigate(data) { + // 为不支持此 API 的浏览器提供回退方案: + if (!document.startViewTransition) { + updateTheDOMSomehow(data); + return; + } + + // 获取点击位置,或者回退到屏幕中间 + const x = lastClick?.clientX ?? innerWidth / 2; + const y = lastClick?.clientY ?? innerHeight / 2; + // 获取到最远角的距离 + const endRadius = Math.hypot( + Math.max(x, innerWidth - x), + Math.max(y, innerHeight - y), + ); + + // 开始一次视图过渡: + const transition = document.startViewTransition(() => { + updateTheDOMSomehow(data); + }); + + // 等待伪元素创建完成: + transition.ready.then(() => { + // 新视图的根元素动画 + document.documentElement.animate( + { + clipPath: [ + `circle(0 at ${x}px ${y}px)`, + `circle(${endRadius}px at ${x}px ${y}px)`, + ], + }, + { + duration: 500, + easing: "ease-in", + // 指定要附加动画的伪元素 + pseudoElement: "::view-transition-new(root)", + }, + ); + }); +} +``` + +该动画还需要以下 CSS,以关闭默认的 CSS 动画并防止新旧视图状态以任何方式混合(新状态从旧状态上方“擦除”,而不是过渡): + +```css +::view-transition-image-pair(root) { + isolation: auto; +} + +::view-transition-old(root), +::view-transition-new(root) { + animation: none; + mix-blend-mode: normal; + display: block; +} +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) diff --git a/files/zh-cn/web/api/viewtransition/ready/index.md b/files/zh-cn/web/api/viewtransition/ready/index.md new file mode 100644 index 00000000000000..3a13d77acc9c73 --- /dev/null +++ b/files/zh-cn/web/api/viewtransition/ready/index.md @@ -0,0 +1,93 @@ +--- +title: ViewTransition:ready 属性 +short-title: ready +slug: Web/API/ViewTransition/ready +--- + +{{APIRef("View Transitions API")}}{{SeeCompatTable}} + +{{domxref("ViewTransition")}} 接口的 **`ready`** 只读属性是一个 {{jsxref("Promise")}}。会在伪元素树被创建且过渡动画即将开始时兑现。 + +如果视图过渡无法开始,`ready` 就会被拒绝。这可能是由于错误的配置,例如重复的 {{cssxref("view-transition-name")}},或者是因为 {{domxref("Document.startViewTransition()")}} 的回调函数抛出异常或返回的 Promise 被拒绝。 + +## 值 + +一个 promise。 + +## 示例 + +在下面的示例中,`ready` 用于触发从用户点击位置开始的自定义圆形揭示视图过渡,动画由 {{domxref("Web Animations API", "Web Animations API", "", "nocode")}} 提供。 + +```js +// 保存最后一次点击事件 +let lastClick; +addEventListener("click", (event) => (lastClick = event)); + +function spaNavigate(data) { + // 为不支持此 API 的浏览器提供回退方案: + if (!document.startViewTransition) { + updateTheDOMSomehow(data); + return; + } + + // 获取点击位置,或者回退到屏幕中间 + const x = lastClick?.clientX ?? innerWidth / 2; + const y = lastClick?.clientY ?? innerHeight / 2; + // 获取到最远角的距离 + const endRadius = Math.hypot( + Math.max(x, innerWidth - x), + Math.max(y, innerHeight - y), + ); + + // 开始一次视图过渡: + const transition = document.startViewTransition(() => { + updateTheDOMSomehow(data); + }); + + // 等待伪元素创建完成: + transition.ready.then(() => { + // 新视图的根元素动画 + document.documentElement.animate( + { + clipPath: [ + `circle(0 at ${x}px ${y}px)`, + `circle(${endRadius}px at ${x}px ${y}px)`, + ], + }, + { + duration: 500, + easing: "ease-in", + // 指定要附加动画的伪元素 + pseudoElement: "::view-transition-new(root)", + }, + ); + }); +} +``` + +该动画还需要以下 CSS,以关闭默认的 CSS 动画并防止新旧视图状态以任何方式混合(新状态从旧状态上方“擦除”,而不是过渡): + +```css +::view-transition-image-pair(root) { + isolation: auto; +} + +::view-transition-old(root), +::view-transition-new(root) { + animation: none; + mix-blend-mode: normal; + display: block; +} +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) diff --git a/files/zh-cn/web/api/viewtransition/skiptransition/index.md b/files/zh-cn/web/api/viewtransition/skiptransition/index.md new file mode 100644 index 00000000000000..030ab3517cba9a --- /dev/null +++ b/files/zh-cn/web/api/viewtransition/skiptransition/index.md @@ -0,0 +1,45 @@ +--- +title: ViewTransition:skipTransition() 方法 +short-title: skipTransition() +slug: Web/API/ViewTransition/skipTransition +--- + +{{APIRef("View Transitions API")}}{{SeeCompatTable}} + +{{domxref("ViewTransition")}} 接口的 **`skipTransition()`** 方法跳过视图过渡的动画部分,但不跳过更新 DOM 的 {{domxref("Document.startViewTransition()", "document.startViewTransition()")}} 回调函数。 + +## 语法 + +```js-nolint +skipTransition() +``` + +### 参数 + +无 + +### 返回值 + +`undefined`。 + +## 示例 + +```js +// 开始新的视图过渡 +const transition = document.startViewTransition(() => displayNewImage()); + +// 跳过视图过渡动画,仅更新 DOM +transition.skipTransition(); +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) diff --git a/files/zh-cn/web/api/viewtransition/updatecallbackdone/index.md b/files/zh-cn/web/api/viewtransition/updatecallbackdone/index.md new file mode 100644 index 00000000000000..a8d63f15b03256 --- /dev/null +++ b/files/zh-cn/web/api/viewtransition/updatecallbackdone/index.md @@ -0,0 +1,40 @@ +--- +title: ViewTransition:updateCallbackDone 属性 +short-title: updateCallbackDone +slug: Web/API/ViewTransition/updateCallbackDone +--- + +{{APIRef("View Transitions API")}}{{SeeCompatTable}} + +{{domxref("ViewTransition")}} 接口的 **`updateCallbackDone`** 只读属性是一个 {{jsxref("Promise")}}。当传递给 {{domxref("Document.startViewTransition()", "document.startViewTransition()")}} 的回调函数返回的 Promise 兑现时,该 Promise 也会兑现,当回调函数返回的 Promise 被拒绝时,该 Promise 也会被拒绝。 + +当你不关心过渡动画的成功或失败,而只关心 DOM 是否更新以及何时更新时,`updateCallbackDone` 非常有用。 + +## 值 + +一个 promise。 + +## 示例 + +```js +// 开始新的视图过渡 +const transition = document.startViewTransition(() => displayNewImage()); + +transition.updateCallbackDone.then(() => { + // 响应 DOM 更新成功 +}); +``` + +参见[过渡作为增强功能](https://developer.chrome.com/docs/web-platform/view-transitions/#transitions-as-an-enhancement)以获取一个有用的示例。 + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) diff --git a/files/zh-cn/web/css/_doublecolon_view-transition-group/index.md b/files/zh-cn/web/css/_doublecolon_view-transition-group/index.md new file mode 100644 index 00000000000000..8af5074149380c --- /dev/null +++ b/files/zh-cn/web/css/_doublecolon_view-transition-group/index.md @@ -0,0 +1,71 @@ +--- +title: "::view-transition-group" +slug: Web/CSS/::view-transition-group +--- + +{{CSSRef}}{{SeeCompatTable}} + +**`::view-transition-group`** [CSS](/zh-CN/docs/Web/CSS) [伪元素](/zh-CN/docs/Web/CSS/Pseudo-elements)表示单个视图过渡组。 + +在视图过渡期间,`::view-transition-group` 包含在相关的伪元素树上,如[视图过渡过程](/zh-CN/docs/Web/API/View_Transitions_API#视图过渡过程)中所述。它只能是 {{cssxref("::view-transition")}} 的子节点,并且有一个 {{cssxref("::view-transition-image-pair")}} 子节点。 + +`::view-transition-group` 在 UA 样式表中具有以下默认样式: + +```css +html::view-transition-group(*) { + position: absolute; + top: 0; + left: 0; + + animation-duration: 0.25s; + animation-fill-mode: both; +} +``` + +默认情况下,该元素最初会镜像表示 {{cssxref("::view-transition-old")}} 伪元素的大小和位置,即旧视图状态。如果没有旧视图状态,则会镜像表示 {{cssxref("::view-transition-new")}} 伪元素的大小和位置,即新视图状态。 + +如果同时存在新旧两种视图状态,则视图过渡样式表中的样式会将该伪元素的 {{cssxref("width")}} 和 {{cssxref("height")}} 从旧视图状态的边框盒大小动画到新视图状态的边框盒大小。 + +> **备注:** 视图过渡样式表中的样式是在视图过渡期间动态生成的;有关更多详细信息,请参阅规范中的[设置过渡伪元素](https://drafts.csswg.org/css-view-transitions-1/#setup-transition-pseudo-elements)和[更新伪元素样式](https://drafts.csswg.org/css-view-transitions-1/#update-pseudo-element-styles)部分。 + +此外,元素的变换是从旧视图状态的屏幕空间,变换到新视图状态的屏幕空间。由于动画属性的值是在过渡开始时确定的,因此此样式是动态生成的。 + +## 语法 + +```css-nolint +::view-transition-group() { + /* ... */ +} +``` + +`` 可以是以下任何值之一: + +- `*` + - : 使伪元素选择器匹配所有视图过渡组。 +- `root` + - : 使伪元素选择器匹配由 UA 创建的默认 `root` 视图过渡组,该组用于包含整个页面的视图过渡,这意味着任何未通过 {{cssxref("view-transition-name")}} 属性分配给特定视图过渡组的元素。 +- {{cssxref("custom-ident")}} + - : 使伪元素选择器匹配(通过 {{cssxref("view-transition-name")}} 属性将 {{cssxref("custom-ident")}} 分配给元素而创建的)特定视图转换组。 + +## 示例 + +```css +view-transition-group(embed-container) { + animation-duration: 0.3s; + animation-timing-function: ease; + z-index: 1; +} +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [View Transitions API](/zh-CN/docs/Web/API/View_Transitions_API) +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) diff --git a/files/zh-cn/web/css/_doublecolon_view-transition-image-pair/index.md b/files/zh-cn/web/css/_doublecolon_view-transition-image-pair/index.md new file mode 100644 index 00000000000000..e7313d59ef46ef --- /dev/null +++ b/files/zh-cn/web/css/_doublecolon_view-transition-image-pair/index.md @@ -0,0 +1,62 @@ +--- +title: "::view-transition-image-pair" +slug: Web/CSS/::view-transition-image-pair +--- + +{{CSSRef}}{{SeeCompatTable}} + +**`::view-transition-image-pair`** [CSS](/zh-CN/docs/Web/CSS) [伪元素](/zh-CN/docs/Web/CSS/Pseudo-elements)表示一个视图过渡的旧视图状态和新视图状态的容器——即过渡前和过渡后的状态。 + +在视图过渡期间,`::view-transition-image-pair` 包含在相关的伪元素树上,如[视图过渡过程](/zh-CN/docs/Web/API/View_Transitions_API#视图过渡过程)中所述。它只能是 {{cssxref("::view-transition-group")}} 的子节点。并且可以有一个 {{cssxref("::view-transition-new")}} 或一个 {{cssxref("::view-transition-old")}} 子节点,亦或是两者都有。 + +`::view-transition-image-pair` 在 UA 样式表中具有以下默认样式: + +```css +html::view-transition-image-pair(*) { + position: absolute; + inset: 0; + + animation-duration: inherit; + animation-fill-mode: inherit; +} +``` + +默认情况下,`::view-transition-image-pair` 在视图过渡样式表中设置了 {{cssxref("isolation", "isolation: isolate")}},以便其子元素可以使用非正常混合模式进行混合,而不会影响其他视觉输出。 + +## 语法 + +```css-nolint +::view-transition-image-pair() { + /* ... */ +} +``` + +`` 可以是以下任何值之一: + +- `*` + - : 使伪元素选择器匹配所有视图过渡组。 +- `root` + - : 使伪元素选择器匹配由 UA 创建的默认 `root` 视图过渡组,该组用于包含整个页面的视图过渡,这意味着任何未通过 {{cssxref("view-transition-name")}} 属性分配给特定视图过渡组的元素。 +- {{cssxref("custom-ident")}} + - : 使伪元素选择器匹配(通过 {{cssxref("view-transition-name")}} 属性将 {{cssxref("custom-ident")}} 分配给元素而创建的)特定视图转换组。 + +## 示例 + +```css +::view-transition-image-pair(root) { + isolation: auto; +} +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [View Transitions API](/zh-CN/docs/Web/API/View_Transitions_API) +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) diff --git a/files/zh-cn/web/css/_doublecolon_view-transition-new/index.md b/files/zh-cn/web/css/_doublecolon_view-transition-new/index.md new file mode 100644 index 00000000000000..2499e34b688637 --- /dev/null +++ b/files/zh-cn/web/css/_doublecolon_view-transition-new/index.md @@ -0,0 +1,107 @@ +--- +title: "::view-transition-new" +slug: Web/CSS/::view-transition-new +--- + +{{CSSRef}}{{SeeCompatTable}} + +**`::view-transition-new`** [CSS](/zh-CN/docs/Web/CSS) [伪元素](/zh-CN/docs/Web/CSS/Pseudo-elements)表示视图过渡的新视图状态——即过渡后新视图的实时表示。 + +在视图过渡期间,`::view-transition-new` 包含在相关的伪元素树上,如[视图过渡过程](/zh-CN/docs/Web/API/View_Transitions_API#视图过渡过程)中所述。它只能是 {{cssxref("::view-transition-image-pair")}} 的子节点,并且它不会有任何子节点。 + +它是一个可替换元素,因此可以使用 {{cssxref("object-fit")}} 和 {{cssxref("object-position")}} 等属性进行操作。它的自然尺寸等于内容的大小。 + +`::view-transition-new` 在 UA 样式表中具有以下默认样式: + +```css +@keyframes -ua-view-transition-fade-in { + from { + opacity: 0; + } +} + +html::view-transition-new(*) { + position: absolute; + inset-block-start: 0; + inline-size: 100%; + block-size: auto; + + animation-name: -ua-view-transition-fade-in; + animation-duration: inherit; + animation-fill-mode: inherit; +} +``` + +> **备注:** 视图过渡样式表也会额外设置一些样式来动画化 `::view-transition-new`。这些样式是在视图过渡期间动态生成的;有关更多详细信息,请参阅规范中的[设置过渡伪元素](https://drafts.csswg.org/css-view-transitions-1/#setup-transition-pseudo-elements)和[更新伪元素样式](https://drafts.csswg.org/css-view-transitions-1/#update-pseudo-element-styles)部分。 + +## 语法 + +```css-nolint +::view-transition-new() { + /* ... */ +} +``` + +`` 可以是以下任何值之一: + +- `*` + - : 使伪元素选择器匹配所有视图过渡组。 +- `root` + - : 使伪元素选择器匹配由 UA 创建的默认 `root` 视图过渡组,该组用于包含整个页面的视图过渡,这意味着任何未通过 {{cssxref("view-transition-name")}} 属性分配给特定视图过渡组的元素。 +- {{cssxref("custom-ident")}} + - : 使伪元素选择器匹配(通过 {{cssxref("view-transition-name")}} 属性将 {{cssxref("custom-ident")}} 分配给元素而创建的)特定视图转换组。 + +## 示例 + +```css +figcaption { + view-transition-name: figure-caption; +} + +@keyframes grow-x { + from { + transform: scaleX(0); + } + to { + transform: scaleX(1); + } +} + +@keyframes shrink-x { + from { + transform: scaleX(1); + } + to { + transform: scaleX(0); + } +} + +::view-transition-old(figure-caption), +::view-transition-new(figure-caption) { + height: auto; + right: 0; + left: auto; + transform-origin: right center; +} + +::view-transition-old(figure-caption) { + animation: 0.25s linear both shrink-x; +} + +::view-transition-new(figure-caption) { + animation: 0.25s 0.25s linear both grow-x; +} +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [View Transitions API](/zh-CN/docs/Web/API/View_Transitions_API) +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) diff --git a/files/zh-cn/web/css/_doublecolon_view-transition-old/index.md b/files/zh-cn/web/css/_doublecolon_view-transition-old/index.md new file mode 100644 index 00000000000000..81df7be9c806e4 --- /dev/null +++ b/files/zh-cn/web/css/_doublecolon_view-transition-old/index.md @@ -0,0 +1,107 @@ +--- +title: "::view-transition-old" +slug: Web/CSS/::view-transition-old +--- + +{{CSSRef}}{{SeeCompatTable}} + +**`::view-transition-old`** [CSS](/zh-CN/docs/Web/CSS) [伪元素](/zh-CN/docs/Web/CSS/Pseudo-elements)表示视图过渡的旧视图状态——即过渡前旧视图的静态屏幕截图。 + +在视图过渡期间,`::view-transition-old` 包含在相关的伪元素树上,如[视图过渡过程](/zh-CN/docs/Web/API/View_Transitions_API#视图过渡过程)中所述,前提是有一个旧视图状态需要表示。它只能是 {{cssxref("::view-transition-image-pair")}} 的子节点,并且它不会有任何子节点。 + +它是一个可替换元素,因此可以使用 {{cssxref("object-fit")}} 和 {{cssxref("object-position")}} 等属性进行操作。它的自然尺寸等于内容的大小。 + +`::view-transition-old` 在 UA 样式表中具有以下默认样式: + +```css +@keyframes -ua-view-transition-fade-out { + to { + opacity: 0; + } +} + +html::view-transition-old(*) { + position: absolute; + inset-block-start: 0; + inline-size: 100%; + block-size: auto; + + animation-name: -ua-view-transition-fade-out; + animation-duration: inherit; + animation-fill-mode: inherit; +} +``` + +> **备注:** 视图过渡样式表也会额外设置一些样式来动画化 `::view-transition-old`。这些样式是在视图过渡期间动态生成的;有关更多详细信息,请参阅规范中的[设置过渡伪元素](https://drafts.csswg.org/css-view-transitions-1/#setup-transition-pseudo-elements)和[更新伪元素样式](https://drafts.csswg.org/css-view-transitions-1/#update-pseudo-element-styles)部分。 + +## 语法 + +```css-nolint +::view-transition-old() { + /* ... */ +} +``` + +`` 可以是以下任何值之一: + +- `*` + - : 使伪元素选择器匹配所有视图过渡组。 +- `root` + - : 使伪元素选择器匹配由 UA 创建的默认 `root` 视图过渡组,该组用于包含整个页面的视图过渡,这意味着任何未通过 {{cssxref("view-transition-name")}} 属性分配给特定视图过渡组的元素。 +- {{cssxref("custom-ident")}} + - : 使伪元素选择器匹配(通过 {{cssxref("view-transition-name")}} 属性将 {{cssxref("custom-ident")}} 分配给元素而创建的)特定视图转换组。 + +## 示例 + +```css +figcaption { + view-transition-name: figure-caption; +} + +@keyframes grow-x { + from { + transform: scaleX(0); + } + to { + transform: scaleX(1); + } +} + +@keyframes shrink-x { + from { + transform: scaleX(1); + } + to { + transform: scaleX(0); + } +} + +::view-transition-old(figure-caption), +::view-transition-new(figure-caption) { + height: auto; + right: 0; + left: auto; + transform-origin: right center; +} + +::view-transition-old(figure-caption) { + animation: 0.25s linear both shrink-x; +} + +::view-transition-new(figure-caption) { + animation: 0.25s 0.25s linear both grow-x; +} +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [View Transitions API](/zh-CN/docs/Web/API/View_Transitions_API) +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) diff --git a/files/zh-cn/web/css/_doublecolon_view-transition/index.md b/files/zh-cn/web/css/_doublecolon_view-transition/index.md new file mode 100644 index 00000000000000..761ba3bcc667f9 --- /dev/null +++ b/files/zh-cn/web/css/_doublecolon_view-transition/index.md @@ -0,0 +1,50 @@ +--- +title: "::view-transition" +slug: Web/CSS/::view-transition +--- + +{{CSSRef}}{{SeeCompatTable}} + +**`::view-transition`** [CSS](/zh-CN/docs/Web/CSS) [伪元素](/zh-CN/docs/Web/CSS/Pseudo-elements)表示视图过渡叠加层的根元素,它包含所有视图过渡且位于所有其他页面内容的顶部。 + +在视图过渡期间,`::view-transition` 包含在相关的伪元素树中,如[视图过渡过程](/zh-CN/docs/Web/API/View_Transitions_API#视图过渡过程)中所述。它是该树的顶级节点,并且有一个或多个 {{cssxref("::view-transition-group")}} 子节点。 + +`::view-transition` 在 UA 样式表中具有以下默认样式: + +```css +html::view-transition { + position: fixed; + inset: 0; +} +``` + +所有 {{cssxref("::view-transition-group")}} 伪元素都相对于视图过渡根元素定位。 + +## 语法 + +```css +::view-transition { + /* ... */ +} +``` + +## 示例 + +```css +::view-transition { + background-color: rgba(0, 0, 0, 0.25); +} +``` + +## 规范 + +{{Specifications}} + +## 浏览器兼容性 + +{{Compat}} + +## 参见 + +- [View Transitions API](/zh-CN/docs/Web/API/View_Transitions_API) +- [使用 View Transitions API 实现平滑、简单的过渡](https://developer.chrome.com/docs/web-platform/view-transitions/) From 765522e51fbbc9d7f0120cb80fdd91d211bc6b7c Mon Sep 17 00:00:00 2001 From: KyeongSang Yu Date: Mon, 18 Sep 2023 17:39:34 +0900 Subject: [PATCH 003/268] [ko] update translation to permission api in Web API (#15312) * add translation to permission api --- files/ko/web/api/permissions_api/index.md | 70 +++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 files/ko/web/api/permissions_api/index.md diff --git a/files/ko/web/api/permissions_api/index.md b/files/ko/web/api/permissions_api/index.md new file mode 100644 index 00000000000000..c3662510a26cd0 --- /dev/null +++ b/files/ko/web/api/permissions_api/index.md @@ -0,0 +1,70 @@ +--- +title: Permissions API +slug: Web/API/Permissions_API +l10n: + sourceCommit: 381c51574a3e6a07ee09c63493452440f046038d +--- + +{{DefaultAPISidebar("Permissions API")}} + +**Permissions API**는 현재 맥락에 따른 API 권한의 상태를 조회할 수 있는 일관된 프로그래밍 방식을 제공합니다. 예를 들어, Permissions API를 사용하여 특정 API에 대한 접근 권한이 부여되었는지 또는 거부되었는지, 특정 사용자 권한이 필요한지를 확인할 수 있습니다. + +이 API의 권한은 보안 맥락에서 API를 사용하기 위한 모든 요구 사항, 문서에 적용된 권한 정책 제한, 사용자 프롬프트 등 맥락에 대한 모든 보안 제한을 효과적으로 집계합니다. 예를 들어 API가 [권한 정책](/ko/docs/Web/HTTP/Headers/Permissions-Policy)에 의해 제한되는 경우, 반환된 권한은 `거부(denied)`되고 사용자에게 접근 여부를 묻는 메시지가 표시되지 않습니다. + +> **참고:** 이 기능은 [WorkerNavigator.permissions](/ko/docs/Web/API/WorkerNavigator/permissions#browser_support) 속성을 지원하는 [Web Workers](/ko/docs/Web/API/Web_Workers_API)에서 사용할 수 있습니다. + +## 개념 및 사용법 + +예를 들어, [Notifications API](/ko/docs/Web/API/Notifications_API)는 권한을 요청하고 권한 상태를 확인하는 자체 메서드를 제공한 반면, [Geolocation API](/ko/docs/Web/API/Geolocation)는 그렇지 않았습니다. Permissions API는 개발자가 권한 작업을 위한 일관되고 더 나은 사용자 환경을 구현할 수 있는 도구를 제공합니다. + +`permissions` 속성은 표준 브라우징 맥락과 작업자 맥락({{domxref("WorkerNavigator")}} - 작업자 내부에서 권한 확인이 가능) 모두에서 {{domxref("Navigator")}} 객체에서 사용할 수 있게 되었으며, Permissions API 기능에 대한 접근을 제공하는 {{domxref("Permissions")}} 객체를 반환합니다. + +이 객체가 있으면, {{domxref("Permissions.query()")}} 메서드를 사용하여 권한을 조회하여, 특정 API에 대한 {{domxref("PermissionStatus")}}로 확인되는 프로미스를 반환하는 등 권한 관련 작업을 수행할 수 있습니다. + +### 권한 인식 API 목록(Permission-aware APIs) + +Permissions API를 사용하여 모든 API의 권한 상태를 조회할 수 있는 것은 아닙니다. 권한을 인식 가능한 API의 전체 목록은 다음과 같습니다. + +- [Background Synchronization API](/ko/docs/Web/API/Background_Synchronization_API): `background-sync` (항상 부여되어야 합니다.) +- [Clipboard API](/ko/docs/Web/API/Clipboard_API): `clipboard-read`, `clipboard-write` +- [Geolocation API](/ko/docs/Web/API/Geolocation_API): `geolocation` +- [Local Font Access API](/ko/docs/Web/API/Local_Font_Access_API) +- [Media Capture and Streams API](/ko/docs/Web/API/Media_Capture_and_Streams_API): `microphone`, `camera` +- [Notifications API](/ko/docs/Web/API/Notifications_API): `notifications` +- [Payment Handler API](/ko/docs/Web/API/Payment_Handler_API): `payment-handler` +- [Push API](/ko/docs/Web/API/Push_API): `push` +- [Sensor APIs](/ko/docs/Web/API/Sensor_APIs): `accelerometer`, `gyroscope`, `magnetometer`, `ambient-light-sensor` +- [Storage Access API](/ko/docs/Web/API/Storage_Access_API): `storage-access` +- [Storage API](/ko/docs/Web/API/Storage_API): `persistent-storage` +- [Web Audio Output Devices API](/ko/docs/Web/API/Audio_Output_Devices_API): `speaker-selection` +- [Web MIDI API](/ko/docs/Web/API/Web_MIDI_API): `midi` + +## 예제 + +위치 찾기라는 간단한 예제를 만들었습니다. [예제를 실시간으로 실행](https://chrisdavidmills.github.io/location-finder-permissions-api/)하거나 [Github에서 소스 코드를 확인](https://github.com/chrisdavidmills/location-finder-permissions-api/tree/gh-pages)할 수 있습니다. + +작동 방식에 대한 자세한 내용은 [Permissions API 사용하기](/ko/docs/Web/API/Permissions_API/Using_the_Permissions_API) 문서를 참조하세요. + +## 인터페이스 + +- {{domxref("Navigator.permissions")}} 및 {{domxref("WorkerNavigator.permissions")}} {{ReadOnlyInline}} + - : 기본 맥락 및 작업자 맥락에서 각각 {{domxref("Permissions")}} 객체에 대한 접근을 제공합니다. +- {{domxref("Permissions")}} + - : 권한을 조회하고, 해제하는 메서드 등 핵심 권한 API 기능을 제공합니다. +- {{domxref("PermissionStatus")}} + - : 권한의 현재 상태에 대한 액세스와 권한 상태 변경에 응답하는 이벤트 핸들러를 제공합니다. + +## 명세서 + +{{Specifications}} + +## 브라우저 호환성 + +{{Compat}} + +## 같이 보기 + +- [Permissions API 사용하기](/ko/docs/Web/API/Permissions_API/Using_the_Permissions_API) +- [Permissions API를 사용하여 사용자가 카메라 액세스를 허용하거나 거부하는 빈도 감지하기](https://blog.addpipe.com/using-permissions-api-to-detect-getusermedia-responses/) +- {{DOMxref("Notification.permission_static", "Notification.permission")}} +- [개인정보 보호, 권한 및 정보 보안](/ko/docs/Web/Privacy) From 12c851fef38e6bdf60004029f7a58da10ff53bc0 Mon Sep 17 00:00:00 2001 From: BenjaminLesne <73464907+BenjaminLesne@users.noreply.github.com> Date: Mon, 18 Sep 2023 13:33:00 +0200 Subject: [PATCH 004/268] [fr] fix:15843 PNG lossless compression (#15899) * [fr] fix:15843 PNG lossless compression * removed plurial and removed anglicism --- files/fr/web/html/element/img/index.md | 2 +- files/fr/web/media/formats/image_types/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/files/fr/web/html/element/img/index.md b/files/fr/web/html/element/img/index.md index 80ac429e1e22da..d4e06b4f3a8760 100644 --- a/files/fr/web/html/element/img/index.md +++ b/files/fr/web/html/element/img/index.md @@ -32,7 +32,7 @@ Les formats d'image qu'on rencontre le plus fréquemment sur le Web sont : - [AVIF (AV1 Image File Format)](/fr/docs/Web/Media/Formats/Image_types#avif) pour les images et les images animées avec de hautes performances - [GIF (Graphics Interchange Format)](/fr/docs/Web/Media/Formats/Image_types#gif_graphics_interchange_format) pour les images et animations _simples_ - [JPEG (Joint Photographic Expert Group image)](/fr/docs/Web/Media/Formats/Image_types#jpeg_joint_photographic_experts_group_image) pour une compression avec pertes d'images statiques, il s'agit du format le plus utilisé -- [PNG (Portable Network Graphics)](/fr/docs/Web/Media/Formats/Image_types#png_portable_network_graphics) pour une compression avec pertes d'images statiques, de meilleure qualité que le JPEG +- [PNG (Portable Network Graphics)](/fr/docs/Web/Media/Formats/Image_types#png_portable_network_graphics) pour une compression sans perte d'images statiques, de meilleure qualité que le JPEG - [SVG (Scalable Vector Graphics)](/fr/docs/Web/Media/Formats/Image_types#svg_scalable_vector_graphics) pour un format d'image vectorielle (qui permet de dessiner une image précisément à différentes échelles) - [WebP (Web Picture format)](/fr/docs/Web/Media/Formats/Image_types#webp) pour les images statiques et animées diff --git a/files/fr/web/media/formats/image_types/index.md b/files/fr/web/media/formats/image_types/index.md index 0374dc1f38d2ae..01e9a6971248b0 100644 --- a/files/fr/web/media/formats/image_types/index.md +++ b/files/fr/web/media/formats/image_types/index.md @@ -891,7 +891,7 @@ Le JPEG est en fait un format de données pour les photos compressées, plutôt ### PNG (Portable Network Graphics) -Le [PNG](/fr/docs/Glossary/PNG) (prononcé "**png**") utilise une compression sans perte ou avec perte afin de fournir une compression plus efficace, et prend en charge des profondeurs de couleurs plus élevées que [GIF](#gif), ainsi qu'une transparence alpha complète. +Le format d'image [PNG](/fr/docs/Glossary/PNG) utilise une compression sans perte, prend en charge des profondeurs de couleurs plus élevées que le [GIF](#gif), est plus efficace, et prend complètement en charge la transparence alpha. Le format PNG est largement soutenu, tous les principaux navigateurs offrant une prise en charge complète de ses fonctionnalités. Internet Explorer, qui a introduit le support PNG dans les versions 4-5, ne l'a pas entièrement pris en charge avant IE 9, et a connu de nombreux bogues tristement célèbres pendant de nombreuses années, y compris dans l'Internet Explorer 6, autrefois omniprésent. Cela a ralenti l'adoption de la PNG, mais elle est maintenant couramment utilisée, surtout lorsqu'il faut reproduire avec précision l'image source. From dd28fdcef3623ce8106759b94ec93c0279c26f0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 11:59:24 +0000 Subject: [PATCH 005/268] Bump markdownlint-cli2 from 0.9.2 to 0.10.0 (#15924) --- package.json | 2 +- yarn.lock | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 8b1cbedbc36912..a56434c446921e 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "husky": "8.0.3", "lint-staged": "14.0.1", "markdown-it": "^13.0.1", - "markdownlint-cli2": "0.9.2", + "markdownlint-cli2": "0.10.0", "markdownlint-rule-search-replace": "1.2.0", "ora": "^7.0.1", "prettier": "3.0.3", diff --git a/yarn.lock b/yarn.lock index 9f0ea6681e237c..4de69fdae357da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -495,17 +495,17 @@ markdownlint-cli2-formatter-default@0.0.4: resolved "https://registry.yarnpkg.com/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.4.tgz#81e26b0a50409c0357c6f0d38d8246946b236fab" integrity sha512-xm2rM0E+sWgjpPn1EesPXx5hIyrN2ddUnUwnbCsD/ONxYtw3PX6LydvdH6dciWAoFDpwzbHM1TO7uHfcMd6IYg== -markdownlint-cli2@0.9.2: - version "0.9.2" - resolved "https://registry.yarnpkg.com/markdownlint-cli2/-/markdownlint-cli2-0.9.2.tgz#ed714905e0e4ce583e5c3d95134ba1e2d0287552" - integrity sha512-ndijEHIOikcs29W8068exHXlfkFviGFT/mPhREia7zSfQzHvTDkL2s+tWizvELjLHiKRO4KGTkkJyR3oeR8A5g== +markdownlint-cli2@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/markdownlint-cli2/-/markdownlint-cli2-0.10.0.tgz#4ba94b6cc648eb62475432ebcc19557afcdd487b" + integrity sha512-kVxjPyKFC+eW7iqcxiNI50RDzwugpXkEX5eQlDso/0IUs9M73jXYguLFHDzgi5KatcxU/57Fu8KoGtkFft9lfA== dependencies: globby "13.2.2" - markdownlint "0.30.0" + markdownlint "0.31.1" markdownlint-cli2-formatter-default "0.0.4" micromatch "4.0.5" strip-json-comments "5.0.1" - yaml "2.3.1" + yaml "2.3.2" markdownlint-micromark@0.1.2: version "0.1.2" @@ -531,10 +531,10 @@ markdownlint-rule-search-replace@1.2.0: dependencies: markdownlint-rule-helpers "0.21.0" -markdownlint@0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.30.0.tgz#e5b43f794c6810299cd4be86f8d54108e9169860" - integrity sha512-nInuFvI/rEzanAOArW5490Ez4EYpB5ODqVM0mcDYCPx9DKJWCQqCgejjiCvbSeE7sjbDscVtZmwr665qpF5xGA== +markdownlint@0.31.1: + version "0.31.1" + resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.31.1.tgz#f014ed2d3614c5dbc351b7f65641ccc0a5facdb7" + integrity sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA== dependencies: markdown-it "13.0.1" markdownlint-micromark "0.1.7" @@ -888,6 +888,11 @@ yaml@2.3.1: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== +yaml@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" + integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" From bbd382a3ae748c4984b9c35fac213b8c43f0a90b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=BF=E3=81=91CAT?= Date: Tue, 19 Sep 2023 00:45:53 +0900 Subject: [PATCH 006/268] Translate BluetoothCharacteristicProperties (#15798) * Translate BluetoothCharacteristicProperties * Improve wording --- .../authenticatedsignedwrites/index.md | 22 +++++++ .../broadcast/index.md | 22 +++++++ .../index.md | 63 +++++++++++++++++++ .../indicate/index.md | 22 +++++++ .../notify/index.md | 22 +++++++ .../read/index.md | 22 +++++++ .../reliablewrite/index.md | 22 +++++++ .../writableauxiliaries/index.md | 22 +++++++ .../write/index.md | 24 +++++++ .../writewithoutresponse/index.md | 22 +++++++ 10 files changed, 263 insertions(+) create mode 100644 files/ja/web/api/bluetoothcharacteristicproperties/authenticatedsignedwrites/index.md create mode 100644 files/ja/web/api/bluetoothcharacteristicproperties/broadcast/index.md create mode 100644 files/ja/web/api/bluetoothcharacteristicproperties/index.md create mode 100644 files/ja/web/api/bluetoothcharacteristicproperties/indicate/index.md create mode 100644 files/ja/web/api/bluetoothcharacteristicproperties/notify/index.md create mode 100644 files/ja/web/api/bluetoothcharacteristicproperties/read/index.md create mode 100644 files/ja/web/api/bluetoothcharacteristicproperties/reliablewrite/index.md create mode 100644 files/ja/web/api/bluetoothcharacteristicproperties/writableauxiliaries/index.md create mode 100644 files/ja/web/api/bluetoothcharacteristicproperties/write/index.md create mode 100644 files/ja/web/api/bluetoothcharacteristicproperties/writewithoutresponse/index.md diff --git a/files/ja/web/api/bluetoothcharacteristicproperties/authenticatedsignedwrites/index.md b/files/ja/web/api/bluetoothcharacteristicproperties/authenticatedsignedwrites/index.md new file mode 100644 index 00000000000000..d3e47870fbc682 --- /dev/null +++ b/files/ja/web/api/bluetoothcharacteristicproperties/authenticatedsignedwrites/index.md @@ -0,0 +1,22 @@ +--- +title: "BluetoothCharacteristicProperties: authenticatedSignedWrites プロパティ" +slug: Web/API/BluetoothCharacteristicProperties/authenticatedSignedWrites +l10n: + sourceCommit: 1f216a70d94c3901c5767e6108a29daa48edc070 +--- + +{{securecontext_header}}{{APIRef("Bluetooth API")}}{{SeeCompatTable}} + +{{domxref("BluetoothCharacteristicProperties")}} インターフェイスの読み取り専用プロパティ **`authenticatedSignedWrites`** は、キャラクタリスティックの値への署名付き書き込みが許可されているならば `true` となる `boolean` 値を返します。 + +## 値 + +論理値です。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} diff --git a/files/ja/web/api/bluetoothcharacteristicproperties/broadcast/index.md b/files/ja/web/api/bluetoothcharacteristicproperties/broadcast/index.md new file mode 100644 index 00000000000000..4bb99addab36b6 --- /dev/null +++ b/files/ja/web/api/bluetoothcharacteristicproperties/broadcast/index.md @@ -0,0 +1,22 @@ +--- +title: "BluetoothCharacteristicProperties: broadcast プロパティ" +slug: Web/API/BluetoothCharacteristicProperties/broadcast +l10n: + sourceCommit: 1f216a70d94c3901c5767e6108a29daa48edc070 +--- + +{{securecontext_header}}{{APIRef("Bluetooth API")}}{{SeeCompatTable}} + +{{domxref("BluetoothCharacteristicProperties")}} インターフェイスの読み取り専用プロパティ **`broadcast`** は、Server Characteristic Configuration Descriptor によりキャラクタリスティックの値のブロードキャストが許可されているならば `true` となる `boolean` 値を返します。 + +## 値 + +論理値です。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} diff --git a/files/ja/web/api/bluetoothcharacteristicproperties/index.md b/files/ja/web/api/bluetoothcharacteristicproperties/index.md new file mode 100644 index 00000000000000..b31ad57c77c60a --- /dev/null +++ b/files/ja/web/api/bluetoothcharacteristicproperties/index.md @@ -0,0 +1,63 @@ +--- +title: BluetoothCharacteristicProperties +slug: Web/API/BluetoothCharacteristicProperties +l10n: + sourceCommit: acfe8c9f1f4145f77653a2bc64a9744b001358dc +--- + +{{APIRef("Bluetooth API")}}{{securecontext_header}}{{SeeCompatTable}} + +[Web Bluetooth API](/ja/docs/Web/API/Web_Bluetooth_API) の **`BluetoothCharacteristicProperties`** インターフェイスは、指定の {{domxref('BluetoothRemoteGATTCharacteristic')}} で有効な操作を提供します。 + +このインターフェイスは、{{DOMxRef("BluetoothRemoteGATTCharacteristic.properties")}} を呼ぶと返されます。 + +## インスタンスプロパティ + +- {{DOMxRef("BluetoothCharacteristicProperties.authenticatedSignedWrites","authenticatedSignedWrites")}} {{ReadOnlyInline}} {{Experimental_Inline}} + - : キャラクタリスティックの値への署名付き書き込みが許可されているならば `true` となる `boolean` 値を返します。 +- {{DOMxRef("BluetoothCharacteristicProperties.broadcast", "broadcast")}} {{ReadOnlyInline}} {{Experimental_Inline}} + - : Server Characteristic Configuration Descriptor によりキャラクタリスティックの値のブロードキャストが許可されているならば `true` となる `boolean` 値を返します。 +- {{DOMxRef("BluetoothCharacteristicProperties.indicate","indicate")}} {{ReadOnlyInline}} {{Experimental_Inline}} + - : キャラクタリスティックの値のアクノリッジメントありのインジケーションが許可されているならば `true` となる `boolean` 値を返します。 +- {{DOMxRef("BluetoothCharacteristicProperties.notify","notify")}} {{ReadOnlyInline}} {{Experimental_Inline}} + - : キャラクタリスティックの値のアクノリッジメントなしのノーティフィケーションが許可されているならば `true` となる `boolean` 値を返します。 +- {{DOMxRef("BluetoothCharacteristicProperties.read", "read")}} {{ReadOnlyInline}} {{Experimental_Inline}} + - : キャラクタリスティックの値の読み取りが許可されているならば `true` となる `boolean` 値を返します。 +- {{DOMxRef("BluetoothCharacteristicProperties.reliableWrite","reliableWrite")}} {{ReadOnlyInline}} {{Experimental_Inline}} + - : キャラクタリスティックへの信頼性のある書き込みが許可されているならば `true` となる `boolean` 値を返します。 +- {{DOMxRef("BluetoothCharacteristicProperties.writableAuxiliaries","writableAuxiliaries")}} {{ReadOnlyInline}} {{Experimental_Inline}} + - : キャラクタリスティックディスクリプターへの信頼性のある書き込みが許可されているならば `true` となる `boolean` 値を返します。 +- {{DOMxRef("BluetoothCharacteristicProperties.write","write")}} {{ReadOnlyInline}} {{Experimental_Inline}} + - : キャラクタリスティックへのレスポンスありの書き込みが許可されているならば `true` となる `boolean` 値を返します。 +- {{DOMxRef("BluetoothCharacteristicProperties.writeWithoutResponse","writeWithoutResponse")}} {{ReadOnlyInline}} {{Experimental_Inline}} + - : キャラクタリスティックへのレスポンスなしの書き込みが許可されているならば `true` となる `boolean` 値を返します。 + +## 例 + +以下の例では、GATT キャラクタリスティックが値の変化の通知に対応しているかを調べる方法を示します。 + +```js +let device = await navigator.bluetooth.requestDevice({ + filters: [{ services: ["heart_rate"] }], +}); +let gatt = await device.gatt.connect(); +let service = await gatt.getPrimaryService("heart_rate"); +let characteristic = await service.getCharacteristic("heart_rate_measurement"); +if (characteristic.properties.notify) { + characteristic.addEventListener( + "characteristicvaluechanged", + async (event) => { + console.log(`心拍数測定の受信: ${event.target.value}`); + }, + ); + await characteristic.startNotifications(); +} +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} diff --git a/files/ja/web/api/bluetoothcharacteristicproperties/indicate/index.md b/files/ja/web/api/bluetoothcharacteristicproperties/indicate/index.md new file mode 100644 index 00000000000000..78afa668f1c6fb --- /dev/null +++ b/files/ja/web/api/bluetoothcharacteristicproperties/indicate/index.md @@ -0,0 +1,22 @@ +--- +title: "BluetoothCharacteristicProperties: indicate プロパティ" +slug: Web/API/BluetoothCharacteristicProperties/indicate +l10n: + sourceCommit: 1f216a70d94c3901c5767e6108a29daa48edc070 +--- + +{{securecontext_header}}{{APIRef("Bluetooth API")}}{{SeeCompatTable}} + +{{domxref("BluetoothCharacteristicProperties")}} インターフェイスの読み取り専用プロパティ **`indicate`** は、キャラクタリスティックの値のアクノリッジメントありのインジケーションが許可されているならば `true` となる `boolean` 値を返します。 + +## 値 + +論理値です。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} diff --git a/files/ja/web/api/bluetoothcharacteristicproperties/notify/index.md b/files/ja/web/api/bluetoothcharacteristicproperties/notify/index.md new file mode 100644 index 00000000000000..693ab16ea3bc02 --- /dev/null +++ b/files/ja/web/api/bluetoothcharacteristicproperties/notify/index.md @@ -0,0 +1,22 @@ +--- +title: "BluetoothCharacteristicProperties: notify プロパティ" +slug: Web/API/BluetoothCharacteristicProperties/notify +l10n: + sourceCommit: 1f216a70d94c3901c5767e6108a29daa48edc070 +--- + +{{securecontext_header}}{{APIRef("")}}{{SeeCompatTable}} + +{{domxref("BluetoothCharacteristicProperties")}} インターフェイスの読み取り専用プロパティ **`notify`** は、キャラクタリスティックの値のアクノリッジメントなしのノーティフィケーションが許可されているならば `true` となる `boolean` 値を返します。 + +## 値 + +論理値です。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} diff --git a/files/ja/web/api/bluetoothcharacteristicproperties/read/index.md b/files/ja/web/api/bluetoothcharacteristicproperties/read/index.md new file mode 100644 index 00000000000000..4957e97964dda4 --- /dev/null +++ b/files/ja/web/api/bluetoothcharacteristicproperties/read/index.md @@ -0,0 +1,22 @@ +--- +title: "BluetoothCharacteristicProperties: read プロパティ" +slug: Web/API/BluetoothCharacteristicProperties/read +l10n: + sourceCommit: 1f216a70d94c3901c5767e6108a29daa48edc070 +--- + +{{securecontext_header}}{{APIRef("Bluetooth API")}}{{SeeCompatTable}} + +{{domxref("BluetoothCharacteristicProperties")}} インターフェイスの読み取り専用プロパティ **`read`** は、キャラクタリスティックの値の読み取りが許可されているならば `true` となる `boolean` 値を返します。 + +## 値 + +論理値です。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} diff --git a/files/ja/web/api/bluetoothcharacteristicproperties/reliablewrite/index.md b/files/ja/web/api/bluetoothcharacteristicproperties/reliablewrite/index.md new file mode 100644 index 00000000000000..86730fc54c61f5 --- /dev/null +++ b/files/ja/web/api/bluetoothcharacteristicproperties/reliablewrite/index.md @@ -0,0 +1,22 @@ +--- +title: "BluetoothCharacteristicProperties: reliableWrite プロパティ" +slug: Web/API/BluetoothCharacteristicProperties/reliableWrite +l10n: + sourceCommit: 1f216a70d94c3901c5767e6108a29daa48edc070 +--- + +{{securecontext_header}}{{APIRef("Bluetooth API")}}{{SeeCompatTable}} + +{{domxref("BluetoothCharacteristicProperties")}} インターフェイスの読み取り専用プロパティ **`reliableWrite`** は、キャラクタリスティックへの信頼性のある書き込みが許可されているならば `true` となる `boolean` 値を返します。 + +## 値 + +論理値です。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} diff --git a/files/ja/web/api/bluetoothcharacteristicproperties/writableauxiliaries/index.md b/files/ja/web/api/bluetoothcharacteristicproperties/writableauxiliaries/index.md new file mode 100644 index 00000000000000..2878caf04b9a65 --- /dev/null +++ b/files/ja/web/api/bluetoothcharacteristicproperties/writableauxiliaries/index.md @@ -0,0 +1,22 @@ +--- +title: "BluetoothCharacteristicProperties: writableAuxiliaries プロパティ" +slug: Web/API/BluetoothCharacteristicProperties/writableAuxiliaries +l10n: + sourceCommit: 1f216a70d94c3901c5767e6108a29daa48edc070 +--- + +{{securecontext_header}}{{APIRef("Bluetooth API")}}{{SeeCompatTable}} + +{{domxref("BluetoothCharacteristicProperties")}} インターフェイスの読み取り専用プロパティ **`writableAuxiliaries`** は、キャラクタリスティックディスクリプターへの信頼性のある書き込みが許可されているならば `true` となる `boolean` 値を返します。 + +## 値 + +論理値です。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} diff --git a/files/ja/web/api/bluetoothcharacteristicproperties/write/index.md b/files/ja/web/api/bluetoothcharacteristicproperties/write/index.md new file mode 100644 index 00000000000000..19336523b8b230 --- /dev/null +++ b/files/ja/web/api/bluetoothcharacteristicproperties/write/index.md @@ -0,0 +1,24 @@ +--- +title: "BluetoothCharacteristicProperties: write プロパティ" +slug: Web/API/BluetoothCharacteristicProperties/write +l10n: + sourceCommit: 1f216a70d94c3901c5767e6108a29daa48edc070 +--- + +{{securecontext_header}}{{APIRef("Bluetooth API")}}{{SeeCompatTable}} + +{{domxref("BluetoothCharacteristicProperties")}} インターフェイスの読み取り専用プロパティ **`write`** は、キャラクタリスティックへのレスポンスありの書き込みが許可されているならば `true` となる `boolean` 値を返します。 + +## 値 + +論理値です。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +null diff --git a/files/ja/web/api/bluetoothcharacteristicproperties/writewithoutresponse/index.md b/files/ja/web/api/bluetoothcharacteristicproperties/writewithoutresponse/index.md new file mode 100644 index 00000000000000..67f489e098edbe --- /dev/null +++ b/files/ja/web/api/bluetoothcharacteristicproperties/writewithoutresponse/index.md @@ -0,0 +1,22 @@ +--- +title: "BluetoothCharacteristicProperties: writeWithoutResponse プロパティ" +slug: Web/API/BluetoothCharacteristicProperties/writeWithoutResponse +l10n: + sourceCommit: 1f216a70d94c3901c5767e6108a29daa48edc070 +--- + +{{securecontext_header}}{{APIRef("Bluetooth API")}}{{SeeCompatTable}} + +{{domxref("BluetoothCharacteristicProperties")}} インターフェイスの読み取り専用プロパティ **`writeWithoutResponse`** は、キャラクタリスティックへのレスポンスなしの書き込みが許可されているならば `true` となる `boolean` 値を返します。 + +## 値 + +論理値です。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} From 509b4aa8b8fc1c083486726942280db8cd5f473c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=BF=E3=81=91CAT?= Date: Tue, 19 Sep 2023 00:46:57 +0900 Subject: [PATCH 007/268] Translate MediaStreamAudioDestinationNode (#15845) --- .../mediastreamaudiodestinationnode/index.md | 71 +++++++++++++++++++ .../mediastreamaudiodestinationnode/index.md | 48 +++++++++++++ .../stream/index.md | 32 +++++++++ 3 files changed, 151 insertions(+) create mode 100644 files/ja/web/api/mediastreamaudiodestinationnode/index.md create mode 100644 files/ja/web/api/mediastreamaudiodestinationnode/mediastreamaudiodestinationnode/index.md create mode 100644 files/ja/web/api/mediastreamaudiodestinationnode/stream/index.md diff --git a/files/ja/web/api/mediastreamaudiodestinationnode/index.md b/files/ja/web/api/mediastreamaudiodestinationnode/index.md new file mode 100644 index 00000000000000..d9f45f795fe0ad --- /dev/null +++ b/files/ja/web/api/mediastreamaudiodestinationnode/index.md @@ -0,0 +1,71 @@ +--- +title: MediaStreamAudioDestinationNode +slug: Web/API/MediaStreamAudioDestinationNode +l10n: + sourceCommit: 0d8d3980dc8b8267b60e899c41a76a2832556cbc +--- + +{{APIRef("Web Audio API")}} + +`MediaStreamAudioDestinationNode` インターフェイスは、単一の `AudioMediaStreamTrack` を持つ [WebRTC](/ja/docs/Web/API/WebRTC_API) {{domxref("MediaStream")}} からなる音声の出力先を表します。これは、{{domxref("MediaDevices.getUserMedia", "navigator.mediaDevices.getUserMedia()")}} で取得した `MediaStream` と同様に用いることができます。 + +これは音声の出力先としてふるまう {{domxref("AudioNode")}} であり、{{domxref("AudioContext.createMediaStreamDestination()")}} メソッドで生成できます。 + +{{InheritanceDiagram}} + + + + + + + + + + + + + + + + + + + + + + + + +
入力数1
出力数0
チャンネル数2
チャンネルカウントモード"explicit"
チャンネルカウントの解釈"speakers"
+ +## コンストラクター + +- {{domxref("MediaStreamAudioDestinationNode.MediaStreamAudioDestinationNode", "MediaStreamAudioDestinationNode()")}} + - : 新しい `MediaStreamAudioDestinationNode` オブジェクトのインスタンスを生成します。 + +## インスタンスプロパティ + +_親の {{domxref("AudioNode")}} からプロパティを継承します。_ + +- {{domxref("MediaStreamAudioDestinationNode.stream")}} + - : {{domxref("MediaStreamTrack.kind", "kind")}} が `audio` であり、ノードと同じ数のチャンネルを持つ単一の {{domxref("MediaStreamTrack")}} からなる {{domxref("MediaStream")}} です。このプロパティを用いて、ストリームを音声グラフから取り出し、[Media Recorder](/ja/docs/Web/API/MediaStream_Recording_API) などの他の構築に供給できます。 + +## インスタンスメソッド + +_親の {{domxref("AudioNode")}} からメソッドを継承します。_ + +## 例 + +[`AudioContext.createMediaStreamDestination()`](/ja/docs/Web/API/AudioContext/createMediaStreamDestination#例) に、`MediaStreamAudioDestinationNode` を生成し、それを録音する音声の音源として用いるサンプルコードがあります。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- [Web Audio API の使用](/ja/docs/Web/API/Web_Audio_API/Using_Web_Audio_API) diff --git a/files/ja/web/api/mediastreamaudiodestinationnode/mediastreamaudiodestinationnode/index.md b/files/ja/web/api/mediastreamaudiodestinationnode/mediastreamaudiodestinationnode/index.md new file mode 100644 index 00000000000000..e0886c8bf469a9 --- /dev/null +++ b/files/ja/web/api/mediastreamaudiodestinationnode/mediastreamaudiodestinationnode/index.md @@ -0,0 +1,48 @@ +--- +title: "MediaStreamAudioDestinationNode: MediaStreamAudioDestinationNode() コンストラクター" +slug: Web/API/MediaStreamAudioDestinationNode/MediaStreamAudioDestinationNode +l10n: + sourceCommit: 84f8672adab0fdb783d02676c42a2b7ae16b3606 +--- + +{{APIRef("Web Audio API")}} + +[Web Audio API](/ja/docs/Web/API/Web_Audio_API) の **`MediaStreamAudioDestinationNode()`** コンストラクターは、新しい {{domxref("MediaStreamAudioDestinationNode")}} オブジェクトのインスタンスを生成します。 + +## 構文 + +```js-nolint +new MediaStreamAudioDestinationNode(context) +new MediaStreamAudioDestinationNode(context, options) +``` + +### 引数 + +- `context` + - : このノードを関連付ける音声コンテキストを表す {{domxref("AudioContext")}} です。 +- `options` {{optional_inline}} + + - : `MediaStreamAudioDestinationNode` に持たせる性質を定義するオブジェクトです。 + + - `channelCount` + - : ノードの入力への接続を[アップミキシングとダウンミキシング](/ja/docs/Web/API/Web_Audio_API/Basic_concepts_behind_Web_Audio_API#アップミキシングとダウンミキシング)する際に使用するチャンネルの数を決めるのに用いる整数です。(詳しくは {{domxref("AudioNode.channelCount")}} を参照してください) 使用法と正確な定義は、`channelCountMode` の値によります。 + - `channelCountMode` + - : ノードの入力と出力のチャンネルを対応させる方法を表す文字列です。(デフォルト値を含む詳細は {{domxref("AudioNode.channelCountMode")}} を参照してください) + - `channelInterpretation` + - : チャンネルの意味を表す文字列です。この解釈は、音声の[アップミキシングとダウンミキシング](/ja/docs/Web/API/Web_Audio_API/Basic_concepts_behind_Web_Audio_API#アップミキシングとダウンミキシング)を行う方法を定義します。取りうる値は `"speakers"` および `"discrete"` です。(デフォルト値を含む詳細は {{domxref("AudioNode.channelCountMode")}} を参照してください) + +## 例 + +```js +const ac = new AudioContext(); + +const myDestination = new MediaStreamAudioDestinationNode(ac); +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} diff --git a/files/ja/web/api/mediastreamaudiodestinationnode/stream/index.md b/files/ja/web/api/mediastreamaudiodestinationnode/stream/index.md new file mode 100644 index 00000000000000..28f54e388eee7e --- /dev/null +++ b/files/ja/web/api/mediastreamaudiodestinationnode/stream/index.md @@ -0,0 +1,32 @@ +--- +title: "MediaStreamAudioDestinationNode: stream プロパティ" +slug: Web/API/MediaStreamAudioDestinationNode/stream +l10n: + sourceCommit: 84f8672adab0fdb783d02676c42a2b7ae16b3606 +--- + +{{ APIRef("Web Audio API") }} + +{{ domxref("AudioContext") }} インターフェイスの `stream` プロパティは、ノード自身と同じ数のチャンネルを持つ単一の音声 {{domxref("MediaStreamTrack")}} を持った {{domxref("MediaStream")}} を表します。 + +このプロパティを用いて、ストリームを音声グラフから取り出し、[Media Recorder](/ja/docs/Web/API/MediaStream_Recording_API) などの他の構築に供給できます。 + +## 値 + +単一の音声トラックを持った {{domxref("MediaStream")}} です。この音声トラックは、{{domxref("MediaStreamTrack.kind", "kind")}} が `audio` である {{domxref("MediaStreamTrack")}} です。 + +## 例 + +[`AudioContext.createMediaStreamDestination()`](/ja/docs/Web/API/AudioContext/createMediaStreamDestination#例) に、`MediaStreamAudioDestinationNode` を生成し、その `stream` プロパティを録音する音声の音源として用いるサンプルコードがあります。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- [Web Audio API の使用](/ja/docs/Web/API/Web_Audio_API/Using_Web_Audio_API) From ad007c6e0678ac96824e151a2f7f836513a251ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=BF=E3=81=91CAT?= Date: Tue, 19 Sep 2023 00:48:58 +0900 Subject: [PATCH 008/268] Translate MediaStreamTrackAudioSourceNode (#15846) --- .../mediastreamtrackaudiosourcenode/index.md | 67 ++++++++++++++++ .../mediastreamtrackaudiosourcenode/index.md | 77 +++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 files/ja/web/api/mediastreamtrackaudiosourcenode/index.md create mode 100644 files/ja/web/api/mediastreamtrackaudiosourcenode/mediastreamtrackaudiosourcenode/index.md diff --git a/files/ja/web/api/mediastreamtrackaudiosourcenode/index.md b/files/ja/web/api/mediastreamtrackaudiosourcenode/index.md new file mode 100644 index 00000000000000..80030cdd8848f6 --- /dev/null +++ b/files/ja/web/api/mediastreamtrackaudiosourcenode/index.md @@ -0,0 +1,67 @@ +--- +title: MediaStreamTrackAudioSourceNode +slug: Web/API/MediaStreamTrackAudioSourceNode +l10n: + sourceCommit: fa1301aead2cee37516b7ad5a5ec2fb21e004227 +--- + +{{APIRef("Web Audio API")}} + +**`MediaStreamTrackAudioSourceNode`** インターフェイスは {{domxref("AudioNode")}} の一種で、[WebRTC](/ja/docs/Web/API/WebRTC_API) や[メディアキャプチャとストリーム](/ja/docs/Web/API/Media_Capture_and_Streams_API) API から得られた特定の {{domxref("MediaStreamTrack")}} からデータを取得する音源を表します。 + +音声自体は、マイクやその他の音声サンプリングデバイスからの入力かもしれないし、{{domxref("RTCPeerConnection")}} から受信したものかもしれないし、その他かもしれません。 + +`MediaStreamTrackAudioSourceNode` は入力を持たず、ちょうど 1 個の出力を持ち、{{domxref("AudioContext.createMediaStreamTrackSource()")}} メソッドにより生成されます。このインターフェイスは、ストリームの最初の音声トラックで決め打ちするのではなく使用するトラックを明示できるという点以外、{{domxref("MediaStreamAudioSourceNode")}} に似ています。 + +{{InheritanceDiagram}} + + + + + + + + + + + + + + + + +
入力数0
出力数1
チャンネル数 + 生成時に {{domxref("AudioContext.createMediaStreamTrackSource()")}} メソッドに渡された最初の音声 {{domxref("MediaStreamTrack")}} により定義されます。 +
+ +## コンストラクター + +- {{domxref("MediaStreamTrackAudioSourceNode.MediaStreamTrackAudioSourceNode", "new MediaStreamTrackAudioSourceNode()")}} + - : オプションを指定して新しい `MediaStreamTrackAudioSourceNode` オブジェクトを生成します。 + +## インスタンスプロパティ + +_`MediaStreamTrackAudioSourceNode` インターフェイスは自身のプロパティを持ちません。しかし、親の {{domxref("AudioNode")}} のプロパティを継承します。_ + +## インスタンスメソッド + +_親の {{domxref("AudioNode")}} からメソッドを継承します。_ + +## 例 + +[`AudioContext.createMediaStreamSource()`](/ja/docs/Web/API/AudioContext/createMediaStreamSource#例) に、このオブジェクトを用いるサンプルコードがあります。 + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} + +## 関連情報 + +- [Web Audio API の使用](/ja/docs/Web/API/Web_Audio_API/Using_Web_Audio_API) +- [WebRTC API](/ja/docs/Web/API/WebRTC_API) +- [メディアキャプチャとストリーム API (メディアストリーム)](/ja/docs/Web/API/Media_Capture_and_Streams_API) +- {{domxref("MediaStreamAudioSourceNode")}} diff --git a/files/ja/web/api/mediastreamtrackaudiosourcenode/mediastreamtrackaudiosourcenode/index.md b/files/ja/web/api/mediastreamtrackaudiosourcenode/mediastreamtrackaudiosourcenode/index.md new file mode 100644 index 00000000000000..059a58e10dcde2 --- /dev/null +++ b/files/ja/web/api/mediastreamtrackaudiosourcenode/mediastreamtrackaudiosourcenode/index.md @@ -0,0 +1,77 @@ +--- +title: "MediaStreamTrackAudioSourceNode: MediaStreamTrackAudioSourceNode() コンストラクター" +slug: Web/API/MediaStreamTrackAudioSourceNode/MediaStreamTrackAudioSourceNode +l10n: + sourceCommit: 84f8672adab0fdb783d02676c42a2b7ae16b3606 +--- + +{{APIRef("Web Audio API")}} + +[Web Audio API](/ja/docs/Web/API/Web_Audio_API) の **`MediaStreamTrackAudioSourceNode()`** コンストラクターは、オプションオブジェクトで指定された {{domxref("MediaStreamTrack")}} から音声を取得する新しい {{domxref("MediaStreamTrackAudioSourceNode")}} オブジェクトを生成して返します。 + +`MediaStreamTrackAudioSourceNode` を生成する別の方法は、音声の取得元とする {{domxref("MediaStreamTrack")}} を指定して {{domxref("AudioContext.createMediaStreamTrackSource()")}} メソッドを呼び出すことです。 + +## 構文 + +```js-nolint +new MediaStreamTrackAudioSourceNode(context, options) +``` + +### 引数 + +- `context` + - : このノードを関連付ける音声コンテキストを表す {{domxref("AudioContext")}} です。 +- `options` + + - : `MediaStreamTrackAudioSourceNode` に持たせる性質を定義するオブジェクトです。 + + - `mediaStreamTrack` + - : このノードの出力とする音声のデータの取得元とする {{domxref("MediaStreamTrack")}} です。 + +### 返値 + +メディアを指定のメディアトラックから取得する音声ノードを表す新しい {{domxref("MediaStreamTrackAudioSourceNode")}} オブジェクトです。 + +### 例外 + +- `NotSupportedError` {{domxref("DOMException")}} + - : 指定の `context` が {{domxref("AudioContext")}} でないとき投げられます。 +- `InvalidStateError` {{domxref("DOMException")}} + - : 指定の {{domxref("MediaStreamTrack")}} が音声トラックでない (すなわち、{{domxref("MediaStreamTrack.kind", "kind")}} プロパティが `audio` でない) とき投げられます。 + +## 例 + +この例では、{{domxref("MediaDevices.getUserMedia", "getUserMedia()")}} を用いてユーザーのカメラにアクセスし、そのデバイスが提供する最初の音声トラックから新しい {{domxref("MediaStreamAudioSourceNode")}} を生成します。 + +```js +const audioCtx = new AudioContext(); + +if (navigator.mediaDevices.getUserMedia) { + navigator.mediaDevices + .getUserMedia({ + audio: true, + video: false, + }) + .then((stream) => { + const options = { + mediaStreamTrack: stream.getAudioTracks()[0], + }; + + const source = new MediaStreamTrackAudioSourceNode(audioCtx, options); + source.connect(audioCtx.destination); + }) + .catch((err) => { + console.error(`以下の gUM エラーが発生しました: ${err}`); + }); +} else { + console.log("このブラウザーは新しい getUserMedia に対応していません!"); +} +``` + +## 仕様書 + +{{Specifications}} + +## ブラウザーの互換性 + +{{Compat}} From ffec0e0be9c14161c5ecdb6d76761776d8e02194 Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Fri, 15 Sep 2023 08:52:30 +0900 Subject: [PATCH 009/268] =?UTF-8?q?2023/08/11=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=90=8C=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reference/global_objects/eval/index.md | 386 +++++++++++------- 1 file changed, 241 insertions(+), 145 deletions(-) diff --git a/files/ja/web/javascript/reference/global_objects/eval/index.md b/files/ja/web/javascript/reference/global_objects/eval/index.md index 5d6b8a773f3e40..0759f75b5386fa 100644 --- a/files/ja/web/javascript/reference/global_objects/eval/index.md +++ b/files/ja/web/javascript/reference/global_objects/eval/index.md @@ -1,120 +1,221 @@ --- title: eval() slug: Web/JavaScript/Reference/Global_Objects/eval +l10n: + sourceCommit: 4c26e8a3fb50d06963b06017f51ce19364350564 --- {{jsSidebar("Objects")}} > **警告:** 文字列から JavaScript を実行することは、非常に大きなセキュリティリスクを伴います。`eval()` を使用すると、悪意のある者が任意のコードを実行することがあまりにも簡単になります。下記の [eval() を使わないでください!](#eval_を使わないでください!)を参照してください。 -**`eval()`** 関数は、文字列として表現された JavaScript コードを評価します。 +**`eval()`** 関数は、文字列として表現された JavaScript コードを評価します。ソースはスクリプトとして解釈されます。 {{EmbedInteractiveExample("pages/js/globalprops-eval.html")}} ## 構文 -```js -eval(string); +```js-nolint +eval(script) ``` ### 引数 -- `string` - - : JavaScript の式、文、または一連の文を表す文字列です。式には、既存オブジェクトの変数およびプロパティを含められます。 +- `script` + - : JavaScript の式、文、または一連の文を表す文字列です。式には、既存オブジェクトの変数およびプロパティを含められます。これはスクリプトとして解釈されますので、 [`import`](/ja/docs/Web/JavaScript/Reference/Statements/import) 宣言(モジュールの中に存在しうる)は許可されていません。 ### 返値 -与えられたコードの評価結果の値を返します。評価結果が空の場合は、{{jsxref("undefined")}} を返します。 +与えられたコードの評価結果の値を返します。評価結果が空の場合は、{{jsxref("undefined")}} を返します。もし `script` が文字列プリミティブでなければ、 `eval()` は引数を変更せずに返します。 + +### 例外 + +コードを評価している間に発生するあらゆる例外が発生します。もし `script` がスクリプトとして解釈できなかった場合は {{jsxref("SyntaxError")}} になります。 ## 解説 `eval()` はグローバルオブジェクトの関数プロパティです。 -`eval()` 関数の引数は文字列です。その文字列が式に相当する場合、`eval()` は引数を式として評価します。引数が 1 つ以上の JavaScript 文に相当する場合、`eval()` は引数を文として評価します。算術式を評価する目的で `eval()` を呼び出してはいけません。JavaScript は算術式を自動的に評価します。 +`eval()` 関数の引数は文字列です。 +ソース文字列をスクリプト本体として評価します。つまり、文と式の両方が使用可能です。コードの完了値を返します。式の場合は、式が評価された値です。多くの文や宣言も同様に完了値を持ちますが、その結果は意外なものになることがあります(例えば、代入の完了値は代入された値ですが、 [`let`](/ja/docs/Web/JavaScript/Reference/Statements/let) の完了値は undefined です)。そのため、文の完了値には頼らないことをお勧めします。 + +厳格モードでは、 `eval` という名前の変数を宣言したり、 `eval` に代入したりすることは {{jsxref("SyntaxError")}} になります。 + +```js-nolint example-bad +"use strict"; -算術式を文字列として構築した場合、後で `eval()` を使ってそれを評価することができます。例えば `x` という変数があるとします。ある変数に "`3 * x + 2`" といった式の文字列値を代入し、そしてスクリプトの後方で `eval()` を呼び出すことで、`x` が関わる式の評価を後回しにすることができます。 +const eval = 1; // SyntaxError: Unexpected eval or arguments in strict mode +``` -`eval()` の引数が文字列でない場合、`eval()` は引数を変更せずに返します。次の例では `String` コンストラクターが指定されているため、`eval()` は文字列を評価したものではなく `String` オブジェクトを返します。 +`eval()` の引数が文字列でない場合、`eval()` は引数を変更せずに返します。次の例では、プリミティブの代わりに `String` オブジェクトを渡すと、 `eval()` は文字列を評価するのではなく、 `String` オブジェクトを返します。 ```js -eval(new String("2 + 2")); // "2 + 2" を含む String オブジェクトを返します -eval("2 + 2"); // 4 を返します +eval(new String("2 + 2")); // "2 + 2" を含む String オブジェクトを返す +eval("2 + 2"); // 4 を返す ``` -この制約は、`toString` を使用する一般的な方法で回避できます。 +一般的な方法でこの課題をうまく回避するには、`eval()` に渡す前に、自分で[引数を文字列に変換する](/ja/docs/Web/JavaScript/Reference/Global_Objects/String#文字列変換)ことができます。 ```js -var expression = new String("2 + 2"); -eval(expression.toString()); // 4 を返します +const expression = new String("2 + 2"); +eval(String(expression)); // 4 を返します ``` -`eval` 関数を `eval` 以外の名前を参照して呼び出すことで*間接的に*使用した場合、[ECMAScript -5](https://www.ecma-international.org/ecma-262/5.1/#sec-10.4.2) 以降ではローカルスコープではなくグローバルスコープで機能します。これは例えると、関数定義によりグローバル関数が作成されるため、評価されたコードはその呼び出されたスコープ内のローカル変数にアクセスできなくなる、ということです。 - -```ja -function test() { - var x = 2, y = 4; - // 直接呼び出し、ローカルスコープを使用 - console.log(eval('x + y')); // 結果は 6 - // eval を返すカンマ演算子を使用した間接呼び出し - console.log((0, eval)('x + y')); // グローバルスコープを使用、x は未定義のため例外が発生 - // eval を変数に保存して返したものを使用した間接呼び出し - var geval = eval; - console.log(geval('x + y')); // グローバルスコープを使用、x は未定義のため例外が発生 -} +### 直接的または間接的な eval + +`eval()` の呼び出しには、直接的な eval と間接的な eval の 2 つのモードがあります。直接的な eval は `eval( )` が唯一の形です(呼び出す関数の名前は `eval` で、その値はグローバルな `eval` 関数です)。それ以外のすべて は、エイリアス変数経由、メンバーアクセスやその他の式経由、またはオプショナルチェーン [`?.`](/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining) 演算子を使用して呼び出すことも含めて、間接的なものです。 + +```js +// eval を返すためにカンマ演算子を使用する間接的呼び出し +(0, eval)("x + y"); + +// オプショナルチェーンによる間接的呼び出し +eval?.("x + y"); + +// eval を格納し返すために変数を使用する間接的呼び出し +const geval = eval; +geval("x + y"); + +// メンバーアクセスによる間接的呼び出し +const obj = { eval }; +obj.eval("x + y"); ``` +間接的な eval は、コードが別個の ` + + + +

WebSocket Test

+ + +
+ + + ``` ## 関連情報 diff --git a/files/ja/web/api/websockets_api/writing_websocket_servers/index.md b/files/ja/web/api/websockets_api/writing_websocket_servers/index.md index d7b081d804908b..99106db78f38b5 100644 --- a/files/ja/web/api/websockets_api/writing_websocket_servers/index.md +++ b/files/ja/web/api/websockets_api/writing_websocket_servers/index.md @@ -1,6 +1,8 @@ --- title: WebSocket サーバーの記述 slug: Web/API/WebSockets_API/Writing_WebSocket_servers +l10n: + sourceCommit: 592f6ec42e54981b6573b58ec0343c9aa8cbbda8 --- {{APIRef("Websockets API")}} @@ -120,12 +122,14 @@ FIN ビットは、これがシリーズ内の最後のメッセージである ### データの読み込みとマスク解除 -MASK ビットがセットされていた場合は(クライアントからサーバーへのメッセージではそうあるべきです)、次の 4 オクテット(32 ビット)を読み込みます。これがマスキングキーです。ペイロード長とマスキングキーがデコードされたら、ソケットからそのバイト数を読み取ることができます。データを **ENCODED**、キーを **MASK** 呼ぶことにします。 **DECODED** を取得するには、**ENCODED** のオクテット(バイト列、すなわちテキストデータの文字の列)をループし、オクテットを MASK の(i モジュロ 4)番目のオクテットを使用して XOR します。擬似コードで表してみます(JavaScript が有効な場合)。 +MASK ビットがセットされていた場合は(クライアントからサーバーへのメッセージではそうあるべきです)、次の 4 オクテット(32 ビット)を読み込みます。これがマスキングキーです。ペイロード長とマスキングキーがデコードされたら、ソケットからそのバイト数を読み取ることができます。データを `ENCODED`、キーを `MASK` 呼ぶことにします。 `DECODED` を取得するには、`ENCODED` のオクテット(バイト列、すなわちテキストデータの文字の列)をループし、オクテットを `MASK` の(i モジュロ 4)番目のオクテットを使用して XOR します。擬似コードで表してみます(JavaScript が有効な場合)。 ```js -var DECODED = ""; -for (var i = 0; i < ENCODED.length; i++) { - DECODED[i] = ENCODED[i] ^ MASK[i % 4]; +const MASK = [1, 2, 3, 4]; // 4 バイトマスク +const ENCODED = [105, 103, 111, 104, 110]; // encoded string "hello" + +// デコードする内容のバイト配列を作成 +const DECODED = Uint8Array.from(ENCODED, (elt, i) => elt ^ MASK[i % 4]); // マスクの XOR を実行 ``` これで、アプリケーションに応じて **DECODED** が何を意味するのかを理解することができます。 @@ -136,7 +140,7 @@ FIN フィールドとオペコードフィールドは連携して、別々の オペコードはフレームの意味を示しています。`0x1` の場合、ペイロードはテキストです。`0x2` の場合、ペイロードはバイナリデータです。ただし、`0x0` の場合、フレームは継続フレームです。つまりサーバーはフレームのペイロードをそのクライアントから受信した最後のフレームに連結する必要があります。ここでは、サーバーがテキストメッセージを送信するクライアントに反応する概略を示します。第 1 のメッセージは単一のフレームで送信され、第 2 のメッセージは3つのフレームにわたって送信されます。FIN とオペコードの詳細は、クライアントに対してのみ表示されます。 -``` +```plain Client: FIN=1, opcode=0x1, msg="hello" Server: (process complete message immediately) Hi. Client: FIN=0, opcode=0x1, msg="and a" From 8fb8313b4831a76be71bb6b7519f87483bbaecbd Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Sat, 16 Sep 2023 00:43:02 +0900 Subject: [PATCH 031/268] =?UTF-8?q?2023/09/14=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=96=B0=E8=A6=8F=E7=BF=BB=E8=A8=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../index.md | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 files/ja/web/api/websockets_api/writing_a_websocket_server_in_javascript_deno/index.md diff --git a/files/ja/web/api/websockets_api/writing_a_websocket_server_in_javascript_deno/index.md b/files/ja/web/api/websockets_api/writing_a_websocket_server_in_javascript_deno/index.md new file mode 100644 index 00000000000000..cf05008b838cec --- /dev/null +++ b/files/ja/web/api/websockets_api/writing_a_websocket_server_in_javascript_deno/index.md @@ -0,0 +1,130 @@ +--- +title: WebSocket サーバーを JavaScript (Deno) で書く +slug: Web/API/WebSockets_API/Writing_a_WebSocket_server_in_JavaScript_Deno +l10n: + sourceCommit: 50e215d730cd173d93b9bf75785c0d8ed2f67cb0 +--- + +{{DefaultAPISidebar("Websockets API")}} + +この例では、 Deno を使用して WebSocket API サーバーを作成する方法を、付随するウェブページと共に示します。 + +Deno は JavaScript ランタイムで、 TypeScript のコンパイルとオンザフライでのキャッシュに対応しています。 Deno はフォーマッター、リンター、テストランナーなどを持ち、また多くのウェブ API も実装しています。ウェブ標準に準拠するために、 Deno 固有の API はすべて `Deno` 名前空間の下に実装されています。 + +[Deno のウェブサイト](https://deno.com/)では、 Deno のインストール方法を提供しています。 + +執筆時点での Deno のバージョンは `1.36` です。 + +## コード + +コードはサーバー用とクライアント用の 2 つのファイルに格納します。 + +### サーバー + +`main.js` ファイルを作成します。このファイルにはクライアントに HTML を提供する単純な HTTP サーバーのコードを格納します。 + +```js +Deno.serve({ + port: 80, + handler: async (request) => { + // If the request is a websocket upgrade, + // we need to use the Deno.upgradeWebSocket helper + if (request.headers.get("upgrade") === "websocket") { + const { socket, response } = Deno.upgradeWebSocket(request); + + socket.onopen = () => { + console.log("CONNECTED"); + }; + socket.onmessage = (event) => { + console.log(`RECEIVED: ${event.data}`); + socket.send("pong"); + }; + socket.onclose = () => console.log("DISCONNECTED"); + socket.onerror = (error) => console.error("ERROR:", error); + + return response; + } else { + // If the request is a normal HTTP request, + // we serve the client HTML file. + const file = await Deno.open("./index.html", { read: true }); + return new Response(file.readable); + } + }, +}); +``` + +`Deno.upgradeWebSocket()` は接続をウェブソケット接続にアップグレードします。これは[プロトコルアップグレードメカニズム](/ja/docs/Web/HTTP/Protocol_upgrade_mechanism)で詳しく説明されています。 + +[`Deno.serve()`](https://deno.land/api@v1.36.4?s=Deno.serve) は、 `Deno.listen()` と `Deno.serveHttp()` を基盤に使用し、 HTTP サーバーを簡単に設定するための上位インターフェイスです。これがなければ、コードは次のように見ていくことになります。 + +```js +for await (const conn of Deno.listen({ port: 80 })) { + for await (const { request, respondWith } of Deno.serveHttp(conn)) { + respondWith(handler(request)); + } +} +``` + +### クライアント + +`index.html` ファイルを作成します。このファイルには、接続が確立してから 5 秒ごとにサーバーに ping を送信するスクリプトがあります。 + +```html + +

WebSocket Test

+

Sends a ping every five seconds

+
+ +``` + +## コードの実行 + +これら 2 つのファイルを用いて、 Deno を使用してアプリを実行します。 + +```sh +deno run --allow-net=0.0.0.0:80 --allow-read=./index.html main.js +``` + +Deno では、ホストマシン上でアクセスするための明示的な権限を要求します。 + +- `--allow-net=0.0.0.0:80` はアプリが localhost を 80 番ポートで使用することを許可します。 +- `--allow-read=./index.html` はクライアントが HTML ファイルにアクセスできるようにします。 + +## 関連情報 + +- [WebSocket サーバーを書く](/ja/docs/Web/API/WebSockets_API/Writing_WebSocket_servers) From 776d51952cde85b830e7ad561c6861bc5981a8d8 Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 19 Sep 2023 11:59:04 -0600 Subject: [PATCH 032/268] es: Update writing_guidelines/experimental_deprecated_obsolete (#15803) * es: Update writing_guidelines/experimental_deprecated_obsolete * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../experimental_deprecated_obsolete/index.md | 198 +++++++----------- 1 file changed, 77 insertions(+), 121 deletions(-) diff --git a/files/es/mdn/writing_guidelines/experimental_deprecated_obsolete/index.md b/files/es/mdn/writing_guidelines/experimental_deprecated_obsolete/index.md index 275121f6bbead7..04ce87dc14b10a 100644 --- a/files/es/mdn/writing_guidelines/experimental_deprecated_obsolete/index.md +++ b/files/es/mdn/writing_guidelines/experimental_deprecated_obsolete/index.md @@ -1,164 +1,120 @@ --- -title: MDN convenciones y definiciones +title: Experimental, desaprobado y obsoleto slug: MDN/Writing_guidelines/Experimental_deprecated_obsolete +l10n: + sourceCommit: 8d0cbeacdc1872f7e4d966177151585c58fb879e --- {{MDNSidebar}} -Este artículo define algunas convenciones y definiciones que se usan comúnmente en MDN, que pueden no ser obvias para algunas personas cuando las encuentran en la documentación. +Estos términos se asocian comúnmente con tecnologías y especificaciones y se utilizan en MDN Web Docs para etiquetar el estado de una tecnología. Para la definición de estos términos, MDN Web Docs se alinea con el repositorio [Browser Compatibility Data (BCD)](https://github.com/mdn/browser-compat-data/blob/main/schemas/compat-data-schema.md#status-information). +Estos términos se describen a continuación en el contexto de su uso en MDN Web Docs. -## Definiciones +## Experimental -### Desaprobado y obsoleto +Cuando una tecnología se describe como experimental en MDN Web Docs, significa que la tecnología es emergente e inmadura y actualmente está _en proceso_ de ser añadida a la plataforma web (o de ser considerada para su adición). +Marcar una tecnología como experimental indica que los lectores deben pensar cuidadosamente antes de usar esa tecnología en cualquier tipo de proyecto en producción (es decir, un proyecto que no sea solo una demostración o un experimento). Se [anima a los lectores a probar funciones experimentales](https://github.com/mdn/browser-compat-data/blob/main/schemas/compat-data-schema.md#status-information) y proporcionar comentarios a los proveedores de navegadores y autores de estándares. -**Desaprobado** y **obsoleto** son términos comunes asociados con tecnologías y especificaciones, pero ¿qué significan? +Para una tecnología marcada como **experimental**, se aplican una o más de las siguientes condiciones: -- Desaprobado - - En MDN, el término **desaprobado** se usa para marcar una API o tecnología que ya no se recomienda, pero que aún está implementada y puede funcionar. Recientemente, la hemos actualizado a la definición utilizada en nuestro [proyecto de datos de compatibilidad del navegador](https://github.com/mdn/browser-compat-data/blob/master/schemas/compat-data-schema.md#status-information), que esa "característica ya no se recomienda. Es posible que se elimine en el futuro o que solo se conserve por motivos de compatibilidad. Evita el uso de esta funcionalidad." -- Obsoleto - - En MDN, el término **obsoleto** se utiliza para marcar una API o tecnología que no solo ya no se recomienda, sino que ya no se implementa en los navegadores. Sin embargo, esto fue confuso — es similar a desaprobado, y la distinción no es muy útil (aún no debes usarlo en un sitio de producción). Por lo tanto, ya no la usamos, y cualquier instancia con la que te encuentres se debe eliminar/reemplazar por desaprobada. +- Se implementa y habilita de forma predeterminada en la compilación de la versión de **solo un** motor de renderizado de los navegadores principales modernos. +- Solo se admite a través de cambios de configuración como preferencias o parámetros, independientemente del número de motores de renderizado admitidos. +- Es probable que su especificación definitiva cambie significativamente en formas incompatibles con versiones anteriores (es decir, puede romper el código existente que se basa en la característica). -### Experimental +> **Nota:** Una función que solo se publica en un motor de renderizado se sigue considerando experimental, incluso si está disponible en compilaciones de vista previa de otros motores de renderizado (o estableciendo una preferencia o indicador). -**Experimental** puede significar diferentes cosas según el contexto en el que lo escuches o lo leas. Cuando una tecnología se describe como experimental en MDN, significa que la tecnología es incipiente e inmadura, y actualmente está en proceso de ser agregada a la plataforma web (o considerada para agregarla). +El estado **experimental** de una tecnología puede caducar si se cumple una o más de las siguientes condiciones: -Uno o ambos de estos serán ciertos: +- Es compatible de forma predeterminada en **dos o más** de los principales motores de renderizado de los navegadores. +- Es compatible de forma predeterminada con un único motor de renderizado de navegador durante dos o más años y no sufre cambios importantes. +- Es poco probable que su especificación definitiva cambie de manera que rompa la compatibilidad. -- Está implementado y habilitado de forma predeterminada en menos de dos de los principales navegadores modernos. -- Su especificación definitoria no es estable y es probable que cambie significativamente. Por lo tanto, su sintaxis y comportamiento están sujetos a cambios en futuras versiones de navegadores a medida que cambie la especificación. +Para ver ejemplos de estas condiciones, consulte la documentación de [bandera experimental](https://github.com/mdn/browser-compat-data/blob/main/docs/data-guidelines/index.md#setting-experimental) de BCD. -Si una o ambas de estas definiciones es cierta, entonces debes pensar detenidamente antes de comenzar a usar esa tecnología en cualquier tipo de proyecto de producción (es decir, no solo en una demostración o experimento). Consulta también la definición de experimental en nuestro [proyecto de datos de compatibilidad del navegador](https://github.com/mdn/browser-compat-data/blob/master/schemas/compat-data-schema.md#status-information). +Usualmente, si una tecnología es soportada a través de varios de los navegadores principales, la especificación será estable, pero este no es siempre el caso. +Por otro lado, algunas tecnologías pueden tener una especificación estable, pero no tienen soporte nativo en los navegadores. [IMSC](/es/docs/Related/IMSC), por ejemplo, se utiliza mediante un polyfill de JavaScript. -Por el contrario, un elemento ya no es experimental cuando: +Una característica o tecnología que forma parte de una especificación activa o un proceso de estandarización y no está marcada como **obsoleta** se dice que está en **vía de estandarización**. -- Está implementado en dos o más navegadores principales; o -- Su especificación definitoria es estable y es poco probable que cambie. +## Desaprobada -El _or_ es importante aquí — por lo general, si una tecnología es compatible con varios navegadores importantes, la especificación será estable, pero no siempre es así. Y algunas tecnologías tendrán una especificación estable y se usarán bien, pero no tendrán soporte nativo en los navegadores ([IMSC](/es/docs/Related/IMSC), por ejemplo). +El término **desaprobado** en MDN Web Docs se utiliza para marcar una API o tecnología que ya no se recomienda. Una API o tecnología obsoleta podría eliminarse en el futuro o podría conservarse solo por motivos de compatibilidad y seguir funcionando. Recomendamos evitar el uso de las funcionalidades marcadas como desaprobadas. -### Páginas archivadas +Para más información en la definición de **desaprobado**, vea la [la bandera desaprobado](https://github.com/mdn/browser-compat-data/blob/main/docs/data-guidelines/index.md#encuadre-deprecated) de la documentación de BCD. -Las páginas archivadas son páginas que se almacenan en el [Archivo de contenido obsoleto](/es/docs/Archive) de MDN. Estas páginas contienen información lo suficientemente desactualizada como para que ya no sea directamente útil para nadie. +## Obsoleto -Por lo general, estas se refieren a proyectos de Mozilla que han sido descontinuados y ya no se debe confiar en ellos. Pero no las eliminamos simplemente porque forman un registro histórico útil, y algunos de los patrones o ideas contenidos en ellos podrían ser útiles para trabajos futuros. Un buen ejemplo es el [proyecto B2G (Firefox OS)](/es/docs/Archive/B2G_OS). +En MDN Web Docs, el término **obsoleto** se usaba históricamente para indicar una API o tecnología que ya no solo ya no se recomienda, sino que ya no se implementa en los navegadores. +Debido a que la distinción entre **obsoleto** y **desaprobado** no es muy útil, ya no usamos el término **obsoleto** en MDN Web Docs. -#### ¿Cuándo se debe archivar una página? +> **Nota:** Si te encuentras con algún caso de **obsoleto**, debes eliminarlo o reemplazarlo con el término **desaprobado**. -Una página se debe archivar si se ajusta a la descripción anterior. Para archivar una página, debes utilizar la "función Mover página" (_Avanzado > Mover este artículo_) para mover la página al árbol de páginas de archivo (/es/docs/Archive). Es posible que no tengas los permisos para usar esta función, y antes de comenzar a archivar páginas, primero debas discutirlo con la comunidad MDN; habla con nosotros en nuestro [Foro de discusión](https://discourse.mozilla.org/c/mdn). +## Pautas para eliminar contenido -### Páginas eliminadas +A veces, durante el desarrollo de una nueva especificación o en el transcurso de la evolución de los estándares, como en HTML, se agregan nuevos elementos, métodos, propiedades, etc., a la especificación, se mantienen allí durante un tiempo y luego se eliminan. A veces esto sucede muy rápidamente, y a veces estos nuevos elementos permanecen en la especificación durante meses o incluso años antes de ser eliminados. Esto puede hacer que sea difícil decidir cómo manejar la eliminación del elemento de la especificación. -Las páginas eliminadas son páginas que se eliminaron explícitamente de MDN — consulta, por ejemplo, la interfaz [`SharedKeyframeList`](/es/docs/Web/API/SharedKeyframeList) y el constructor [`SharedKeyframeList()`](/es/docs/Web/API/SharedKeyframeList/SharedKeyframeList). Estas páginas contienen información que ya no es útil de ninguna manera y/o puede ser incorrecta hasta el punto en que mantenerla disponible puede ser confuso o malo para la gente. +Aquí hay algunas pautas para ayudarlo a decidir qué hacer cuando se elimina algo de la especificación. -Estas pueden ser: +> **Nota:** A los efectos de esta discusión, la palabra "elemento" se utiliza para referirse a cualquier cosa que pueda ser parte de una especificación: un elemento o un atributo de un elemento, una interfaz o cualquier método individual, una propiedad u otro miembro de una interfaz, y así sucesivamente. -- Páginas de referencia para funciones de API que se eliminaron de la especificación antes de que se implementaran en cualquier navegador. -- Artículos que cubren técnicas que luego se demostró que eran malas prácticas y fueron reemplazadas por mejores técnicas. -- Artículos que contienen información que luego fue reemplazada por otros artículos de mejor calidad. -- Artículos que contienen contenido inapropiado para MDN. -- Traducciones antiguas, desactualizadas y difíciles de arreglar, lo que significa que la versión en inglés es preferible y comenzar una nueva traducción sería una opción más fácil. +### Si el elemento nunca se implementó -#### ¿Cuándo se debe eliminar una página? +Si el elemento _nunca_ fue implementado en una versión de _cualquier_ navegador, ni siquiera detrás de una preferencia o un parámetro, elimine cualquier referencia al elemento de la documentación. -Se debe eliminar una página si se ajusta a la descripción anterior. Para eliminar una página, debes utilizar la función "Eliminar esta página" (_Avanzado> Eliminar esta página_) para eliminar la página. Probablemente no tengas los permisos para usar esta función, y cuando pienses en eliminar páginas, primero debes discutirlo con la comunidad de MDN; habla con nosotros en nuestro [Foro de discusión](https://discourse.mozilla.org/c/mdn). +- Si el artículo tiene alguna página de documentación que describa solo ese artículo (como {{domxref("RTCPeerConnection.close()")}}), elimina esa página. + Si el elemento eliminado es una interfaz, esto significa eliminar también cualquier subpágina que describa las propiedades y los métodos en esa interfaz. +- Elimine el elemento de cualquier lista de propiedades, atributos, métodos, etc. Para los métodos de una interfaz, por ejemplo, esto significa eliminarla de la sección "Métodos" en la página de descripción general de la interfaz. +- Busque en el texto de la página de resumen de esa interfaz, elemento, etc., cualquier referencia al elemento eliminado. Elimine esas referencias, asegurándose de no dejar problemas gramaticales extraños u otros problemas con el texto. Esto puede significar no solo eliminar palabras, sino reescribir una oración o párrafo para que tenga más sentido. También puede significar eliminar secciones enteras de contenido si la descripción del uso del artículo es larga. +- Del mismo modo, busca cualquier discusión sobre el tema en las guías y tutoriales sobre la API o tecnología relevante. Elimine esas referencias, asegurándose de no dejar problemas gramaticales extraños u otros problemas con el texto. Esto puede significar no solo eliminar palabras, sino reescribir una oración o párrafo para que tenga más sentido. También puede significar eliminar secciones enteras de contenido si la descripción del uso del artículo es larga. +- Busque en MDN Web Docs referencias al elemento eliminado, en caso de que haya discusiones en otro lugar. Es poco probable que los haya, ya que si nunca se implementó, es poco probable que se discuta ampliamente. Elimina esas menciones también. +- Si los archivos JSON en el [repositorio de datos de compatibilidad del navegador](https://github.com/mdn/browser-compat-data) contienen datos de los elementos eliminados, elimine esos objetos del código JSON y envíe una solicitud de revisión con ese cambio, explicando el motivo en el mensaje de confirmación y la descripción. Tenga cuidado de no romper la sintaxis JSON mientras lo hace. -### Cuando documentar nuevas tecnologías +### Si el elemento se implementó en un navegador detrás de un argumento -En MDN, buscamos constantemente documentar nuevas tecnologías de estándares web según corresponda. Intentamos lograr un equilibrio entre publicar la documentación lo suficientemente temprano para que los desarrolladores puedan aprender sobre las nuevas funciones tan pronto como lo necesiten y publicarla lo suficientemente tarde para que la tecnología sea madura y estable para que los documentos no necesiten actualizaciones constantes o rápida eliminación. +Si el elemento se implementó en cualquier versión de lanzamiento de uno o más navegadores pero _solo_ detrás de una preferencia o un argumento, no lo elimine de la documentación de inmediato. En su lugar, marca el artículo como **desaprobado** de la siguiente manera: -En general, nuestra definición de lo más temprano que consideraremos para documentar una nueva tecnología es: +- Si el artículo tiene alguna página de documentación que describa solo ese artículo (como {{domxref ("RTCPeerConnection.close()")}}), agrega la macro [`deprecated_header`](https://github.com/mdn/yari/blob/main/kumascript/macros/Deprecated_Header.ejs) a la parte superior de la página y agrega la siguiente entrada de metadato `status:`: -_"Cuando la función está en una pista de estándares y se implementa en algún lugar."_ + ```yaml + status: + - deprecated + ``` -Definitivamente deberías considerar documentar una nueva tecnología si: +- En la página de descripción general del elemento, interfaz o API, busca la lista de elementos que incluye el elemento que se ha eliminado de la especificación y agrega la macro [`deprecated_inline`](https://github.com/mdn/yari/blob/main/kumascript/macros/Deprecated_Inline.ejs) después del nombre del elemento en esa lista. +- Buscar en el texto informativo de la página de resumen de esa interfaz, elemento, etc., cualquier referencia al elemento eliminado. Agregue cuadros de advertencia en los lugares apropiados con texto como "\[item] se ha eliminado de la especificación y se eliminará pronto de los navegadores. Consulta \[enlace a página] para obtener una nueva forma de hacerlo." +- Del mismo modo, busca cualquier discusión sobre el tema en las guías y tutoriales sobre la API o tecnología relevante. Añade advertencias similares. +- Busque en MDN Web Docs referencias al elemento eliminado, en caso de que haya discusiones en otro lugar. Añade mensajes de advertencia similares allí también. +- En algún momento en el futuro, se puede tomar la decisión de eliminar el artículo de la documentación; normalmente no lo hacemos, pero si el artículo estaba especialmente inutilizado o no era interesante, podemos decidir hacerlo. +- Actualizar cualquier entrada relevante en el [Repositorio de datos de compatibilidad del navegador](https://github.com/mdn/browser-compat-data) para reflejar la obsolescencia de los artículos afectados. -- Se especifica en un documento de especificación publicado bajo una organización de estándares confiable (como W3C, WHATWG, Khronos, IETF, etc.), que ha alcanzado un nivel razonable de estabilidad (por ejemplo, un borrador de trabajo del W3C o una recomendación candidata, o la especificación está buscando ser bastante estable a juzgar por el flujo de asuntos presentados en su contra). -- Se implementa de manera consistente en al menos un navegador, y otros desarrolladores de navegadores muestran signos de interés (como un boleto activo o un proceso de "intención de implementar" en vigor). +### Si el elemento se implementó en un navegador sin un parámetro -Deberías tener más cuidado al documentar una nueva tecnología (pero deberías considerarla si tiene sentido) si: +Si el elemento se implementó en una o más compilaciones de versiones de navegadores sin requerir una preferencia o un parámetro, marque el elemento como **desaprobado**, de la siguiente manera: -- No tiene una especificación, o la especificación es una nota aproximada que parece estar sujeta a cambios. -- Uno o cero navegadores lo implementan actualmente, y los navegadores que no lo admiten no muestran signos de interés en implementarlo (puedes evaluar esto preguntando a los ingenieros que trabajan en esos navegadores, buscando rastreadores de errores del navegador y listas de correo, etc.). +- Si el artículo tiene alguna página de documentación que describa solo ese artículo (como {{domxref ("RTCPeerConnection.close()")}}), agrega la macro [`deprecated_header`](https://github.com/mdn/yari/blob/main/kumascript/macros/Deprecated_Header.ejs) a la parte superior de la página y agrega la siguiente entrada de metadato `status:`: -No debes considerar documentar una nueva tecnología si: + ```yaml + status: + - deprecated + ``` -- No es una tecnología expuesta a la web y/o es completamente propietaria. -- Ya muestra signos de estar obsoleto o reemplazado por una característica similar. +- En la página de descripción general del elemento, interfaz o API, busca la lista de elementos que incluye el elemento que se ha eliminado de la especificación y agrega la macro [`deprecated_inline`](https://github.com/mdn/yari/blob/main/kumascript/macros/Deprecated_Inline.ejs) después del nombre del elemento en esa lista. +- Buscar en el texto informativo de la página de resumen de esa interfaz, elemento, etc., cualquier referencia al elemento eliminado. Agregue mensajes de advertencia en los lugares apropiados con texto como "\[item] ha sido eliminado de la especificación y está desaprobado. Es posible que se elimine de los navegadores en el futuro, por lo que no debes usarlo. Consulta \[enlace a página] para obtener una nueva forma de hacerlo." +- Del mismo modo, busca cualquier discusión sobre el tema en las guías y tutoriales sobre la API o tecnología relevante. Añade advertencias similares. +- Busque en MDN Web Docs referencias al elemento eliminado, en caso de que haya discusiones en otro lugar. Añade mensajes de advertencia similares allí también. +- Es poco probable que estos artículos se eliminen de la documentación en el corto plazo, si es que se eliminan alguna vez. +- Actualizar cualquier entrada relevante en el [Repositorio de datos de compatibilidad del navegador](https://github.com/mdn/browser-compat-data) para reflejar la caducidad de los artículos afectados. -## Convenciones +Utilice el sentido común con la redacción de los mensajes de advertencia y otros cambios en el texto sugeridos en las pautas anteriores. +Diferentes elementos requerirán una redacción y un manejo diferente de la situación. +En caso de duda, no dudes en pedir consejo en las [salas de chat de MDN Web Docs](/es/docs/MDN/Community/Communication_channels#chat_rooms). -### Cuando se elimina algo de la especificación +## Pautas para documentar un conflicto de especificaciones -A veces, durante el desarrollo de una nueva especificación, o en el transcurso de la evolución de los estándares como HTML, se agregan nuevos elementos, métodos, propiedades, etc. a la especificación, permanecen allí por un tiempo y luego se eliminan nuevamente. A veces, esto sucede muy rápido y, a veces, estos nuevos elementos permanecen en la especificación durante meses o incluso años antes de ser eliminados. Esto puede hacer que sea complicado decidir cómo manejar la eliminación del artículo de la especificación. Aquí hay algunas pautas que te ayudarán a decidir qué hacer. +A veces, pero rara vez, puede haber un conflicto entre diferentes versiones de especificaciones (generalmente W3C versus WHATWG). Por ejemplo, una versión puede tener una función que aparece como obsoleta, mientras que la otra no. +En tales casos, considere cuál es la realidad, es decir, considere qué están haciendo realmente los navegadores y escriba una nota "importante" para resumir ese último estado. +Por ejemplo, a partir de enero de 2019, el atributo global [`inputmode`](/es/docs/Web/HTML/Global_attributes/inputmode) tiene un conflicto, que se resumió así: -> **Nota:** Para los propósitos de esta discusión, la palabra "elemento" se usa para significar cualquier cosa que pueda ser parte de una especificación: un elemento o un atributo de un elemento, una interfaz o cualquier método individual, propiedad u otro miembro de una interfaz, etcétera. - -- Si el elemento _nunca_ se implementó en una versión de lanzamiento de _cualquier_ navegador, incluso detrás de una preferencia o marca, simplemente elimina cualquier referencia al elemento de la documentación. - - - Si el elemento tiene páginas de documentación que describen solo ese elemento (como {{domxref("RTCPeerConnection.close()")}}), elimina esa página. Si el elemento eliminado es una interfaz, esto significa eliminar también las subpáginas que describen las propiedades y los métodos de esa interfaz. - - Elimina el elemento de cualquier lista de propiedades, atributos, métodos, etc. Para los métodos de una interfaz, eso significa eliminarlo de la sección "Métodos" en la página de descripción general de la interfaz, por ejemplo. - - Busca en el texto de la página de descripción general para esa interfaz, elemento, etc., cualquier referencia al elemento eliminado. Elimina esas referencias, asegurándote de no dejar extraños problemas gramaticales u otros problemas con el texto. Esto puede significar no solo borrar palabras, sino reescribir una oración o párrafo para que tenga más sentido. También puede significar eliminar secciones enteras de contenido si la descripción del uso del elemento es extensa. - - Del mismo modo, busca cualquier discusión sobre el tema en las guías y tutoriales sobre la API o tecnología relevante. Elimina esas referencias, asegurándote de no dejar extraños problemas gramaticales u otros problemas con el texto. Esto puede significar no solo borrar palabras, sino reescribir una oración o párrafo para que tenga más sentido. También puede significar eliminar secciones enteras de contenido si la descripción del uso del elemento es extensa. - - Busca en MDN referencias al elemento eliminado, en caso de que haya discusiones en otro lugar. Es poco probable que las haya, ya que si nunca se implementó, es poco probable que se discuta ampliamente. Elimina también esas menciones. - - Si el [repositorio de datos de compatibilidad del navegador](https://github.com/mdn/browser-compat-data) contienen datos de los elementos eliminados, elimina esos objetos del código JSON y envía una SE con ese cambio, explicando por qué en el mensaje de confirmación y la descripción de la SE. Ten cuidado de no romper la sintaxis JSON mientras haces esto. - -- Si el elemento se implementó en cualquier versión de lanzamiento de uno o más navegadores, pero _solo_ detrás de una preferencia o marca, no elimines el elemento de la documentación inmediatamente. En su lugar, marca el artículo como obsoleto de la siguiente manera: - - - Si el elemento tiene páginas de documentación que describen solo ese elemento (como {{domxref("RTCPeerConnection.close()")}}), agrega la macro [`deprecated_header`](https://github.com/mdn/yari/tree/main/kumascript/macros/deprecated_header.ejs) en la parte superior de la página y agrega la etiqueta `Deprecated` a la lista de etiquetas de la página. - - En la página de descripción general del elemento, la interfaz o la API, busca la lista de elementos que incluyan el elemento que se ha eliminado de la especificación y agrega la macro [`deprecated_inline`](https://github.com/mdn/yari/tree/main/kumascript/macros/deprecated_inline.ejs) después del nombre del elemento en esa lista. - - Busca en el texto informativo de la página de descripción general de esa interfaz, elemento, etc., cualquier referencia al elemento eliminado. Agrega cuadros de advertencia en los lugares apropiados con texto del tipo "\[lo que sea] se ha eliminado de la especificación y pronto se eliminará de los navegadores. Consulta \[enlace a la página] para conocer una nueva forma de hacer esto." - - Del mismo modo, busca cualquier discusión sobre el tema en las guías y tutoriales sobre la API o tecnología relevante. Agrega advertencias similares. - - Busca en MDN referencias al elemento eliminado, en caso de que haya discusiones en otro lugar. Agrega también cuadros de advertencia similares allí. - - En algún momento en el futuro, se puede tomar la decisión de eliminar el elemento de la documentación; Normalmente no hacemos esto, pero si el artículo no se utilizó o no fue interesante, podemos decidir hacerlo. - - Actualiza cualquier entrada relevante en el [repositorio de datos de compatibilidad del navegador](https://github.com/mdn/browser-compat-data) para reflejar la obsolescencia de los elementos afectados. - -- Si el elemento se implementó en una o más versiones de publicaciones de navegadores, sin que sea necesario cambiar una preferencia o una marca, marca el elemento como obsoleto, de la siguiente manera: - - - Si el elemento tiene páginas de documentación que describen solo ese elemento (como {{domxref("RTCPeerConnection.close()")}}), agrega la macro [`deprecated_header`](https://github.com/mdn/yari/tree/main/kumascript/macros/deprecated_header.ejs) en la parte superior de la página y agrega la etiqueta `Deprecated` a la lista de etiquetas de la página. - - En la página de descripción general del elemento, la interfaz o la API, busca la lista de elementos que incluyan el elemento que se ha eliminado de la especificación y agrega la macro [`deprecated_inline`](https://github.com/mdn/yari/tree/main/kumascript/macros/deprecated_inline.ejs) después del nombre del elemento en esa lista. - - Busca en el texto informativo de la página de descripción general de esa interfaz, elemento, etc., cualquier referencia al elemento eliminado. Agrega recuadros de advertencia en los lugares apropiados con texto del tipo "\[lo que sea] se ha eliminado de la especificación y está obsoleto. Es posible que se elimine de los navegadores en el futuro, por lo que no debes usarlo. Consulta \[enlace a la página] para conocer una nueva forma de hacer esto." - - Del mismo modo, busca cualquier discusión sobre el tema en las guías y tutoriales sobre la API o tecnología relevante. Agrega advertencias similares. - - Busca en MDN referencias al elemento eliminado, en caso de que haya discusiones en otro lugar. Agrega también cuadros de advertencia similares allí. - - Es poco probable que estos elementos se eliminen de la documentación pronto, si es que alguna vez lo hacen. Sin embargo, es posible que parte o todo el material se mueva a la sección [Archivo](/es/docs/Archive) del sitio. - - Actualiza todas las entradas relevantes en el [repositorio de datos de compatibilidad del navegador](https://github.com/mdn/browser-compat-data) para reflejar la obsolescencia de los elementos afectados. - -Utiliza el sentido común con la redacción de los mensajes de advertencia y otros cambios en el texto sugeridos por las pautas anteriores. Los diferentes elementos requerirán una redacción y un manejo diferentes de la situación. En caso de duda, no dudes en pedir consejo en la [sala del chat de Docs Web de MDN](https://chat.mozilla.org/#/room/#mdn:mozilla.org) en [Matrix](https://wiki.mozilla.org/Matrix), o en el [foro de debate de Docs Web de MDN](https://discourse.mozilla.org/c/mdn). - -### Copiar contenido dentro de MDN - -A veces, necesitas reutilizar el mismo texto en varias páginas (o deseas usar el contenido de una página como plantilla para otra página). Tienes tres opciones: - -- Si deseas copiar una página completa: - - 1. Mientras visualizas la página que deseas copiar, en el menú **Avanzado** (engrane), elige [**Clona esta página**](/es/docs/MDN/Contribute/Creating_and_editing_pages#Clone_of_an_existing_page). Esto abre la interfaz de usuario del editor para una nueva página, con el contenido de la página clonada ya poblada. - 2. Introduce un **título** y un **`slug`** nuevo para la página clonada. - 3. Edita el contenido de la página según sea necesario y guárdalo como usualmente lo haces. - -- Si deseas copiar solo una parte de una página, **no solo visites la página y la copies**. Esto introduce bits adicionales de HTML no deseados en la página destino, y alguien tendrá que limpiar eso, tú u otro editor. Nadie quiere eso. Para copiar parte de una página MDN a otra página: - - 1. En la página fuente, haz clic en el botón **Editar** en la página de fuente. - 2. **Copia el contenido que deseas reutilizar desde la interfaz de usuario del editor.** - 3. Haz clic en **Descartar** para salir de la interfaz de usuario del editor de esa página. - 4. Abre la interfaz de usuario del editor de la página donde deseas pegar. - 5. Pega el contenido del portapapeles. - - > **Nota:** Chrome generalmente no incluye las clases aplicadas al contenido al copiar y pegar documentos en nuestro editor. Debes revisar el contenido después de hacer esto y volver a aplicar los estilos perdidos. Checa las tablas, cuadros de sintaxis, resaltado de sintaxis y secciones ocultas de contenido en particular. - -- A veces, literalmente, deseas utilizar el mismo contenido en muchas páginas. En este caso, es mejor que coloques el contenido en una página y luego uses la macro [`Page`](https://github.com/mdn/yari/tree/main/kumascript/macros/Page.ejs) para trasladar el material de una página a otra. De esta forma, siempre que se actualice el texto de la página fuente, la página de destino también se actualizará (es decir, esto sucederá en una actualización forzada o cuando la página destino pase por una reconstrucción programada). - -#### Copiar contenido de otro lugar - -A menudo, hay contenido útil sobre un tema en algún lugar de la web además de MDN. Sin embargo, copiar dicho contenido puede plantear dificultades, tanto legales como técnicas. - -En el nivel técnico, los motores de búsqueda suelen penalizar a un sitio en su clasificación por reproducir contenido disponible en otros lugares. Por lo tanto, es preferible tener contenido original en MDN, para mejorar la clasificación del contenido de MDN en los motores de búsqueda. Puedes vincular al contenido existente de MDN. - -A nivel legal, debes estar autorizado para contribuir con el contenido, y debes tener licencia y atribución de una manera que sea compatible con [licencia de MDN](/es/docs/MDN/About#Copyrights_and_licenses). - -- **Si creaste el contenido existente** (para tus propios fines y no como trabajo por encargo) y estás dispuesto a contribuir a MDN con la licencia de MDN, este es el caso más fácil y estás libre de contribuir con el contenido. -- **Si los derechos de autor del contenido pertenecen a otra persona**, debes tener licencia y atribuir de manera compatible con la licencia de MDN. A menudo, no es fácil para alguien que no es abogado determinar qué licencias son compatibles. Para estar seguro, comunícate con un miembro del [equipo de personal de MDN](https://wiki.mozilla.org/MDN#Staff_Team), quien puede consultar al equipo legal de Mozilla para obtener orientación si es necesario . - -#### Cómo comunicar un conflicto de especificaciones - -Ten en cuenta que a veces (pero rara vez) hay un conflicto entre diferentes versiones de especificaciones (generalmente W3C versus WHATWG), p. ej. una versión puede tener una característica listada como obsoleta, mientras que la otra no. En tales casos, considera cuál es la realidad, es decir, qué están haciendo los navegadores, y escribe una nota "importante" para resumir ese último estado. Por ejemplo, a enero de 2019, el atributo global [`inputmode`](/es/docs/Web/HTML/Global_attributes/inputmode) tiene un conflicto, que se resumió al igual que: - -> **Advertencia:** **Conflicto de especificaciones**: La [lista de especificaciones de WHATWG `inputmode`](https://html.spec.whatwg.org/multipage/interaction.html#attr-inputmode), y los navegadores modernos están trabajando para admitirlo. Sin embargo, la [especificación W3C HTML 5.2](https://www.w3.org/TR/html52/index.html#contents) ya no la incluye (es decir, la marca como desaprobada). Debes considerar que la definición del WHATWG es correcta, hasta que se logre un consenso. +> **Advertencia:** Conflicto de especificación: La especificación WHATWG enumera [`inputmode`](https://html.spec.whatwg.org/multipage/interaction.html#attr-inputmode) y los navegadores modernos están trabajando para soportarlo. +> La [especificación HTML 5.2 del W3C](https://html.spec.whatwg.org/multipage/index.html#contents), sin embargo, ya no la enumera (es decir, la marca como obsoleta). +> Debe considerar la definición de WHATWG como correcta, hasta que se llegue a un consenso. From 7b47b10efb42ba405a3673422fdf9fa5d305c1bd Mon Sep 17 00:00:00 2001 From: du33169 <46591250+du33169@users.noreply.github.com> Date: Wed, 20 Sep 2023 12:19:49 +0800 Subject: [PATCH 033/268] fix(typo): scrpit -> script (#15963) --- .../add-ons/webextensions/your_second_webextension/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/zh-cn/mozilla/add-ons/webextensions/your_second_webextension/index.md b/files/zh-cn/mozilla/add-ons/webextensions/your_second_webextension/index.md index 12654a43518381..1f62bfbead99bc 100644 --- a/files/zh-cn/mozilla/add-ons/webextensions/your_second_webextension/index.md +++ b/files/zh-cn/mozilla/add-ons/webextensions/your_second_webextension/index.md @@ -311,7 +311,7 @@ browser.tabs .catch(reportExecuteScriptError); ``` -从 96 行开始。只要弹出窗加载完,popup scrpit 就会使用 [`browser.tabs.executeScript()`](/zh-CN/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) API 在活跃标签页执行 content script。如果执行 content scrpit 成功,content script 会在页面中一直保持,直到标签被关闭或者用户导航到其他页面。 +从 96 行开始。只要弹出窗加载完,popup script 就会使用 [`browser.tabs.executeScript()`](/zh-CN/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) API 在活跃标签页执行 content script。如果执行 content script 成功,content script 会在页面中一直保持,直到标签被关闭或者用户导航到其他页面。 `browser.tabs.executeScript()`调用失败的常见原因是你不能在所有页面执行 content scripts。例如,你不能在特权浏览器页面执行,像 about:debugging,你也不能在[addons.mozilla.org](https://addons.mozilla.org/)域执行。如果调用失败,`reportExecuteScriptError()`会隐藏`"popup-content"` `
`,并展示`"error-content"` `
`, 然后打印一个错误到[控制台](/zh-CN/Add-ons/WebExtensions/Debugging)。 From 3c70ec060c53ccf075fb1d9d1e2b4dd544917de0 Mon Sep 17 00:00:00 2001 From: Fina <42113148+BSPR0002@users.noreply.github.com> Date: Wed, 20 Sep 2023 13:22:04 +0800 Subject: [PATCH 034/268] zh-cn: init the translation of "CycleTracker: Service workers" (#15936) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: A1lo --- .../cycletracker/service_workers/index.md | 401 ++++++++++++++++++ 1 file changed, 401 insertions(+) create mode 100644 files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/service_workers/index.md diff --git a/files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/service_workers/index.md b/files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/service_workers/index.md new file mode 100644 index 00000000000000..2344b1ca7dcbad --- /dev/null +++ b/files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/service_workers/index.md @@ -0,0 +1,401 @@ +--- +title: 经期跟踪器:Service worker +short-title: Service worker +slug: Web/Progressive_web_apps/Tutorials/CycleTracker/Service_workers +--- + +{{PWASidebar}} + +{{PreviousMenu("Web/Progressive_web_apps/Tutorials/CycleTracker/Manifest_file", "Web/Progressive_web_apps/Tutorials/CycleTracker")}} + +目前为止,我们已经为经期跟踪器编写了 HTML、CSS 和 JavaScript,添加了清单文件用于定义颜色、图标、URL 以及其他的应用特性。我们已经有了一个能运行的 Web 应用!但它还不是一个 PWA。在这一章节,我们将要编写将我们的功能完整、能够作为独立应用分发并且能无缝地在离线状态下运行的 Web 应用转化为 PWA 所需的 JavaScript 脚本。 + +如果你还没有完成到这一步,请复制这些 [HTML](https://github.com/mdn/pwa-examples/tree/master/cycletracker/manifest_file/index.html)、[CSS](https://github.com/mdn/pwa-examples/tree/master/cycletracker/manifest_file/style.css)、[JavaScript](https://github.com/mdn/pwa-examples/tree/master/cycletracker/manifest_file/app.js),还有[清单](https://github.com/mdn/pwa-examples/tree/master/cycletracker/manifest_file/cycletracker.json) JSON 文件的内容,并分别按照以下文件名保存:`index.html`、`styles.css`、`app.js` 以及 `cycletracker.json`。 + +在本章节,我们要创建 `sw.js`——service worker 脚本,用于将我们的 Web 应用转化成 PWA。我们已经有了一个 JavaScript 文件——在 HTML 文件的最后一行里名为 `app.js` 的那一个。这个 JavaScript 脚本提供了全部标准 Web 应用特性的功能。我们并不会像使用 `app.js` 那样通过 {{HTMLElement("script")}} 元素的 `src` 属性来调用 `sw.js`,而是通过注册 service worker 来建立它与 Web 应用的联系。 + +在本课程的最后,你将会拥有一个功能完整的 PWA——一个能够被完整安装的、即使用户处于离线状态也能运行的逐步增强的 Web 应用。 + +## Service worker 的职责 + +Service worker 能够让应用离线运行,并且时刻确保应用是最新的。为了能出色地做到这点,service worker 应当包含以下信息: + +- 版本号(或者其他标识)。 +- 缓存资源的列表。 +- 缓存版本的名称。 + +Service worker 还需要负责: + +- 在应用被安装时安装缓存资源。 +- 根据需要更新自身和其他的应用文件。 +- 移除不会再被用到的缓存文件。 + +我们通过响应以下三种 service worker 事件来实现这些任务: + +- [`fetch`](/zh-CN/docs/Web/API/ServiceWorkerGlobalScope/fetch_event) 事件、 +- [`install`](/zh-CN/docs/Web/API/ServiceWorkerGlobalScope/install_event) 事件,以及 +- [`activate`](/zh-CN/docs/Web/API/ServiceWorkerGlobalScope/activate_event) 事件。 + +### 版本号 + +PWA 一但在用户的机器上被安装,唯一通知浏览器有要检索的更新文件的方法就是对 service worker 作出修改。如果 PWA 的其他资源发生了改动——比如 HTML 更新了、CSS 里的 bug 被修复了、`app.js` 添加了新函数、一张图片被压缩了以减少文件体积,等等——你安装的 PWA 的 service worker 是不会知道它需要下载更新资源的。只有 service worker 被改动了,PWA 才会知道它也许该更新缓存了,然后去发起更新的任务。 + +虽然修改任意字符在技术上都足以达成,但 PWA 的最佳做法是创建一个按顺序更新的版本号常量用以指示文件的更新。即使 service worker 本身没有其他任何的改动,也应当以更新版本号(或者日期)这种较为正式的方式对 service worker 做出修改,这也是给开发人员提供一种辨别应用版本的方法。 + +#### 任务 + +新建一个包含版本号的 JavaScript 文件: + +```js +const VERSION = "v1"; +``` + +将文件保存为 `sw.js`。 + +### 离线资源列表 + +为了能有优良的离线体验,缓存文件列表应当包含 PWA 离线时需要使用的所有资源。即使清单文件里可能会罗列出一大堆各种大小的图标,应用缓存也只需要包含应用在离线模式下需要使用的资源。 + +```js +const APP_STATIC_RESOURCES = [ + "/", + "/index.html", + "/styles.css", + "/app.js", + "/icon-512x512.png", +]; +``` + +你不需要把在各个不同操作系统和设备上使用的各个图标都包含进列表里。而是应该把应用使用的所有图片包含进来,包括在应用启动缓慢时用户可能会看见的应用启动页面或者提示用户“你需要连接到互联网以获得完整体验”的页面所使用的素材。 + +不要把 service worker 文件包含到缓存资源列表里。 + +#### 任务 + +向 `sw.js` 添加用于经期跟踪器 PWA 的缓存资源列表。 + +#### 示例方案 + +我们包括了在本教程的其他章节中所创建的经期跟踪器在离线状态下运作所需的静态资源。我们的 `sw.js` 文件目前是这样的: + +```js +const VERSION = "v1"; + +const APP_STATIC_RESOURCES = [ + "/", + "/index.html", + "/styles.css", + "/app.js", + "/cycletrack.json", + "/icons/wheel.svg", +]; +``` + +我们包括了 `wheel.svg` 图标,以备你要增强 PWA 的 UI 时使用,比如在没有经期数据时显示 logo,虽然我们的应用目前并没有使用它。 + +### 应用缓存名称 + +我们有了版本号,也有了需要缓存的文件。在缓存文件之前,我们需要创建一个在存储应用的静态资源时需要使用的缓存名称。这个缓存名称应当被版本化,以确保在应用更新时可以创建新的缓存同时删除旧的缓存。 + +#### 任务 + +使用 `VERSION` 版本号来创建一个版本化的 `CACHE_NAME` 缓存名,作为常量添加到 `sw.js`。 + +#### 示例方案 + +我们将缓存命名为 `period-tracker-` 后跟 `VERSION` 版本号。鉴于我们的常量声明都是单行的,为了方便阅读,我们将其放在了资源数组常量的前面。 + +```js +const VERSION = "v1"; +const CACHE_NAME = `period-tracker-${VERSION}`; + +const APP_STATIC_RESOURCES = [ ... ]; +``` + +我们成功声明了我们的常量:一个唯一的标识符、数组形式的离线资源列表以及随版本号更新的应用缓存名称。现在,让我们把注意力转向安装、更新以及删除无用的缓存资源。 + +### 在 PWA 安装过程中保存缓存 + +当用户安装 PWA 或者只是单纯的访问带有 service worker 的网站时,会在 service worker 的作用域触发一个 `install` 事件。我们想要监听这个事件,在安装期间用 PWA 的静态资源填充缓存。每当 service worker 的版本更新,浏览器都会安装新的 service worker 并触发安装事件。 + +`install` 事件会在应用第一次被安装或者浏览器检测到有新版本的 service worker 时触发。当旧的 service worker 将要被新的替换时,旧的 service worker 仍然会作为 PWA 的 service worker,直到新的 service worker 被激活。 + +全局变量 [`caches`](/zh-CN/docs/Web/API/caches) 只在安全上下文中可用,它会返回一个与当前上下文关联的 {{domxref("CacheStorage")}} 对象。{{domxref("CacheStorage.open()")}} 方法会返回一个 {{jsxref("Promise")}} 对象,可以兑现一个名称与作为参数传递的名称相符的 {{domxref("Cache")}} 对象。 + +{{domxref("Cache.addAll()")}} 方法接收一个 URL 数组作为参数,然后会检索这些 URL,将它们的响应添加到指定的缓存中。[`waitUntil()`](/zh-CN/docs/Web/API/ExtendableEvent/waitUntil) 方法可以告诉浏览器在 Promise 被敲定前,工作仍在进行中,浏览器如果想让工作能够完成就不应该终止 service worker。浏览器负责执行并在必要时终止 service worker,`waitUntil` 方法可用于请求浏览器在任务执行时不要终止 service worker。 + +```js +self.addEventListener("install", (e) => { + e.waitUntil((async () => { + const cache = await caches.open("cacheName_identifier"); + cache.addAll([ + "/", + "/index.html" + "/styles.css" + "/app.js" + ]); + })() + ); +}); +``` + +#### 任务 + +添加一个安装事件监听器,用于检索并存储 `APP_STATIC_RESOURCES` 列表中的文件到名为 `CACHE_NAME` 的缓存中。 + +#### 示例方案 + +```js +self.addEventListener("install", (event) => { + event.waitUntil( + (async () => { + const cache = await caches.open(CACHE_NAME); + cache.addAll(APP_STATIC_RESOURCES); + })(), + ); +}); +``` + +### 更新 PWA 并删除旧缓存 + +正如上文提到的,当现有的 service worker 将要被新的替换时,现有的 service worker 仍然会作为 PWA 的 service worker,直到新的 service worker 被激活。我们使用 `activate` 事件来删除旧的缓存以避免空间被耗尽。我们对被命名的 {{domxref("Cache")}} 对象进行迭代,删除除了目前在使用外的全部缓存,然后将 service worker 设为 PWA 的 [`controller`](/zh-CN/docs/Web/API/ServiceWorkerContainer/controller)。 + +我们监听当前 service worker 全局作用域的 [`activate`](/zh-CN/docs/Web/API/ServiceWorkerGlobalScope/activate_event) 事件。 + +我们获取现有的命名缓存,使用 {{domxref("CacheStorage.keys()")}} 方法(重新通过全局 {{domxref("caches")}} 属性访问 `CacheStorage`),它会返回一个 {{jsxref("Promise")}} 对象,可兑现一个包含对应到按创建顺序排列的命名 {{domxref("Cache")}} 对象的字符串的数组。 + +我们使用 [`Promise.all()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) 方法来迭代命名缓存 Promise 列表。`all()` 方法接收一个可迭代的 Promise 列表,并返回单个 `Promise`。对于列表中的每个命名缓存,检查其是否是当前活动的缓存。如果不是,用 `Cache` 的 [`delete()`](/zh-CN/docs/Web/API/Cache/delete) 方法删除它。 + +最后一行 `await clients.claim()` 使用 [`Clients`](/zh-CN/docs/Web/API/Clients) 接口的 [`claim()`](/zh-CN/docs/Web/API/Clients/claim) 方法来启用我们的 service worker 以将其设为我们客户端的控制器,“客户端”指正在运行的一个 PWA 实例。`claim()` 方法用于使 service worker 接管控制其作用域内的所有客户端。这样,作用域内已加载的客户端就不需要重新加载。 + +```js +self.addEventListener("activate", (event) => { + event.waitUntil( + (async () => { + const names = await caches.keys(); + await Promise.all( + names.map((name) => { + if (name !== CACHE_NAME) { + return caches.delete(name); + } + }), + ); + await clients.claim(); + })(), + ); +}); +``` + +#### 任务 + +将上述 `activate` 事件监听器添加至你的 `sw.js` 文件。 + +### fetch 事件 + +我们可以利用 [`fetch`](/zh-CN/docs/Web/API/ServiceWorkerGlobalScope/fetch_event) 事件的优势,在用户处于在线状态时阻止已安装的 PWA 发起请求。监听 fetch 事件使得拦截所有请求并使用缓存的响应内容进行响应而不流经网络变得可能。大多数的应用不需要这样的行为。事实上,许多商业模式出于跟踪和营销目的都希望用户定期发送服务器请求。所以,尽管拦截请求对于某些应用来说是一种反面模式,但为了提高我们的经期跟踪器应用的隐私性,我们不希望应用发出不必要的网络请求。 + +鉴于我们的 PWA 只由单一的页面构成,对于页面导航请求,我们返回至 `index.html` 主页面,因为没有其他页面,我们也不想请求总是发送到服务器。如果 Fetch API 的 [`Request`](/zh-CN/docs/Web/API/Request) 的只读属性 [`mode`](/zh-CN/docs/Web/API/Request/mode) 值为 `navigate`,意味着它在查找一个 Web 页面,我们使用 FetchEvent 的 [`respondWith()`](/zh-CN/docs/Web/API/FetchEvent/respondWith) 方法来阻止浏览器默认的 fetch 处理,使用 [`caches.match()`](/zh-CN/docs/Web/API/CacheStorage/match) 方法来提供我们自己的响应 Promise。 + +对于其他所有的请求模式,我们则按照在 [install 事件响应](#在_pwa_安装过程中保存缓存)里的那样打开缓存,向同样的 `match()` 方法传递事件请求。它会检查请求是否是已存储的 {{domxref("Response")}} 的键。如果是,我们返回缓存的响应,如果不是,我们返回一个 [404 状态码](/zh-CN/docs/Web/HTTP/Status/404)作为响应。 + +使用 [`Response()`](/zh-CN/docs/Web/API/Response/Response) 构造器,传递为 `null` 的主体以及一个 `404` 的状态码作为选项,并不意味着我们的 PWA 出错了。相反,我们需要的所有东西应该都已经在缓存里了,如果没有,我们也不用去服务器解决这个小问题。 + +```js +self.addEventListener("fetch", (event) => { + // 当在查找 HTML 页面时 + if (event.request.mode === "navigate") { + // 返回到 index.html 页面 + event.respondWith(caches.match("/")); + return; + } + + // 对于其他所有请求模式 + event.respondWith( + (async () => { + const cache = await caches.open(CACHE_NAME); + const cachedResponse = await cache.match(event.request.url); + if (cachedResponse) { + // 如果有缓存的响应可用就将其返回 + return cachedResponse; + } else { + // 响应 HTTP 404 状态码 + return new Response(null, { status: 404 }); + } + })(), + ); +}); +``` + +## 完善 service worker 文件 + +你的 `sw.js` 文件现在应该和下面的 JavaScript 脚本相似。要注意,当 `APP_STATIC_RESOURCES` 数组中的资源列表发生了任何改动,我们唯一需要在这个 service worker 中更新的常量或功能就是 `VERSION` 的值。 + +```js +// 缓存的版本 +const VERSION = "v1"; + +// 缓存的名称 +const CACHE_NAME = `period-tracker-${VERSION}`; + +// 使应用运作所需的静态资源 +const APP_STATIC_RESOURCES = [ + "/", + "/index.html", + "/app.js", + "/styles.css", + "/icons/wheel.svg", +]; + +// 在安装时缓存缓存静态资源 +self.addEventListener("install", (event) => { + event.waitUntil( + (async () => { + const cache = await caches.open(CACHE_NAME); + cache.addAll(APP_STATIC_RESOURCES); + })(), + ); +}); + +// 在被激活时删除旧的缓存 +self.addEventListener("activate", (event) => { + event.waitUntil( + (async () => { + const names = await caches.keys(); + await Promise.all( + names.map((name) => { + if (name !== CACHE_NAME) { + return caches.delete(name); + } + }), + ); + await clients.claim(); + })(), + ); +}); + +// 在 fetch 时,拦截服务器请求并用缓存的响应内容进行响应而不流经网络 +self.addEventListener("fetch", (event) => { + // 作为一个单页应用,总是将应用定向到缓存的主页面 + if (event.request.mode === "navigate") { + event.respondWith(caches.match("/")); + return; + } + + // 对于其他所有请求,先找缓存,再去网络 + event.respondWith( + (async () => { + const cache = await caches.open(CACHE_NAME); + const cachedResponse = await cache.match(event.request.url); + if (cachedResponse) { + // 如果有缓存的响应可用就将其返回 + return cachedResponse; + } else { + // 如果资源不在缓存中,返回 404 + return new Response(null, { status: 404 }); + } + })(), + ); +}); +``` + +当更新 service worker 本身时,不需要更新 VERSION 常量,因为 service worker 脚本内容的任何更改都会触发浏览器去安装新的 service worker。但不论如何,更新版本号是方便开发人员(也包括你自己)的好习惯。可以在浏览器中通过[在应用程序工具中检查缓存的名称](#使用开发者工具)(或在源代码工具)来查看当前正在运行的是哪一个版本的 service worker。 + +**备注**:在对应用的任何资源(包括 CSS、HTML、JS 代码和图像素材)做出更改后更新版本号是非常重要的。版本号或者对 service worker 文件所做的任何更改是唯一为你的用户强制更新应用的方式。 + +## 注册 service worker + +现在我们的 service worker 脚本已经完成了,我们需要注册 service worker。 + +我们先从使用检查全局 [`navigator`](/zh-CN/docs/Web/API/Navigator) 对象上是否存在 [`serviceWorker`](/zh-CN/docs/Web/API/ServiceWorker) 属性的[特性检测](/zh-CN/docs/Learn/Tools_and_testing/Cross_browser_testing/Feature_detection#特性检测的概念)手段来检查浏览器是否支持 [Service Worker API](/zh-CN/docs/Web/API/Service_Worker_API) 开始: + +```html + +``` + +如果这个属性受支持,我们就可以使用 service worker API 的 [`ServiceWorkerContainer`](/zh-CN/docs/Web/API/ServiceWorkerContainer) 接口的 [`register()`](/zh-CN/docs/Web/API/ServiceWorkerContainer/register) 方法。 + +```html + +``` + +虽然上述内容已经满足了经期跟踪器应用的需要,但是 `register()` 方法返回的是一个兑现 {{domxref("ServiceWorkerRegistration")}} 对象的 {{jsxref("Promise")}}。为了使应用更加健壮,最好对注册进行错误检查: + +```js +if ("serviceWorker" in navigator) { + navigator.serviceWorker.register("sw.js").then( + (registration) => { + console.log("Service worker registration successful:", registration); + }, + (error) => { + console.error(`Service worker registration failed: ${error}`); + }, + ); +} else { + console.error("Service workers are not supported."); +} +``` + +### 任务 + +打开 `index.html`,在 `app.js` 脚本之后、被 `` 标签闭合之前添加以下 {{HTMLElement("script")}} 元素。 + +```html + + +``` + +你可以体验功能完整的 [CycleTracker 月经周期跟踪 Web 应用](https://mdn.github.io/pwa-examples/cycletracker/service_workers),并可以在 GitHub 上查看该 [Web 应用的源代码](https://github.com/mdn/pwa-examples/tree/master/cycletracker/service_workers)。是的,它能运行,并且现在正式成为了一个 PWA! + +## 调试 service worker + +出于我们安装 service worker 的方式的因素,一旦其被注册,所有的请求都将会从缓存中拉取,而不是加载新内容。在开发的时候,你会频繁地编辑你的代码,你可能会希望定期甚至是在每一次保存后在浏览器中测试你的编辑。 + +### 通过更新版本号并进行强重置 + +要获得新的缓存,你可以更改[版本号](#版本号)然后进行一次浏览器强刷新。进行强刷新的方式取决于你的浏览器和操作系统: + +- Windows:Ctrl+F5,Shift+F5 或 Ctrl+Shift+R。 +- MacOS:Shift+Command+R。 +- MacOS 上的 Safari:按 Option+Command+E 清空缓存,然后按 Option+Command+R。 +- 移动设备:前往浏览器(Android)或操作系统(Samsung、iOS)设置,在高级设置下找到浏览器(iOS)或站点数据(Android、Samsung)网站设置,然后删除经期跟踪器的数据,再重新加载页面。 + +### 使用开发者工具 + +你可能会不想每次保存都要更新版本号。在你准备好将你的 PWA 的新版本投入生产并为所有人提供你的 PWA 的新版本前,你可以用注销 service worker 的方法来代替在每次保存时更改版本号。 + +你可以通过在[浏览器开发者工具](/zh-CN/docs/Learn/Common_questions/Tools_and_setup/What_are_browser_developer_tools)中点击 `unregister` 按钮来注销一个 service worker。强刷新页面将会重新注册 service worker 并建立新的缓存。 + +![带有停止和注销 service worker 按钮的 Firefox 开发者工具应用程序面板](firefox_sw.jpg) + +在某些开发者工具里,你可以手动注销一个 service worker,或者你可以选择 service worker 的“重新加载时更新”选项来设置当开发者工具打开时,每次重新加载都重置并重新激活 service worker。还有一个选项可以绕过 service worker 从网络加载资源。这个面板包含了本教程中我们未涵盖的特性,但会对你在创建包含[同步](/zh-CN/docs/Web/Progressive_web_apps/Guides/Offline_and_background_operation#周期性后台同步)和[推送消息](/zh-CN/docs/Web/Progressive_web_apps/Guides/Offline_and_background_operation#推送消息)等特性的更高级的 PWA 时有所帮助,这些内容都涵盖在了[离线和后台操作](/zh-CN/docs/Web/Progressive_web_apps/Guides/Offline_and_background_operation)中。 + +![Edge 开发者工具显示针对 service worker 的应用程序面板集](edge_sw.jpg) + +开发者工具的应用程序面板中的 service worker 窗口,提供了访问包含浏览器所有已注册的 service worker 的列表的弹出窗口的链接,不只是在当前标签页中打开的应用的 service worker。列表中的每个 service worker 都有单独的停止、启动或注销按钮。 + +![localhost:8080 存在两个 service worker,它们能在列表中被注销](edge_sw_list.jpg) + +换句话说,当你在处理你的 PWA 时,你不需要更新每个应用视图的版本号。但是,当你做完了所有的改动后,记得在分发你的 PWA 的新版本前更新 VERSION 的值。如果你忘了,那些已经安装了你的应用又或者只是访问了你的线上 PWA 但是没有安装的人,是永远看不到你的改动的! + +## 我们完成了! + +PWA 的核心是一种可以被安装并可以被逐步增强至可以离线运行的 Web 应用。我们创建了一个功能完整的 Web 应用,然后添加了两项特性——一个清单文件和一个 service worker——将其转化为 PWA 所需要的东西。如果你想和其他人分享你的应用,请将其通过安全连接提供。或者,如果你只想自己使用经期跟踪器,[创建一个本地部署环境](/zh-CN/docs/Web/Progressive_web_apps/Tutorials/CycleTracker/Secure_connection),[安装 PWA](/zh-CN/docs/Web/Progressive_web_apps/Guides/Installing),然后尽情享受吧!一经安装,你就不需要再运行 localhost 了。 + +恭喜! + +{{PreviousMenu("Web/Progressive_web_apps/Tutorials/CycleTracker/Manifest_file", "Web/Progressive_web_apps/Tutorials/CycleTracker")}} From 4d329bcb36f86e51b26d3806eb8a002eb2eec19b Mon Sep 17 00:00:00 2001 From: hanyujie2002 <84226578+hanyujie2002@users.noreply.github.com> Date: Wed, 20 Sep 2023 16:48:12 +0800 Subject: [PATCH 035/268] =?UTF-8?q?zh-cn:=20align=20the=20translation=20of?= =?UTF-8?q?=20"identity"=20to=20"=E6=A0=87=E8=AF=86"=20(#15966)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tutorials/cycletracker/manifest_file/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/manifest_file/index.md b/files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/manifest_file/index.md index 31bc88a4411b9f..9f526a40b79774 100644 --- a/files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/manifest_file/index.md +++ b/files/zh-cn/web/progressive_web_apps/tutorials/cycletracker/manifest_file/index.md @@ -27,7 +27,7 @@ PWA 清单文件是一个 JSON 文件,它提供了关于该应用程序的特 } ``` -在保存清单文件并从我们的 HTML 文件中链接到它之前,我们可以开发一个仍然简洁但具有更多信息的 JSON 对象,以定义 PWA 的身份、展示和图标。是的,上面的内容会起作用,但让我们讨论一下这个示例中的成员以及其他一些成员,这些成员使清单文件能够更好地定义我们的经期跟踪器 PWA 的外观。 +在保存清单文件并从我们的 HTML 文件中链接到它之前,我们可以开发一个仍然简洁但具有更多信息的 JSON 对象,以定义 PWA 的标识、展示和图标。是的,上面的内容会起作用,但让我们讨论一下这个示例中的成员以及其他一些成员,这些成员使清单文件能够更好地定义我们的经期跟踪器 PWA 的外观。 ## 应用标识 @@ -244,11 +244,11 @@ PWA 需要从应用的 HTML 文档中链接到清单文件。我们已经有一 ![在开发者工具中,左侧面板包含指向清单的链接。右侧显示应用清单文件,文件名称是一个指向 JSON 文件的链接。](debugger_devtools.jpg) -Manifest 应用面板提供了清单文件名称作为链接,以及身份、外观和图标部分。 +Manifest 应用面板提供了清单文件名称作为链接,以及标识、外观和图标部分。 -![身份和外观清单成员以及存在的任何值。](manifest_identity_and_presentation.jpg) +![标识和外观清单成员以及存在的任何值。](manifest_identity_and_presentation.jpg) -支持的清单成员将显示出来,以及所有包含的值。在此截图中,虽然我们没有包括 `orientation` 或 `id` 成员,但它们都被列出来了。应用面板可以用来查看清单成员,甚至可以了解:在这个例子中,我们了解到要指定与当前身份匹配的应用 Id,需要将 `id` 字段设置为“/”。 +支持的清单成员将显示出来,以及所有包含的值。在此截图中,虽然我们没有包括 `orientation` 或 `id` 成员,但它们都被列出来了。应用面板可以用来查看清单成员,甚至可以了解:在这个例子中,我们了解到要指定与当前标识匹配的应用 Id,需要将 `id` 字段设置为“/”。 ![由于我们没有 service worker,我们的应用不是可安装的 PWA。](manifest_installability.jpg) From 27a568bbdb06f41d85b907fae41d50cc7b169b59 Mon Sep 17 00:00:00 2001 From: HoJeong Im <39ghwjd@naver.com> Date: Wed, 20 Sep 2023 19:03:00 +0900 Subject: [PATCH 036/268] [ko] revise `web/javascript/inheritance_and_the_prototype_chain` (#15090) --- .../index.md | 937 +++++++++++------- 1 file changed, 560 insertions(+), 377 deletions(-) diff --git a/files/ko/web/javascript/inheritance_and_the_prototype_chain/index.md b/files/ko/web/javascript/inheritance_and_the_prototype_chain/index.md index a41fa55270e3a4..31a08d6836c3e9 100644 --- a/files/ko/web/javascript/inheritance_and_the_prototype_chain/index.md +++ b/files/ko/web/javascript/inheritance_and_the_prototype_chain/index.md @@ -1,552 +1,735 @@ --- title: 상속과 프로토타입 slug: Web/JavaScript/Inheritance_and_the_prototype_chain +l10n: + sourceCommit: 7a58753bcf70d274dfe3a0385e4c3861d0df3dd4 --- {{jsSidebar("Advanced")}} -Java 나 C++ 같이 클래스 기반의 언어를 사용하던 프로그래머는 자바스크립트가 동적인 언어라는 점과 클래스가 없다는 것에서 혼란스러워 한다. (ES2015부터 class 키워드를 지원하기 시작했으나, 문법적인 양념일 뿐이며 자바스크립트는 여전히 프로토타입 기반의 언어다.) +JavaScript는 동적 타입이고 정적 타입이 없기 때문에, (Java 또는 C++와 같은) 클래스 기반 언어에 경험이 있는 개발자에게는 약간 혼란스럽습니다. -상속 관점에서 자바스크립트의 유일한 생성자는 객체뿐이다. 각각의 객체는 \[\[Prototype]]이라는 은닉(private) 속성을 가지는데 자신의 **프로토타입**이 되는 다른 객체를 가리킨다. 그 객체의 프로토타입 또한 프로토타입을 가지고 있고 이것이 반복되다, 결국 `null`을 프로토타입으로 가지는 오브젝트에서 끝난다. null은 더 이상의 프로토타입이 없다고 정의되며, **프로토타입 체인**의 종점 역할을 한다. +상속과 관련하여, JavaScript에는 객체라는 하나의 구조만 있습니다. 각 객체에는 **프로토타입**이라는 다른 객체에 대한 링크를 보유하는 비공개 속성이 있습니다. 그 프로토타입 객체도 자신만의 프로토타입을 가지고 있으며, 프로토타입으로 `null`을 가진 객체에 도달할 때까지 이 연결은 계속됩니다. 정의에 따르면 `null`에는 프로토타입이 없으며, 이 **프로토타입 체인**에서 최종 링크 역할을 합니다. 프로토타입 체인의 모든 구성요소들을 변경하거나 런타임 시 프로토타입을 교체할 수도 있으므로 JavaScript에는 [정적 디스패칭(static dispatching)](https://en.wikipedia.org/wiki/Static_dispatch)과 같은 개념이 없습니다. -종종 이러한 점이 자바스크립트의 약점이라고 지적되지만, 프로토타입적 상속 모델은 사실 고전적인 방법보다 좀 더 강력한 방법이다. 그 말은, 예를 들자면, 프로토타입적 모델에서 고전적인 방식을 구현하는 건 꽤나 사소한 일이지만, 그 반대는 훨씬 더 어려운 일이기 때문이다. +이러한 혼란은 종종 JavaSCript의 약점 중 하나로 생각되어지지만, 프로토타입 상속 모델 자체는 사실 고전적인 모델보다 더 강력합니다. 예를 들어, [classes](/ko/docs/Web/JavaScript/Reference/Classes)가 구현되는 방식인 프로토타입 모델 위에 고전적인 모델을 구축하는 것은 매우 간단합니다. + +클래스는 현재 널리 채택되어 JavaScript의 새로운 패러다임이 되었지만, 클래스는 새로운 상속 패턴을 가져오지 않습니다. 클래스는 대부분의 프로토타입 메커니즘을 추상화하지만, 내부에서 프로토타입이 작동하는 방식을 이해하는 것은 여전히 유용합니다. ## 프로토타입 체인을 이용한 상속 ### 속성 상속 -자바스크립트 객체는 속성을 저장하는 동적인 "가방"과 (**자기만의 속성**이라고 부른다) 프로토타입 객체에 대한 링크를 가진다. 객체의 어떤 속성에 접근하려할 때 그 객체 자체 속성 뿐만 아니라 객체의 프로토타입, 그 프로토타입의 프로토타입 등 프로토타입 체인의 종단에 이를 때까지 그 속성을 탐색한다. +자바스크립트 객체는 속성을 저장하는 동적인 "가방"과 (**자기만의 속성**이라고 부릅니다) 프로토타입 객체에 대한 링크를 가집니다. 객체의 어떤 속성에 접근하려할 때, 그 객체 자체 속성 뿐만 아니라 객체의 프로토타입, 그 프로토타입의 프로토타입 등 프로토타입 체인의 종단에 이를 때까지 그 속성을 탐색합니다. + +> **Note:** ECMAScript 표준은 `someObject.[[Prototype]]`을 객체 `someObject`의 프로토타입을 지시하도록 명시하였습니다. `[[Prototype]]` 내부 슬롯은 각각 {{jsxref("Object.getPrototypeOf()")}}과 {{jsxref("Object.setPrototypeOf()")}} 함수로 접근하고 수정할 수 있습니다. 이것은 자바스크립트의 표준은 아니나 많은 브라우저에 구현되어 사실상의 표준이 된 속성 [`__proto__`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/proto)과 동일합니다. 간결함을 유지하고 혼동을 방지하기 위해 표기법에서 `obj.__proto__`를 사용하지 않고, `obj.[[Prototype]]`을 사용합니다. 이것은 `Object.getPrototypeOf(obj)`에 해당합니다. +> +> 생성자로 사용될 때 주어진 함수에 의해 생성된 객체의 모든 `인스턴스`에 `[[Prototype]]`이 할당되도록 지정하는 함수의 `func.prototype` 속성과 혼동해서는 안 됩니다. [나중 섹션](#constructors)에서 생성자 함수의 `prototype` 속성에 대해 논의할 것입니다. -> **Note:** ECMAScript 표준은 `someObject.[[Prototype]]`을 객체 `someObject`의 프로토타입을 지시하도록 명시하였다. ECMAScript 2015부터 `[[Prototype]]`에 조상 {{jsxref("Object.getPrototypeOf()")}}과 {{jsxref("Object.setPrototypeOf()")}}을 이용하여 접근하기 때문이다. 이것은 자바스크립트의 표준은 아니나 많은 브라우저에 구현되어 사실상의 표준이 된 속성 `__proto__`과 동일하다. +객체의 `[[Prototype]]`을 지정하는 방법에는 여러 가지가 있으며, [나중 섹션](#different_ways_of_creating_and_mutating_prototype_chains)에 나열되어 있습니다. 지금은, 설명을 위해 [`__proto__` 문법](/ko/docs/Web/JavaScript/Reference/Operators/Object_initializer#prototype_setter)을 사용합니다. `{ __proto__: ... }` 구문이 표준이며, 더 이상 사용되지 않는 `obj.__proto__` 접근자와 다르다는 점을 참고해주십시오. +`{ a: 1, b: 2, __proto__: c }`와 같은 객체 리터럴에서, 값 `c`(`null` 또는 다른 객체여야 합니다)는 해당 객체의 `[[Prototype]]`이 됩니다. 반면, `a` 및 `b`와 같은 다른 키는 해당 객체의 *자체 속성*이 됩니다. `[[Prototype]]`은 객체의 "내부 속성"일 뿐이므로, 이 구문은 매우 자연스럽게 읽히는 부분입니다. -아래 코드에는 어떤 속성에 접근 하려할 때 일어나는 상황이다. +다음은 속성에 접근하려고 할 때 발생하는 상황입니다. ```js -// o라는 객체가 있고, 속성 'a' 와 'b'를 갖고 있다고 하자. -let f = function () { - this.a = 1; - this.b = 2; +const o = { + a: 1, + b: 2, + // __proto__는 [[Prototype]]을 설정합니다. + // 여기에 다른 객체 리터럴로 지정되어 있습니다. + __proto__: { + b: 3, + c: 4, + }, }; -let o = new f(); // {a: 1, b: 2} - -// f 함수의 prototype 속성 값들을 추가 하자. -f.prototype.b = 3; -f.prototype.c = 4; -// f.prototype = {b: 3, c: 4}; 라고 하지 마라, 해당 코드는 prototype chain 을 망가뜨린다. -// o.[[Prototype]]은 속성 'b'와 'c'를 가지고 있다. -// o.[[Prototype]].[[Prototype]] 은 Object.prototype 이다. -// 마지막으로 o.[[Prototype]].[[Prototype]].[[Prototype]]은 null이다. -// null은 프로토타입의 종단을 말하며 정의에 의해서 추가 [[Prototype]]은 없다. +// o.[[Prototype]]은 속성 'b'와 'c'를 가지고 있습니다. +// o.[[Prototype]].[[Prototype]] 은 Object.prototype 입니다(무엇을 의미하는지 나중에 설명하겠습니다). +// 마지막으로, o.[[Prototype]].[[Prototype]].[[Prototype]]은 null입니다. +// null은 프로토타입의 종단을 말하며 정의에 의해서 추가 [[Prototype]]은 없습니다. +// 그러면 전체 프로토타입 체인은 다음과 같습니다. // {a: 1, b: 2} ---> {b: 3, c: 4} ---> Object.prototype ---> null console.log(o.a); // 1 -// o는 'a'라는 속성을 가지는가? 그렇다. 속성의 값은 1이다. +// o에 'a' 자체 소유 속성이 있습니까? 네, 그 값은 1입니다. console.log(o.b); // 2 -// o는 'b'라는 속성을 가지는가? 그렇다. 속성의 값은 2이다. -// 프로토타입 역시 'b'라는 속성을 가지지만 이 값은 쓰이지 않는다. 이것을 "속성의 가려짐(property shadowing)" 이라고 부른다. +// o에 'b'라는 자체 소유 속성이 있습니까? 네, 그 값은 2입니다. +// 프로토타입 역시 'b'라는 속성을 가지지만 이 값은 쓰이지 않습니다. 이것을 "속성의 가려짐(property shadowing)" 이라고 부릅니다. console.log(o.c); // 4 -// o는 'c'라는 속성을 가지는가? 아니다. 프로토타입을 확인해보자. -// o.[[Prototype]]은 'c'라는 속성을 가지는가? 가지고 값은 4이다. +// o는 'c'라는 속성을 소유하나요? 아니요, 프로토타입을 확인해보자. +// o.[[Prototype]]은 'c'라는 속성을 소유하나요? 네, 값은 4이다. console.log(o.d); // undefined -// o는 'd'라는 속성을 가지는가? 아니다. 프로토타입을 확인해보자. -// o.[[Prototype]]은 'd'라는 속성을 가지는가? 아니다. 다시 프로토타입을 확인해보자. -// o.[[Prototype]].[[Prototype]]은 null이다. 찾는 것을 그만두자. -// 속성이 발견되지 않았기 때문에 undefined를 반환한다. +// o에 'd' 자체 속성이 있습니까? 아니요, 프로토타입을 확인하세요. +// Is there a 'd' own property on o.[[Prototype]]? No, check its prototype. +// o.[[Prototype]]에 'd' 자체 소유 속성이 있습니까? 아니요, 프로토타입을 확인하세요. +// o.[[Prototype]].[[Prototype]]은 Object.prototype이고, +// 기본적으로 'd' 속성이 없습니다. 프로토타입을 확인하세요. +// o.[[Prototype]].[[Prototype]].[[Prototype]]은 null, 검색을 중지합니다, +// 속성을 찾을 수 없어서, undefined를 반환합니다. ``` -객체의 속성에 값을 지정하면 "자기만의 속성"이 생긴다. 단, [getter or a setter](/en/JavaScript/Guide/Obsolete_Pages/Creating_New_Objects/Defining_Getters_and_Setters)가 적용되는 속성이 상속되는 경우 예외적인 규칙이 적용된다. +객체의 속성에 값을 지정하면 "자기만의 속성"이 생성됩니다. 단, [getter or setter](/ko/docs/Web/JavaScript/Guide/Working_with_objects#defining_getters_and_setters)가 적용되는 속성이 상속되는 경우 예외적인 규칙이 적용됩니다. -### 메소드 상속 - -자바스크립트에 "메소드"라는건 없다. 하지만 자바스크립트는 객체의 속성으로 함수를 지정할 수 있고 속성 값을 사용하듯 쓸 수 있다. 속성 값으로 지정한 함수의 상속 역시 위에서 본 속성의 상속과 동일하다. (단 위에서 언급한 "속성의 가려짐" 대신 "_메소드 오버라이딩, method overriding_" 라는 용어를 사용한다) - -상속된 함수가 실행 될 때, [`this`](/en/JavaScript/Reference/Operators/this) 라는 변수는 상속된 오브젝트를 가르킨다. 그 함수가 프로토타입의 속성으로 지정되었다고 해도 말이다. +마찬가지로, 더 긴 프로토타입 체인을 만들 수 있으며, 모든 체인에서 속성을 찾을 수 있습니다. ```js -var o = { - a: 2, - m: function (b) { - return this.a + 1; +const o = { + a: 1, + b: 2, + // __proto__는 [[Prototype]]을 설정합니다. + // 여기에 다른 객체 리터럴로 지정되어 있습니다. + __proto__: { + b: 3, + c: 4, + __proto__: { + d: 5, + }, }, }; -console.log(o.m()); // 3 -// o.m을 호출하면 'this' 는 o를 가리킨다. - -var p = Object.create(o); -// p 는 프로토타입을 o로 가지는 오브젝트이다. +// { a: 1, b: 2 } ---> { b: 3, c: 4 } ---> { d: 5 } ---> Object.prototype ---> null -p.a = 12; // p 에 'a'라는 새로운 속성을 만들었다. -console.log(p.m()); // 13 -// p.m이 호출 될 때 'this' 는 'p'를 가리킨다. -// 따라서 o의 함수 m을 상속 받으며, -// 'this.a'는 p.a를 나타내며 p의 개인 속성 'a'가 된다. +console.log(o.d); // 5 ``` -## Javascript 에서 프로토타입을 사용하는 방법 +### 메서드 상속 -뒤에서 일어나는 일을 좀 더 자세히 파헤쳐보자. +JavaScript에는 클래스 기반 언어에서 정의하는 형식의 "[메서드](/ko/docs/Glossary/Method)"가 없습니다. JavaScript에서는 모든 함수를 속성의 형태로 객체에 추가할 수 있습니다. +상속된 함수는 위에 표시된 "속성의 가려짐"을 포함하여 다른 모든 속성처럼 작동합니다(단, 위에서 언급한 "속성의 가려짐" 대신 "메소드 오버라이딩, method overriding" 라는 용어를 사용한다). -위에서 언급했듯이, 자바스크립트에서 함수는 속성을 가질 수 있다. 모든 함수에는 `prototype`이라는 특수한 속성이 있다. 아래의 예제 코드는 독립적이라는 것에 유의하자. (아래의 코드 이외에는 웹페이지에 다른 자바스크립트가 없다고 가정하는 것이 좋다.) +상속된 함수가 실행 될 때, [`this`](/ko/docs/Web/JavaScript/Reference/Operators/this) 값은 함수가 자체 속성인 프로토타입 객체가 아니라 상속 객체를 가리킵니다. -최적의 실습을 위해서 콘솔을 열고 "Console" 탭으로 이동하여 아래의 JavaScript 코드를 복사하여 붙여넣은 다음 , 엔터키를 눌러 실행할 것을 적극 권한다. (콘솔은 대부분 웹 브라우저의 Developer Tools에 포함되어있다. 자세한 내용은 [Firefox Developer Tools](/ko/docs/Tools), [Chrome DevTools](https://developers.google.com/web/tools/chrome-devtools/), [Edge DevTools](https://docs.microsoft.com/en-us/microsoft-edge/devtools-guide) 에서 확인할 수 있다. ) +```js +const parent = { + value: 2, + method() { + return this.value + 1; + }, +}; -``` - function doSomething(){} - console.log( doSomething.prototype ); - // It does not matter how you declare the function, a - // function in JavaScript will always have a default - // prototype property. - var doSomething = function(){}; - console.log( doSomething.prototype ); +console.log(parent.method()); // 3 +// 이 경우 parent.method를 호출할 때, 'this'는 부모를 가리킵니다. + +// 자식은 부모로부터 상속받는 객체입니다. +const child = { + __proto__: parent, +}; +console.log(child.method()); // 3 +// child.method가 호출되면, 'this'는 자식을 가리킵니다. +// 자식이 부모의 메서드를 상속받을 때, +// 자식에서 'value' 속성을 찾습니다. 그러나 자식은 'value'라는 자체 속성이 없기 때문에, +// 해당 속성은 [[Prototype]]에서 찾을 수 있으며, 이는 parent.value입니다. + +child.value = 4; // 자식의 속성 'value'에 값 4를 할당합니다. +// 이 코드는 부모의 'value' 속성을 숨깁니다. +// 자식 객체는 이제 다음과 같습니다. +// { value: 4, __proto__: { value: 2, method: [Function] } } +console.log(child.method()); // 5 +// Since child now has the 'value' property, 'this.value' means +// 자식은 이제 'value' 속성을 가지므로 'this.value'는 child.value를 의미합니다. ``` -위 내용을 토대로, 콘솔을 보면 `doSomething()` 은 기본 `prototype` 속성을 가진다. 코드를 실행한 뒤에 콘솔에서는 다음과 유사한 형태의 객체가 표시되어야한다. +## 생성자 -``` -{ - constructor: ƒ doSomething(), - __proto__: { - constructor: ƒ Object(), - hasOwnProperty: ƒ hasOwnProperty(), - isPrototypeOf: ƒ isPrototypeOf(), - propertyIsEnumerable: ƒ propertyIsEnumerable(), - toLocaleString: ƒ toLocaleString(), - toString: ƒ toString(), - valueOf: ƒ valueOf() - } -} +모든 인스턴스가 동일한 몇가지 동일한 속성을 공유하는 경우, 프로토타입의 강점이 드러납니다. 이는 특히 메서드를 공유할 경우 더욱 두드러집니다. 예로, `getValue` 함수를 통해 접근할 수 있는 값을 포함하는 '상자' 객체를 여럿 만드는 경우를 생각해봅시다. 단순한 구현은 다음과 같습니다. + +```js-nolint +const boxes = [ + { value: 1, getValue() { return this.value; } }, + { value: 2, getValue() { return this.value; } }, + { value: 3, getValue() { return this.value; } }, +]; ``` -우리는 아래에 보이는 것과 같이 `doSomething()` 프로토타입에 속성을 추가할 수 있다. +각 인스턴스에는 중복되고 불필요한 작업을 수행하는 고유한 함수 속성이 있기 때문에, 기대에 미치지 못하는 코드가 됩니다. 대신에, `getValue`를 모든 상자의 `[[Prototype]]`으로 이동할 수 있습니다. ```js -function doSomething() {} -doSomething.prototype.foo = "bar"; -console.log(doSomething.prototype); +const boxPrototype = { + getValue() { + return this.value; + }, +}; + +const boxes = [ + { value: 1, __proto__: boxPrototype }, + { value: 2, __proto__: boxPrototype }, + { value: 3, __proto__: boxPrototype }, +]; ``` -결과: +이렇게 하면, 모든 상자의 `getValue` 메서드가 동일한 함수를 참조하므로, 메모리의 사용량이 줄어듭니다. 그러나 모든 객체 생성에 대해 `__proto__`를 수동으로 바인딩하는 것은 여전히 매우 불편합니다. 이것은 생성된 모든 객체에 대해 `[[Prototype]]`을 자동으로 설정하는 constructor 함수를 사용하는 경우입니다. 생성자는 [`new`](/ko/docs/Web/JavaScript/Reference/Operators/new)로 호출되는 함수입니다. -``` -{ - foo: "bar", - constructor: ƒ doSomething(), - __proto__: { - constructor: ƒ Object(), - hasOwnProperty: ƒ hasOwnProperty(), - isPrototypeOf: ƒ isPrototypeOf(), - propertyIsEnumerable: ƒ propertyIsEnumerable(), - toLocaleString: ƒ toLocaleString(), - toString: ƒ toString(), - valueOf: ƒ valueOf() - } +```js +// 생성자 함수 +function Box(value) { + this.value = value; } + +// Box() 생성자에서 생성된 모든 속성 +Box.prototype.getValue = function () { + return this.value; +}; + +const boxes = [new Box(1), new Box(2), new Box(3)]; ``` -이제 `new` 연산자를 사용해서 프로토타입 기반의 `doSomething()` 인스턴스를 생성할 수 있다. new 연산자를 사용하려면 함수 호출 형식에 `new` 접두사를 붙이기만하면 된다. `new` 연산자로 함수를 호출하면 해당 함수의 인스턴스 객체를 반환받는다. 그러면 속성들을 이 객체에 추가할 수 있다. +`new Box(1)`이 `Box` 생성자 함수에서 생성된 "인스턴스"라고 말할 수 있는데, `Box.prototype`은 이전에 생성한 `boxPrototype` 객체와 크게 다르지 않습니다. `Box.prototype`은 그냥 일반 객체입니다. 생성자 함수에서 생성된 모든 인스턴스는 자동으로 생성자의 [`prototype`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype) 속성을 `[[Prototype]]`으로 갖게 됩니다. 즉, `Object.getPrototypeOf(new Box()) === Box.prototype`입니다. 기본적으로 `Constructor.prototype`에는 생성자 함수 자체를 참조하는 [`constructor`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor) 속성이 하나 있습니다. 즉, `Box.prototype.constructor === Box`이기 때문에, 모든 인스턴스에서 원래 생성자에 접근할 수 있게 됩니다. -다음의 코드를 실행해보자. +> **참고:** 생성자 함수에서 반환된 값이 원시 값이 아니라면, 해당 값은 `new` 표현식의 결과가 됩니다. 이 경우, `[[Prototype]]`이 올바르게 바인딩되지 않을 수 있지만, 실제로는 많이 발생하지 않습니다. + +위 생성자 함수는 [classes](/ko/docs/Web/JavaScript/Reference/Classes)에서 다음과 같이 다시 작성할 수 있습니다. ```js -function doSomething() {} -doSomething.prototype.foo = "bar"; // add a property onto the prototype -var doSomeInstancing = new doSomething(); -doSomeInstancing.prop = "some value"; // add a property onto the object -console.log(doSomeInstancing); +class Box { + constructor(value) { + this.value = value; + } + + // 메서드는 Box.prototype에 생성됩니다. + getValue() { + return this.value; + } +} ``` -실행하고나면 결과는 다음과 비슷할 것이다. +클래스는 생성자 함수보다 문법적인 설탕입니다. 즉, 여전히 `Box.prototype`을 조작하여 모든 인스턴스의 동작을 변경할 수 있습니다. 그러나 클래스는 기본 프로토타입 메커니즘에 대한 추상화로 설계되었기 때문에, 이 자습서에서는 더 가벼운 생성자 함수 구문을 사용하여 프로토타입이 작동하는 방식을 보겠습니다. -``` -{ - prop: "some value", - __proto__: { - foo: "bar", - constructor: ƒ doSomething(), - __proto__: { - constructor: ƒ Object(), - hasOwnProperty: ƒ hasOwnProperty(), - isPrototypeOf: ƒ isPrototypeOf(), - propertyIsEnumerable: ƒ propertyIsEnumerable(), - toLocaleString: ƒ toLocaleString(), - toString: ƒ toString(), - valueOf: ƒ valueOf() - } - } +`Box.prototype`은 모든 인스턴스의 `[[Prototype]]`과 동일한 객체를 참조하기 때문에, `Box.prototype`을 변경하여 모든 인스턴스의 동작을 변경할 수 있습니다. + +```js +function Box(value) { + this.value = value; } +Box.prototype.getValue = function () { + return this.value; +}; +const box = new Box(1); + +// 인스턴스가 이미 생성된 후, `Box.prototype`을 변경합니다. +Box.prototype.getValue = function () { + return this.value + 1; +}; +box.getValue(); // 2 ``` -위에서 본 것과 같이, doSomeInstancing 객체의 `__proto__` 는 doSomething.prototype 이다. -그래서 도대체 `__proto__`는 무엇을 하는것인지 알아보자. -우리가 doSomeInstancing의 속성에 접근할때 브라우저는 우선 doSomeInstancing이 그 속성을 갖고있는지 확인한다. -만약 doSomeInstancing이 속성을 갖고있지 않다면, 브라우저는 doSomeInstancing의 `__proto__`(doSomething.prototype)가 그 속성을 갖고있는지 확인한다. -만약 doSomeInstancing의 `__proto__`가 브라우저가 찾던 속성을 갖고 있다면, doSomething의 `__proto__`가 갖고있는 그 속성을 사용한다. +결과적으로, 재할당 (`Constructor.prototype` (`Constructor.prototype = ...`))은 두 가지 이유로 나쁜 생각입니다. -그렇지 않고, doSomeInstancing의 `__proto__`가 그 속성을 갖고있지 않을때에는 -doSomeInstancing의 `__proto__`의 `__proto__`가 그 속성을 갖는지 확인한다. -기본적으로, 어떠한 함수던지 그 함수의 prototype 속성의 `__proto__`는 window\.Object.prototype이다. -그러므로 브라우저는 doSomeInstancing의 `__proto__`의 `__proto__`(doSomething.prototype의 `__proto__`(다시말해, Object.prototype)) 에서 그 속성을 찾아본다. -만약 그 속성을 doSomeInstancing의 `__proto__`의 `__proto__`에서 찾을 수 없다면 그다음엔 doSomeInstancing의 `__proto__`의 `__proto__`의 `__proto__`에서 찾을것이다. -하지만 여기서 문제가 발생한다. -doSomeInstancing의 `__proto__`의 `__proto__`의 `__proto__`는 존재할 수 없다(window\.Object.prototype의 `__proto__`는 null이기 때문). -그제서야, 오직 모든 프로토타입 체인이 검사 되고 브라우저가 더이상 검사할 `__proto__`가 없을때에서야 브라우저는 우리가 찾던 값이 undefined라고 결론짓는다. +- 재할당 전에 생성된 인스턴스의 `[[Prototype]]`은 이제 재할당 후 생성된 인스턴스의 `[[Prototype]]`과 다른 객체를 참조합니다. 하나의 `[[Prototype]]`을 변경해도 더 이상 다른 객체가 변경되지 않습니다. +- `constructor` 속성을 수동으로 재설정하지 않는 한, `instance.contructor`에서 더 이상 생성자 함수를 추적할 수 없어 동작 방식을 예상하기 어려워집니다. 일부 기본 제공 연산은 `constructor` 속성도 읽으며 설정되지 않은 경우, 예상대로 작동하지 않을 수 있습니다. -콘솔에 코드를 조금 더 추가해보자. +`Constructor.prototype`은 인스턴스를 구성할 때만 유용합니다. 이는 `Function.prototype` 생성자 함수의 자체 소유의 프로토타입인 `Constructor.[[Prototype]]`과 아무 관련이 없습니다. 즉, `Object.getPrototypeOf(Constructor) === Function.prototype`입니다. + +### 리터럴의 암시적 생성자 + +JavaScript의 일부 리터럴 구문은 암시적으로 `[[Prototype]]`을 설정하는 인스턴스를 생성합니다. 예를 들어, ```js -function doSomething() {} -doSomething.prototype.foo = "bar"; -var doSomeInstancing = new doSomething(); -doSomeInstancing.prop = "some value"; -console.log("doSomeInstancing.prop: " + doSomeInstancing.prop); -console.log("doSomeInstancing.foo: " + doSomeInstancing.foo); -console.log("doSomething.prop: " + doSomething.prop); -console.log("doSomething.foo: " + doSomething.foo); -console.log("doSomething.prototype.prop: " + doSomething.prototype.prop); -console.log("doSomething.prototype.foo: " + doSomething.prototype.foo); -``` +// 객체 리터럴 (`__proto__` 키 없음)은 자동으로 `[[Prototype]]`으로 `Object.prototype`을 갖습니다. +const object = { a: 1 }; +Object.getPrototypeOf(object) === Object.prototype; // true -이 코드의 결과는 아래와 같다. +// 배열 리터럴은 자동으로 `Array.prototype`을 `[[Prototype]]`으로 갖습니다. +const array = [1, 2, 3]; +Object.getPrototypeOf(array) === Array.prototype; // true +// RegExp 리터럴은 자동으로 `RegExp.prototype`을 `[[Prototype]]`으로 갖습니다. +const regexp = /abc/; +Object.getPrototypeOf(regexp) === RegExp.prototype; // true ``` -doSomeInstancing.prop: some value -doSomeInstancing.foo: bar -doSomething.prop: undefined -doSomething.foo: undefined -doSomething.prototype.prop: undefined -doSomething.prototype.foo: bar -``` - -## 객체를 생성하는 여러 방법과 프로토타입 체인 결과 -### 문법 생성자로 객체 생성 +생성자 형태를 통해, "문법 설탕을 제거"할 수 있습니다. ```js -var o = { a: 1 }; +const array = new Array(1, 2, 3); +const regexp = new RegExp("abc"); +``` -// o 객체는 프로토타입으로 Object.prototype 을 가진다. -// 이로 인해 o.hasOwnProperty('a') 같은 코드를 사용할 수 있다. -// hasOwnProperty 라는 속성은 Object.prototype 의 속성이다. -// Object.prototype 의 프로토타입은 null 이다. -// o ---> Object.prototype ---> null +예를 들어, [`map()`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map)과 같은 "배열 메서드"는 단순히 `Array.prototype`에 정의된 메서드입니다. 모든 배열 인스턴스에서 자동으로 사용할 수 있습니다. -var a = ["yo", "whadup", "?"]; +> **경고:** 널리 알려진 한 가지 잘못된 기능이 있습니다. 바로 `Object.prototype` 또는 다른 내장 프로토타입 중 하나를 확장하는 것입니다. 이 잘못된 기능의 예는 `Array.prototype.myMethod = function () {...}`를 정의한 다음 모든 배열 인스턴스에서 `myMethod`를 사용하는 것입니다. +> +> 이러한 잘못된 기능을 원숭이 패칭(monkey patching)이라고 합니다. 원숭이 패칭을 하게 되면, 상위 호환성에 문제가 발생합니다. 언어가 나중에 이 메서드를 추가하지만 다른 서명을 사용하면, 코드가 깨질 수 있기 대문입니다. 이로 인해, [SmooshGate](https://developer.chrome.com/blog/smooshgate/)와 같은 사고가 발생했으며, JavaScript는 "웹을 중단하지 않으려" 시도하므로 언어가 발전하는 데 있어 큰 장애물이 될 수 있습니다. +> +> 내장 제공 프로토타입을 확장해도 좋은 `유일한` 경우는 최신 JavaScript 엔진의 기능을 이전 버전에서도 사용할 수 있게 해줄 때입니다(backport). 예로,`Array.prototype.forEach`가 있습니다. -// Array.prototype을 상속받은 배열도 마찬가지다. -// (이번에는 indexOf, forEach 등의 메소드를 가진다) -// 프로토타입 체인은 다음과 같다. -// a ---> Array.prototype ---> Object.prototype ---> null +흥미롭게도, 일부 내장 생성자의 `prototype` 속성은 역사적인 이유로 해당 인스턴스 자체입니다. 예를 들어, `Number.prototype`은 숫자 0이고, `Array.prototype`은 빈 배열이고, `RegExp.prototype`은 `/(?:)/`입니다. -function f() { - return 2; -} +```js +Number.prototype + 1; // 1 +Array.prototype.map((x) => x + 1); // [] +String.prototype + "a"; // "a" +RegExp.prototype.source; // "(?:)" +Function.prototype(); // Function.prototype은 자체로 프로그램에 아무 작업도 수행하지 말라고 지시하는 (no-operation, no-op) 함수입니다. +``` -// 함수는 Function.prototype 을 상속받는다. -// (이 프로토타입은 call, bind 같은 메소드를 가진다) -// f ---> Function.prototype ---> Object.prototype ---> null +그러나, 이것은 사용자 정의 생성자나 `Map`과 같은 최신 생성자의 경우에는 해당되지 않습니다. + +```js +Map.prototype.get(1); +// Uncaught TypeError: 호환되지 않는 Map.prototype에서 호출된 get 메서드 ``` -### 생성자를 이용 +### 더 긴 상속 체인 구축 -자바스크립트에서 생성자는 단지 [new 연산자](/en/JavaScript/Reference/Operators/new)를 사용해 함수를 호출하면 된다. +`Constructor.prototype` 속성은 `Constructor.prototype`의 자체 `[[Prototype]]`을 포함하여, 생성자 인스턴스의 `[[Prototype]]`이 됩니다. 기본적으로 `Constructor.prototype`은 일반 객체입니다. 즉, `Object.getPrototypeOf(Constructor.prototype) === Object.prototype` 입니다. 유일한 예외는 `Object.prototype` 자체이며, `[[Prototype]]`은 `null`입니다. 즉, `Object.getPrototypeOf(Object.prototype) === null`입니다. 따라서, 일반적인 생성자는 다음 프로토타입 체인을 빌드합니다. ```js -function Graph() { - this.vertexes = []; - this.edges = []; -} - -Graph.prototype = { - addVertex: function (v) { - this.vertexes.push(v); - }, -}; +function Constructor() {} -var g = new Graph(); -// g 'vertexes' 와 'edges'를 속성으로 가지는 객체이다. -// 생성시 g.[[Prototype]]은 Graph.prototype의 값과 같은 값을 가진다. +const obj = new Constructor(); +// obj ---> Constructor.prototype ---> Object.prototype ---> null ``` -### Object.create 이용 +더 긴 프로토타입 체인을 구축하려면, [`Object.setPrototypeOf()`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf) 함수를 통해 `Constructor.prototype`의 `[[Prototype]]`을 설정할 수 있습니다. -ECMAScript 5는 새로운 방법을 도입했다. [Object.create](/en/JavaScript/Reference/Global_Objects/Object/create)라는 메소드를 호출하여 새로운 객체를 만들 수 있다. 생성된 객체의 프로토타입은 이 메소드의 첫 번째 인수로 지정된다. +```js +function Base() {} +function Derived() {} +// `Derived.prototype`의 `[[Prototype]]`을 `Base.prototype`으로 설정합니다. +Object.setPrototypeOf(Derived.prototype, Base.prototype); + +const obj = new Derived(); +// obj ---> Derived.prototype ---> Base.prototype ---> Object.prototype ---> null +``` + +클래스 문법 용어로, 이는 [`extends`](/ko/docs/Web/JavaScript/Reference/Classes/extends) 구문을 사용하는 것과 동일합니다. ```js -var a = { a: 1 }; -// a ---> Object.prototype ---> null +class Base {} +class Derived extends Base {} -var b = Object.create(a); -// b ---> a ---> Object.prototype ---> null -console.log(b.a); // 1 (상속됨) +const obj = new Derived(); +// obj ---> Derived.prototype ---> Base.prototype ---> Object.prototype ---> null +``` -var c = Object.create(b); -// c ---> b ---> a ---> Object.prototype ---> null +상속 체인을 구축하기 위해, {{jsxref("Object.create()")}}를 사용하는 일부 레거시 코드를 볼 수도 있습니다. 그러나 이것은 `prototype` 속성을 재할당하고 [`constructor`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor) 속성을 제거하기 때문에, 오류가 더 많이 발생할 수 있습니다. 생성자가 아직 인스턴스를 생성하지 않은 경우에는 성능에서 얻는 이점 또한 체감하기 어렵습니다. + +```js example-bad +function Base() {} +function Derived() {} +// `[[Prototype]]`으로 `Base.prototype`을 사용하여 `Derived.prototype을 새로운 객체에 다시 할당합니다. +// 이렇게 하지 마세요, 대신 `Object.setPrototypeOf`를 사용하여 변경하세요. -var d = Object.create(null); -// d ---> null -console.log(d.hasOwnProperty); // undefined이다. 왜냐하면 d는 Object.prototype을 상속받지 않기 때문이다. +Derived.prototype = Object.create(Base.prototype); ``` -### `class` 키워드 이용 +### 프로토타입 심층 분석 + +뒤에서 어떠한 일이 일어나는지 좀 더 자세히 살펴보겠습니다. -ECMAScript2015에는 몇 가지 키워드가 도입되어 [class](/ko/docs/Web/JavaScript/Reference/Classes)를 구현하였다. 이런 생성 방식은 클래서 기반 언어의 개발자들에게 친숙하게 다가오나 동작 방식이 같지는 않다. 자바스크립트는 여전히 프로토타입 기반으로 남아있다. 새로 도입된 키워드는 {{jsxref("Statements/class", "class")}}, {{jsxref("Classes/constructor", "constructor")}}, {{jsxref("Classes/static", "static")}}, {{jsxref("Classes/extends", "extends")}}, 그리고 {{jsxref("Operators/super", "super")}}가 있다. +위에서 언급한 것처럼, JavaScript에서 함수는 속성을 가질 수 있습니다. 모든 함수에는 `prototype`이라는 특수한 속성이 있습니다. 아래의 예제 코드는 독립적이라는 것에 유의하세요(아래의 코드 이외에는 웹페이지에 다른 자바스크립트가 없다고 가정해도 문제 없습니다). + +최적의 실습을 위해, 콘솔을 열고 "console" 탭으로 이동하여 아래의 JavaScript 코드를 복사하여 붙여넣고, 엔터/Return 키를 눌러서 실행하는 것이 좋습니다(콘솔은 대부분 웹 브라우저의 개발자 도구에 포함되어 있습니다. 자세한 내용은 [Firefox Developer Tools](https://firefox-source-docs.mozilla.org/devtools-user/index.html), [Chrome DevTools](https://developer.chrome.com/docs/devtools/) 및 [Edge DevTools](https://docs.microsoft.com/archive/microsoft-edge/legacy/developer/)을 참고하세요). ```js -"use strict"; +function doSomething() {} +console.log(doSomething.prototype); +// 함수 선언 방법은 중요하지 않습니다. JavaScript의 함수는 항상 기본 프로토타입 속성을 갖습니다. +// 한 가지 예외가 있습니다. 화살표 함수에는 기본 프로토타입 속성이 없습니다. +const doSomethingFromArrowFunction = () => {}; +console.log(doSomethingFromArrowFunction.prototype); +``` -class Polygon { - constructor(height, width) { - this.height = height; - this.width = width; - } -} +위 내용을 토대로, 콘솔을 보면 `doSomething()` 은 기본 `prototype` 속성을 가지고 있습니다. 코드를 실행한 뒤에 콘솔에서는 다음과 유사한 형태의 객체가 표시되어야 합니다. -class Square extends Polygon { - constructor(sideLength) { - super(sideLength, sideLength); - } - get area() { - return this.height * this.width; - } - set sideLength(newLength) { - this.height = newLength; - this.width = newLength; +```plain +{ + constructor: ƒ doSomething(), + [[Prototype]]: { + constructor: ƒ Object(), + hasOwnProperty: ƒ hasOwnProperty(), + isPrototypeOf: ƒ isPrototypeOf(), + propertyIsEnumerable: ƒ propertyIsEnumerable(), + toLocaleString: ƒ toLocaleString(), + toString: ƒ toString(), + valueOf: ƒ valueOf() } } - -var square = new Square(2); ``` -### 성능 +> **참고:** Chrome 콘솔은 `[[Prototype]]`을 사용하여, 명세의 용어에 따라 객체의 프로토타입을 나타냅니다. Firefox는 ``을 사용하는데, 일관성을 위해 `[[Prototype]]`을 사용합니다. -프로토타입 체인에 걸친 속성 검색으로 성능에 나쁜 영향을 줄 수 있으며, 때때로 치명적일 수 있다. 또한 존재하지도 않는 속성에 접근하려는 시도는 항상 모든 프로토타입 체인인 전체를 탐색해서 확인하게 만든다. - -객체의 속성에 걸쳐 루프를 수행 하는 경우 프로토타입 체인 전체의 **모든** 열거자 속성에 대하여 적용된다. 객체 개인 속성인지 프로토타입 체인상 어딘가에 있는지 확인하기 위해서는 Object.prototype에서 모든 오브젝트로 상속된 [`hasOwnProperty`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) 메소드를 이용할 필요가 있다. 다음 코드를 통하여 구체적인 예를 확인하여 보자. +아래와 같이, `doSomething()`의 프로토타입에 속성을 추가할 수 있습니다. ```js -console.log(g.hasOwnProperty("vertices")); -// true - -console.log(g.hasOwnProperty("nope")); -// false +function doSomething() {} +doSomething.prototype.foo = "bar"; +console.log(doSomething.prototype); +``` -console.log(g.hasOwnProperty("addVertex")); -// false +결과: -console.log(g.__proto__.hasOwnProperty("addVertex")); -// true +```plain +{ + foo: "bar", + constructor: ƒ doSomething(), + [[Prototype]]: { + constructor: ƒ Object(), + hasOwnProperty: ƒ hasOwnProperty(), + isPrototypeOf: ƒ isPrototypeOf(), + propertyIsEnumerable: ƒ propertyIsEnumerable(), + toLocaleString: ƒ toLocaleString(), + toString: ƒ toString(), + valueOf: ƒ valueOf() + } +} ``` -[`hasOwnProperty`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) 메소드만이 속성을 확인하고 프로토타입 체인 전체를 훑지 않게 할 수 있다. - -참고: [`undefined`](/ko/docs/Web/JavaScript/Reference/Global_Objects/undefined)인지 여부만 확인하는 것으로는 충분하지 않다. 여전히 속성이 존재할 수도 있는데 단지 그 값에 `undefined`가 할당되어 있을 수도 있기 때문이다. +이제 `new` 연산자를 사용해서 프로토타입 기반의 `doSomething()` 인스턴스를 생성할 수 있습니다. new 연산자를 사용하려면 `new` 접두어를 제외하고 일반적으로 함수를 호출하세요. `new` 연산자로 함수를 호출하면 해당 함수의 인스턴스 객체를 반환받습니다. 그러면 속성들을 이 객체에 추가할 수 있습니다. -### 좋지 않은 사례: 기본 프로타입의 확장 변형 +다음의 코드를 실행해봅시다. -Object.prototype 혹은 빌트인 프로토타입의 확장은 종종 이용되지만 오용이다. +```js +function doSomething() {} +doSomething.prototype.foo = "bar"; // 프로토타입에 속성 추가 +const doSomeInstancing = new doSomething(); +doSomeInstancing.prop = "some value"; // 객체에 속성 추가 +console.log(doSomeInstancing); +``` -이 기법은 Monkey patching으로 불리며 캡슐화를 망가뜨린다. Prototype.js와 같은 유명한 프레임워크에서도 사용되지만, 빌트인 타입에 비표준 기능을 추가하는 것은 좋은 생각이 아니다. +실행한 후에는 결과는 아래와 비슷할 겁니다. -유일하게 좋은 사용 예라면, 새로운 자바스크립트 엔진에 Array.forEach등의 새로운 기능을 추가하면서 빌트인 프로토타입을 확장하는 것 정도다. +```plain +{ + prop: "some value", + [[Prototype]]: { + foo: "bar", + constructor: ƒ doSomething(), + [[Prototype]]: { + constructor: ƒ Object(), + hasOwnProperty: ƒ hasOwnProperty(), + isPrototypeOf: ƒ isPrototypeOf(), + propertyIsEnumerable: ƒ propertyIsEnumerable(), + toLocaleString: ƒ toLocaleString(), + toString: ƒ toString(), + valueOf: ƒ valueOf() + } + } +} +``` -## 예 +위에서 볼 수 있듯이, `doSomeInstancing`의 `[[Prototype]]`은 `doSomething.prototype`입니다. 그러나 이것은 어떤 역할을 하나요? `doSomeInstancing`의 속성에 접근하면 런타임은 먼저 `doSomeInstancing`에 해당 속성이 있는지 확인합니다. -`B는 A를 상속한다`: +`doSomeInstancing`에 속성이 없으면, 런타임은 `doSomeInstancing.[[Prototype]]` (`doSomething.prototype`)에서 속성을 찾습니다. `doSomeInstancing.[[Prototype]]`에 찾고 있는 속성이 있으면 `doSomeInstancing.[[Prototype]]`의 해당 속성이 사용됩니다. -```js -function A(a) { - this.varA = a; -} +그렇지 않고, `doSomeInstancing.[[Prototype]]`에 속성이 없으면, `doSomeInstancing.[[Prototype]].[[Prototype]]`에서 속성을 확인합니다. 기본적으로, 함수의 `prototype` 속성 중 `[[Prototype]]`은 `Object.prototype`입니다. 따라서, `doSomeInstancing.[[Prototype]].[[Prototype]]` (`doSomething.prototype.[[Prototype]]`(`Object.prototype`)) 은 검색 중인 속성을 찾습니다. -// A의 정의에서 this.varA는 항상 A.prototype.varA가 가려버리는데 -// prototype에 varA를 다시 넣는 이유는 무엇인가? -A.prototype = { - varA: null, // 아무것도 안하면서 varA를 쓰는 이유가 있을까? - // 아마도 숨겨진 클래스의 할당 구조를 최적화 하려는 것인가? - // https://developers.google.com/speed/articles/optimizing-javascript#Initializing-instance-variables - // 모든 객체의 varA가 동일하게 초기화 되어야 상기 링크 내용이 유효할 수 있다. - doSomething: function () { - // ... - }, -}; +속성이 `doSomeInstancing.[[Prototype]].[[Prototype]]`에 없으면, `doSomeInstancing.[[Prototype]].[[Prototype]].[[Prototype]]`을 통해 찾습니다. 그러나, `doSomeInstancing.[[Prototype]].[[Prototype]].[[Prototype]]`이 존재하지 않는 문제가 있는데, 그 이유는 `Object.prototype.[[Prototype]]`이 `null`이기 때문입니다. 그런 다음, `[[Prototype]]`의 전체 프로토타입 체인을 살펴본 후, 런타임은 속성이 존재하지 않는다고 주장하고 속성의 값이 `undefined`이라고 결정합니다. -function B(a, b) { - A.call(this, a); - this.varB = b; -} -B.prototype = Object.create(A.prototype, { - varB: { - value: null, - enumerable: true, - configurable: true, - writable: true, - }, - doSomething: { - value: function () { - // override - A.prototype.doSomething.apply(this, arguments); // call super - // ... - }, - enumerable: true, - configurable: true, - writable: true, - }, -}); -B.prototype.constructor = B; +콘솔에 코드를 추가로 입력해 봅시다. -var b = new B(); -b.doSomething(); +```js +function doSomething() {} +doSomething.prototype.foo = "bar"; +const doSomeInstancing = new doSomething(); +doSomeInstancing.prop = "some value"; +console.log("doSomeInstancing.prop: ", doSomeInstancing.prop); +console.log("doSomeInstancing.foo: ", doSomeInstancing.foo); +console.log("doSomething.prop: ", doSomething.prop); +console.log("doSomething.foo: ", doSomething.foo); +console.log("doSomething.prototype.prop:", doSomething.prototype.prop); +console.log("doSomething.prototype.foo: ", doSomething.prototype.foo); ``` -중요한 점은: +코드의 결과는 아래와 같습니다. -- `.prototype`에 타입이 정의되어 있다. -- `Object.create()`을 이용하여 상속한다. +```plain +doSomeInstancing.prop: some value +doSomeInstancing.foo: bar +doSomething.prop: undefined +doSomething.foo: undefined +doSomething.prototype.prop: undefined +doSomething.prototype.foo: bar +``` -## `prototype` `그리고 Object.getPrototypeOf` +## 프로토타입 체인을 만들고 변경하는 다양한 방법 -Java나 C++에 익숙한 개발자는 클래스라는 것도 없고, 모든 것이 동적이고 실행 시 결정되는 자바스크립트의 특징 때문에 어려움을 겪을 수도 있다. 모든 것은 객체이고, 심지의 "class"를 흉내내는 방식도 단지 함수 오브젝트를 이용하는 것 뿐이다. +객체를 생성하고 프로토타입 체인을 변경하는 다양한 방법을 만나보았습니다. 각 접근 방식의 장단점을 비교하여, 다양한 방식을 체계적으로 요약합니다. -이미 알아챘겠지만 우리의 함수 A도 특별한 속성 prototype를 가지고 있다. 이 특별한 속성은 자바스크립트의 new 연산자와 함께 쓰인다. 프로토타입 객체는 새로 만들어진 인스턴스의 내부 `[[Prototype]]` 속성에 복사되어 참조된다. 가령, `var a1 = new A()`를 수행할 때, this를 포함하고 있는 함수을 수행하기 전, 메모리에 새로 생성된 객체를 생성한 직후 자바스크립트는 a1.`[[Prototype]] = A.prototype`를 수행한다. 그 인스턴스의 속성에 접근하려 할 때 자바스크립트는 그 객체의 개인 속성인지 우선 확인하고 그렇지 않은 경우에 `[[Prototype]]`에서 찾는다. 이것은 prototype에 정의한 모든 것은 모든 인스턴스가 효과적으로 공유한다는 뜻이며, 심지어 프로토타입의 일부를 나중에 변경하다고 해도 이미 생성되어 있는 인스턴스는 필요한 경우 그 변경 사항에 접근할 수 있다. +### 문법 생성자로 객체 생성 -위의 예에서, 만일 `var a1 = new A(); var a2 = new A();` 그 후 `a1.doSomething`이 `Object.getPrototypeOf(a1).doSomething`를 가리키게 되는 것은`A.prototype.doSomething`으로 정의한 것과 같게 된다. 즉, `Object.getPrototypeOf(a1).doSomething == Object.getPrototypeOf(a2).doSomething == A.prototype.doSomething`. +```js +const o = { a: 1 }; +// 새롭게 만들어진 각체 o는 Object.prototype을 [[Prototype]]으로 가지고 있습니다. +// Object.prototype의 프로토타입은 null 입니다. +// o ---> Object.prototype ---> null -요약 하자면, prototype은 타입 정의를 위한 것이고, `Object.getPrototypeOf()`는 모든 인스턴스가 공유한다. +const b = ["yo", "whadup", "?"]; +// Array.prototype을 상속받은 배열도 마찬가지 입니다. +// (이번에는 indexOf, forEach 등의 메소드를 가집니다) +// 프로토타입 체인은 다음과 같습니다. +// b ---> Array.prototype ---> Object.prototype ---> null -`[[Prototype]]`은 재귀적으로 탐색된다. 즉, `a1.doSomething`, `Object.getPrototypeOf(a1).doSomething`,`Object.getPrototypeOf(Object.getPrototypeOf(a1)).doSomething` 등등, 이미 발견했거나 `Object.getPrototypeOf`가 `null`을 반환할 때까지 반복된다. +function f() { + return 2; +} +// 함수는 Function.prototype 을 상속받습니다. +// (이 프로토타입은 call, bind 같은 메소드를 가집니다). +// f ---> Function.prototype ---> Object.prototype ---> null -따라서 다음 호출에 대하여 +const p = { b: 2, __proto__: o }; -```js -var o = new Foo(); +// 새로 생성된 객체의 [[Prototype]]이 __proto__ 리터럴 속성을 통해 다른 객체를 가리키도록 할 수 있습니다. +// (Object.prototype.__proto__ 접근자와 혼동하지 마세요). +// p ---> o ---> Object.prototype ---> null ``` -자바스크립트는 실제로 다음 작업을 수행한다. + + + + + + + + + + + + +
+ 객체 초기자에서 __proto__ 키 사용의 장점과 단점 +
장점 + 모든 최신 엔진에서 지원됩니다. 객체가 아닌 것을 __proto__키로 지정하면 예외를 발생시키지 않고 조용히 실패합니다. {{jsxref("Object/proto", "Object.prototype.__proto__")}} 설정자와 반대로, 객체 리터럴 초기자의 __proto__가 표준화되고 최적화되었으며 {{jsxref("Object.create")}}보다 성능이 더 뛰어날 수 있습니다. 객체 생성 시 추가 자체 속성을 선언하는 것이 {{jsxref("Object.create")}}보다 편리합니다. +
단점 + IE10 이하에서는 지원하지 않습니다. 차이점을 모르는 사람들이 {{jsxref("Object/proto", "Object.prototype.__proto__")}}와 혼동하기 쉽습니다. +
+ +### 생성자 함수를 이용 + +자바스크립트에서 생성자는 단지 [new 연산자](/en/JavaScript/Reference/Operators/new)를 사용해 함수를 호출하면 된다. ```js -var o = new Object(); -o.[[Prototype]] = Foo.prototype; -Foo.call(o); -``` +function Graph() { + this.vertices = []; + this.edges = []; +} -(혹은 그런 비슷한 작업, 내부 구현은 다를 수 있다) 그리고 나중에 다음을 수행하면 +Graph.prototype.addVertex = function (v) { + this.vertices.push(v); +}; -```js -o.someProp; +const g = new Graph(); +// g는 자체 속성으로 'vertices' 와 'edges'를 가지는 객체이다. +// g.[[Prototype]]은 new Graph()가 실행될 때 Graph.prototype의 값이 됩니다. ``` -자바스크립트는 o가 속성 someProp을 가졌는지 확인하고, 아니면 `Object.getPrototypeOf(o).someProp`, 또 아니면 `Object.getPrototypeOf(Object.getPrototypeOf(o)).someProp` 등으로 계속 된다. + + + + + + + + + + + + +
+ 생성자 함수 사용의 장점과 단점 +
장점 + 모든 엔진에서 지원합니다(IE 5.5까지도 지원). 또한, 매우 빠르고, 표준에 따르고, JIT 최적화가 가능합니다. +
단점 +
    +
  • 이 방법을 사용하기 위해서는, 해당 함수를 초기화해야 합니다. 이 초기화 중에 생성자는 각각의 객체마다 생성해야 하는 고유한 정보를 저장할 수 있습니다. 이 고유한 정보는 한 번만 생성되고, 잠재적으로 문제를 발생시킬 수 있습니다.
  • +
  • 생성자의 초기화는 원치 않는 메서드를 객체에 넣을 수 있습니다.
  • +
+

둘 다 실제로는 일반적으로 문제가 되지 않습니다.

+
-## 프로토타입 상속의 종류 +### Object.create 이용 -프로토타입 상속에는 3가지 종류가 있다 : 위임형 상속, 연결형 상속, 함수형 상속. +{{jsxref("Object.create()")}}을 호출하면 새로운 객체가 생성됩니다. 이 객체의 `[[Prototype]]`은 함수의 첫 번째 인수입니다. -### 위임형 상속(Delegation inheritance) +```js +const a = { a: 1 }; +// a ---> Object.prototype ---> null -위임형 상속에서 프로토타입 객체는 다른 객체의 기반이 된다. 위임 프로토타입을 상속받을 경우 새 객체는 해당 프로토타입에 대한 참조를 가지고 있다. +const b = Object.create(a); +// b ---> a ---> Object.prototype ---> null +console.log(b.a); // 1 (inherited) -새 객체의 속성에 접근할 때, 해당 객체가 직접적으로 속성을 소유하고 있는지 먼저 체크한다. 없다면 다음 순서로 `[[Prototype]]`을 체크한다. 이 과정은 프로토타입 체인을 따라서 모든 객체의 프로토타입 체인의 최상위에 있는 객체인 `Object.prototype`에 도달할 때 까지 반복된다. +const c = Object.create(b); +// c ---> b ---> a ---> Object.prototype ---> null -메소드를 위임 상속할 경우 모든 객체가 각 메소드에에 대해 하나의 코드를 공유하므로 메모리를 절약할 수 있다. +const d = Object.create(null); +// d ---> null (d는 프로토타입으로 직접 null을 갖는 객체입니다) +console.log(d.hasOwnProperty); +// undefined, d는 Object.prototype에서 상속받지 않기 때문입니다. +``` -Javascript에서 이를 구현하는 방법은 여러가지가 있는데 ES6에서는 아래와 같은 방식이 흔하다: + + + + + + + + + + + + +
+ {{jsxref("Object.create")}}의 장점과 단점 +
장점 + 모든 최신 엔진을 지원합니다. 생성 시 객체의 [[Prototype]]을 직접 설정할 수 있으므로, 런타임에서 객체를 더욱 최적화할 수 있습니다. 또한 Object.create(null)를 사용하여 프로토타입 없이 객체를 생성할 수 있습니다. +
단점 + IE8 이하에서는 지원하지 않습니다. 그러나 Microsoft는 IE8 이하를 실행하는 시스템에 대한 확장 지원을 중단했기 때문에 대부분의 응용 프로그램에서는 문제가 되지 않습니다. 또한, 두 번째 인수를 사용하는 경우 느린 객체 초기화로 인해 성능이 저하될 수 있습니다. 각 객체 설명자 속성에는 자체적으로 구분된 설명자 객체가 있기 때문입니다. 객체 형태를 가지는 수십만 개의 객체 설명자를 처리할 때, 지연 시간이 심각한 문제가 될 수 있습니다. +
+ +### class를 이용하는 방법 ```js -class Greeter { - constructor(name) { - this.name = name || "John Doe"; +class Rectangle { + constructor(height, width) { + this.name = "Rectangle"; + this.height = height; + this.width = width; } - hello() { - return `Hello, my name is ${this.name}`; +} + +class FilledRectangle extends Rectangle { + constructor(height, width, color) { + super(height, width); + this.name = "Filled rectangle"; + this.color = color; } } -const george = new Greeter("George"); -const msg = george.hello(); -console.log(msg); // Hello, my name is George +const filledRectangle = new FilledRectangle(5, 10, "blue"); +// filledRectangle ---> FilledRectangle.prototype ---> Rectangle.prototype ---> Object.prototype ---> null ``` -`Object.create(null)`. 을 통해 프로토타입을 {{jsxref("null")}}로 지정하여 속성 위임 없이 객체를 생성할 수 있다.. - -이 방법의 큰 단점 중 하나는 상태를 저장하는데 그리 좋은 방법이 아니라는 것이다. 객체나 배열의 상태를 변경하게 되면 같은 프로토타입을 공유하는 모든 객체의 상태가 변경된다. + + + + + + + + + + + + + +
+ 클래스의 장점과 단점 +
장점 + 모든 최신 엔진에서 지원됩니다. 매우 높은 가독성과 유지 보수성. 비공개 속성은 프로토타입 상속에서 자잘한 대체가 없는 기능입니다. +
단점 + 특히 비공개 속성이 있는 클래스는 기존 클래스보다 덜 최적화되어 있습니다(엔진 구현자가 이를 개선하기 위해 노력하고 있습니다). 이전 환경에서는 지원되지 않으며 일반적으로 실제 서비스의 운영 환경에서 클래스를 사용하려면 트랜스파일러(transpilers)가 필요합니다. +
+ +### Object.setPrototypeOf()를 이용하는 방법 + +위의 모든 메서드는 객체 생성 시 프로토타입 체인을 설정하지만, [`Object.setPrototypeOf()`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf)는 이미 생성된 객체의 내부 `[[Prototype]]` 속성을 변경할 수 있습니다. -상태 변경이 전파되는 것을 막으려면 각 객체마다 상태 값의 복사본을 만들어야 한다. - -### 연결형 상속(Concatenative inheritance) - -연결형 상속은 한 객체의 속성을 다른 객체에 모두 복사함으로써 상속을 구현하는 방법이다. +```js +const obj = { a: 1 }; +const anotherObj = { b: 2 }; +Object.setPrototypeOf(obj, anotherObj); +// obj ---> anotherObj ---> Object.prototype ---> null +``` -이 상속법은 Javascript 객체의 동적 확장성을 이용한 방법이다. 객체 복사는 속성의 초기값을 저장하기 위한 좋은 방법이다: 이 방식은 {{jsxref("Object.assign()")}}을 통해 구현하는 것이 보통이며 ES6 이전에 Lodash, Underscore, jQuery등의 라이브러리들이 `.extend()` 와 비슷한 메소드로 제공한 방법이다. + + + + + + + + + + + + +
+ {{jsxref("Object.setPrototypeOf")}}의 장점과 단점 +
장점 + 모든 최신 엔진에서 지원됩니다. 객체의 프로토타입을 동적으로 조작할 수 있으며 Object.create(null)로 만든 프로토타입이 없는 객체에 프로토타입을 적용할 수 있습니다. +
단점 + 성능이 좋지 않습니다. 객체 생성 시 프로토타입을 설정할 수 있는 경우 피해야 합니다. 많은 엔진들이 프로토타입을 최적화하고 미리 인스턴스를 호출할 때 메모리에서 메서드의 위치를 추측하려고 합니다. 그러나 프로토타입을 동적으로 설정하면 이러한 모든 최적화가 중단됩니다. 명세에 따라 작동하도록, 일부 엔진이 최적화 해제를 위해 코드를 다시 컴파일하게 할 수 있습니다. IE8 이하에서는 지원하지 않습니다. +
+ +### \_\_proto\_\_ 접근자를 사용하는 방법 + +모든 객체는 [`Object.prototype.__proto__`](//docs/Web/JavaScript/Reference/Global_Objects/Object/proto) 설정자를 상속하며, 이는 기존 객체의 `[[Prototype]]`을 설정하는 데 사용할 수 있습니다(`__proto__` 키가 객체에서 재정의되지 않은 경우). + +> **경고:** `Object.prototype.__proto__` 접근자는 **비표준**이며 더 이상 사용되지 않습니다. 대신 거의 항상 `Object.setPrototypeOf`를 사용해야 합니다. ```js -const proto = { - hello: function hello() { - return `Hello, my name is ${this.name}`; - }, -}; - -const george = Object.assign({}, proto, { name: "George" }); -const msg = george.hello(); -console.log(msg); // Hello, my name is George +const obj = {}; +// 이것을 사용하지 마세요. 오직 예시일 뿐입니다. +obj.__proto__ = { barProp: "bar val" }; +obj.__proto__.__proto__ = { fooProp: "foo val" }; +console.log(obj.fooProp); +console.log(obj.barProp); ``` -연결형 상속은 매우 좋은 방법이며 클로져와 같이 사용한다면 훨씬 효과적인 상속 방식입니다.. + + + + + + + + + + + + +
+ {{jsxref("Object/proto","__proto__")}} 속성 설정의 장점과 단점 +
장점 + 모든 최신 엔진에서 지원됩니다. {{jsxref("Object/proto","__proto__")}}를 객체가 아닌 것으로 설정하면 조용히 실패합니다. 예외를 던지지 않습니다. +
단점 + 성능이 떨어지고 더 이상 사용되지 않습니다. 많은 엔진이 프로토타입을 최적화하고 미리 인스턴스를 호출할 때 메모리에서 메서드의 위치를 추측하려고 합니다. 그러나 프로토타입을 동적으로 설정하면 이러한 모든 최적화가 중단되고 일부 엔진이 명세에 따라 작동하도록 코드의 최적화 해제를 위해 다시 컴파일하도록 강제할 수 있습니다. IE10 이하에서는 지원하지 않습니다. {{jsxref("Object/proto","__proto__")}} 설정자는 표준 선택 사항이므로, 모든 플랫폼에서 작동하지 않을 수 있습니다. 대신 거의 항상 {{jsxref("Object.setPrototypeOf")}}를 사용해야 합니다. +
+ +## 성능 + +프로토타입 체인에서 상위에 있는 속성에 대한 조회 시간은 성능에 부정적인 영향을 미칠 수 있으며, 이는 성능 중심의 코드에선 심각한 문제입니다. 또한, 존재하지도 않는 속성에 접근하려는 시도는 항상 모든 프로토타입 체인인 전체를 탐색하게 됩니다. + +또한, 객체의 속성을 반복할 때, 프로토타입 체인에 있는 **모든"** 열거 가능한 속성이 열거됩니다. 객체가 프로토타입 체인이 아닌 *itself*에 정의된 속성을 가지고 있는지 확인하려면, [`hasOwnProperty`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) 또는 [`Object.hasOwn`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn) 메서드를 사용해야 합니다. `[[Prototype]]`으로 `null`이 있는 객체를 제외한 모든 객체는 프로토타입 체인에서 더 아래로 재정의되지 않는 한 `Object.prototype`에서 [`hasOwnProperty`](/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty)를 상속합니다. 구체적인 예를 제공하기 위해 위의 그래프 예제 코드를 사용하여 설명하겠습니다. -### 함수형 상속(Functional inheritance) +```js +function Graph() { + this.vertices = []; + this.edges = []; +} -함수형 상속(Functional inheritance)이라는 단어는 Douglas Crockford가 자신의 저서 "JavaScript: The Good Parts"에서 창조한 단어이다. 이 방법은 새 속성들을 연결형 상속으로 쌓되 상속 기능을 Factory 함수로 만들어 사용하는 방식이다. +Graph.prototype.addVertex = function (v) { + this.vertices.push(v); +}; -기존의 객체를 확장하는데 쓰이는 함수를 일반적으로 믹스인 함수라 칭한다. 객체 확장에 함수를 사용하는 가장 큰 이점은 Private Data를 클로져를 통해 캡슐화 시킬 수 있다는 점이다. +const g = new Graph(); +// g ---> Graph.prototype ---> Object.prototype ---> null -다르게 말하자면 Private 상태를 지정할 수 있다는 의미이다. +g.hasOwnProperty("vertices"); // true +Object.hasOwn(g, "vertices"); // true -특정 함수를 통할 필요 없이 public 접근이 가능한 속성에 대해 접근 제한을 거는 것은 문제가 있다. 따라서 private 클로져에 속성 값을 숨겨야 하며 이는 아래와 같이 구현한다: +g.hasOwnProperty("nope"); // false +Object.hasOwn(g, "nope"); // false -```js -// import Events from 'eventemitter3'; - -const rawMixin = function () { - const attrs = {}; - return Object.assign( - this, - { - set(name, value) { - attrs[name] = value; - this.emit("change", { - prop: name, - value: value, - }); - }, - get(name) { - return attrs[name]; - }, - }, - Events.prototype, - ); -}; +g.hasOwnProperty("addVertex"); // false +Object.hasOwn(g, "addVertex"); // false -const mixinModel = (target) => rawMixin.call(target); -const george = { name: "george" }; -const model = mixinModel(george); -model.on("change", (data) => console.log(data)); -model.set("name", "Sam"); -/* -{ - prop: 'name', - value: 'Sam' -} -*/ +Object.getPrototypeOf(g).hasOwnProperty("addVertex"); // true ``` -`attrs` 을 public 속성에서 private 영역으로 옮겨서 public API를 통한 접근을 차단할 수 있다. // 접근할 수 있는 유일한 방법은 Privileged 메소드 뿐이다. Privileged 메소드는 클로져 영역에 정의된 함수로 private data에 접근 가능한 함수들을 일컫는다. - -위 예제를 보면 믹스인 함수 `rawMixin()`.에 대한 래퍼로 `mixinModel()` 을 선언한 것을 알 수 있다. 이는 예제에서 {{jsxref("Function.prototype.call()")}} 을 사용했듯이 함수 내에서 `this`의 값을 설정해야 하기 때문이다. Wrapper를 생략하고 호출자가 알아서 하도록 놔둘 수 있지만 그럴 경우 혼동될 가능성이 있다. +참고: 속성이 [`undefined`](/ko/docs/Web/JavaScript/Reference/Global_Objects/undefined)인지 확인하는 것만으로는 충분하지 않습니다. 속성이 존재하나 단순히 값이 `undefined`인 경우도 있습니다. ## 결론 -복잡한 코드를 작성하여 이용하기 전에 프로토타입 기반의 상속 모델을 이해하는 것이 **중요하다**. 또한 프로토타입 체인의 길이는 성능을 저해하지 않도록 줄이는 방법을 고안해야 한다. 또한 빌트인 프로토타입은 새로운 자바스크립트 기능과 호환성을 갖기 위한 이유가 아닌 이상 **절대** 확장해서는 안된다. +JavaScript는 모두 동적이고 런타임이며 정적 타입이 전혀 없기 때문에, Java 또는 C++에서 온 개발자에게는 다소 혼란스러울 수 있습니다. 모든 것은 객체(인스턴스)이거나 함수(생성자)이며 함수 자체도 `Function` 생성자의 인스턴스입니다. 문법 구성인 "클래스"도 런타임에는 생성자 함수일 뿐입니다. + +JavaScript의 모든 생성자 함수에는 `new` 연산자와 함께 작동하는 `prototype`이라는 특수 속성이 있습니다. +프로토타입 객체에 대한 참조는 새 인스턴스의 내부 `[[Prototype]]` 속성에 복사됩니다. 예를 들어, `const a1 = new A()`를 수행하면, JavaScript(메모리에 객체를 생성한 후 `this`를 정의한 `A()`를 실행하기 전에)는 `a1.[[Prototype]] = A.prototype`을 설정합니다. 그런 다음 인스턴스의 속성에 접근하면, JavaScript는 먼저 해당 객체에 직접 존재하는지 여부를 확인하고, 그렇지 않은 경우 `[[Prototype]]`에서 찾습니다. `[[Prototype]]`은 원하는 값을 찾을 때까지 재귀적으로 탐색합니다. 즉, `a1.doSomething`, `Object.getPrototypeOf(a1).doSomething`, `Object.getPrototypeOf(Object.getPrototypeOf(a1)).doSomething` 순서로 탐색하며, 값을 찾거나 `Object.getPrototypeOf`는 `null`일 때 탐색을 종료합니다. 이는 `prototype`에 정의된 모든 속성이 모든 인스턴스에서 효과적으로 공유되며, 나중에 `prototype`의 일부를 변경하고 변경 사항이 모든 기존 인스턴스에 나타나도록 할 수 있다는 것을 의미합니다. + +위의 예에서 `const a1 = new A(); const a2 = new A();`인 경우 `a1.doSomething`은 실제로 `Object.getPrototypeOf(a1).doSomething`을 참조하고, 이는 정의한 `A.prototype.doSomething`과 동일합니다. 즉, `Object.getPrototypeOf(a1).doSomething === Object.getPrototypeOf(a2).doSomething === A.prototype.doSomething`입니다. + +프로토타입 상속 모델을 사용하는 복잡한 코드를 작성하기 전에 프로토타입 상속 모델을 이해하는 것이 필수적입니다. 또한, 코드에서 프로토타입 체인의 길이를 파악하여 필요한 경우 성능 문제를 방지하기 위해 분할하세요. 또한, 내장 프로토타입은 최신 JavaScript 기능과의 호환성을 위한 경우가 아니면 **절대** 확장해서는 안 됩니다. From cfbf2895886ec9e6100d5ecf722a72b0db71fa09 Mon Sep 17 00:00:00 2001 From: HoJeong Im <39ghwjd@naver.com> Date: Wed, 20 Sep 2023 19:09:25 +0900 Subject: [PATCH 037/268] [ko] add index.md for `web/glossary/cross-site_scripting` (#15782) --- .../ko/glossary/cross-site_scripting/index.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 files/ko/glossary/cross-site_scripting/index.md diff --git a/files/ko/glossary/cross-site_scripting/index.md b/files/ko/glossary/cross-site_scripting/index.md new file mode 100644 index 00000000000000..d08911e0311ff6 --- /dev/null +++ b/files/ko/glossary/cross-site_scripting/index.md @@ -0,0 +1,19 @@ +--- +title: 크로스 사이트 스크립팅 (Cross-site scripting (XSS)) +slug: Glossary/Cross-site_scripting +l10n: + sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34 +--- + +{{GlossarySidebar}} + +크로스 사이트 스크립팅 (XSS)은 공격자가 웹사이트에 악성 클라이언트 사이드 코드를 삽입할 수 있도록 하는 보안 취약점 공격입니다. 이 악성 코드는 피해자에 의해 실행되며 공격자가 접근 제어를 우회하고 사용자로 위장할 수 있게 만들어 줍니다. 오픈 웹 애플리케이션 보안 프로젝트에 따르면, XSS는 2017년에 [7번째로 흔한 웹 앱 취약점]()이었습니다. + +웹 앱이 충분한 유효성 검사나 인코딩을 사용하지 않으면 이러한 공격은 성공하게 됩니다. 사용자의 브라우저는 신뢰할 수 없는 악성 스크립트를 탐지할 수 없고, 쿠키, 세션 토큰 또는 기타 민감한 사이트별 정보에 대한 접근 권한을 부여해버리거나 악성 스크립트가 {{glossary("HTML")}} 콘텐츠를 다시 작성할 수 있도록 합니다. + +## 같이 보기 + +- [공격 유형: 크로스 사이트 스크립팅 (XSS)](/ko/docs/Web/Security/Types_of_attacks#cross-site_scripting_xss) +- 위키백과의 [크로스 사이트 스크립팅](https://en.wikipedia.org/wiki/Cross-site_scripting) +- [OWASP의 크로스 사이트 스크립팅](https://owasp.org/www-community/attacks/xss/) +- [크로스 사이트 스크립팅에 대한 다른 글](https://www.acunetix.com/blog/articles/dom-xss-explained/) From fe3f9d25142145d1fdc171e770996142fe318fd5 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 16 Sep 2023 17:30:08 +0900 Subject: [PATCH 038/268] =?UTF-8?q?=E7=94=A8=E8=AA=9E=E9=9B=86=20=E3=80=8C?= =?UTF-8?q?Node=E3=80=8D=E3=82=92=E7=BF=BB=E8=A8=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/ja/glossary/node/index.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 files/ja/glossary/node/index.md diff --git a/files/ja/glossary/node/index.md b/files/ja/glossary/node/index.md new file mode 100644 index 00000000000000..153178dfdaaa37 --- /dev/null +++ b/files/ja/glossary/node/index.md @@ -0,0 +1,12 @@ +--- +title: Node +slug: Glossary/Node +l10n: + sourceCommit: ada5fa5ef15eadd44b549ecf906423b4a2092f34 +--- + +**node** という用語は文脈によっていくつかの意味を持ちます。下記の用語を指しているかもしれません。 + +{{GlossaryDisambiguation}} + +この用語は {{Glossary("Node.js")}} について話すときにも使われます。 From 947ed6338df0a370a2f282950b441c1b6112b12b Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Sat, 16 Sep 2023 23:06:34 +0900 Subject: [PATCH 039/268] =?UTF-8?q?2023/02/28=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=90=8C=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/ja/web/api/messageevent/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/files/ja/web/api/messageevent/index.md b/files/ja/web/api/messageevent/index.md index 6a9fbc9d1279ce..303c70d64e01d1 100644 --- a/files/ja/web/api/messageevent/index.md +++ b/files/ja/web/api/messageevent/index.md @@ -2,7 +2,7 @@ title: MessageEvent slug: Web/API/MessageEvent l10n: - sourceCommit: bbecba9e7d688493adbdc37fc70e02d87adfe371 + sourceCommit: 2ba2c0efbdf0c34b1da02203e4e84b571c883629 --- {{APIRef("HTML DOM")}} @@ -16,7 +16,7 @@ l10n: - 文書間のメッセージ({{domxref("Window.postMessage()")}} および {{domxref("Window.message_event")}} を参照)。 - [チャンネルメッセージ](/ja/docs/Web/API/Channel_Messaging_API) ({{domxref("MessagePort.postMessage()")}} および {{domxref("MessagePort.message_event")}} を参照)。 - ワーカー/文書間メッセージ(上記 2 項目ほか、{{domxref("Worker.postMessage()")}}, {{domxref("Worker.message_event")}}, {{domxref("ServiceWorkerGlobalScope.message_event")}} なども参照)。 -- [ブロードキャストチャンネル](/ja/docs/Web/API/Broadcast_Channel_API) ({{domxref("Broadcastchannel.postMessage()")}}) および {{domxref("BroadcastChannel.onmessage")}} を参照). +- [ブロードキャストチャンネル](/ja/docs/Web/API/Broadcast_Channel_API) ({{domxref("Broadcastchannel.postMessage()")}}) および {{domxref("BroadcastChannel.message_event")}} を参照). このイベントによって引き起こされる動作は、対応する `message` イベント(例えば、 上記の `onmessage` ハンドラーを使ったもの)のイベントハンドラーとして設定された関数の中で定義されています。 @@ -39,7 +39,7 @@ _このインターフェースは親である {{domxref("Event")}} からプロ - {{domxref("MessageEvent.lastEventId")}} {{ReadOnlyInline}} - : 文字列で、このイベントの一意の ID を表します。 - {{domxref("MessageEvent.source")}} {{ReadOnlyInline}} - - : `MessageEventSource` ({{domxref("WindowProxy")}}、{{domxref("MessagePort")}}、{{domxref("ServiceWorker")}} の何れかのオブジェクト)で、メッセージの送信元を表します。 + - : `MessageEventSource` ({{glossary("WindowProxy")}}、{{domxref("MessagePort")}}、{{domxref("ServiceWorker")}} の何れかのオブジェクト)で、メッセージの送信元を表します。 - {{domxref("MessageEvent.ports")}} {{ReadOnlyInline}} - : {{domxref("MessagePort")}} オブジェクトの配列で、メッセージが送信されるチャンネルに関連するポートを表します(チャンネルメッセージングや、共有ワーカーにメッセージを送信する場合など、適切な場合)。 @@ -50,7 +50,7 @@ _このインターフェースは親である {{domxref("Event")}} からメソ - {{domxref("MessageEvent.initMessageEvent","initMessageEvent()")}} {{deprecated_inline}} - : メッセージイベントを初期化します。**これ以上このメソッドを使用しないでください。代わりに、{{domxref("MessageEvent.MessageEvent", "MessageEvent()")}} コンストラクターを使用してください。** -## 例> +## 例 [基本的な共有ワーカーの例](https://github.com/mdn/dom-examples/tree/main/web-workers/simple-shared-worker)([共有ワーカーを実行](https://mdn.github.io/dom-examples/web-workers/simple-shared-worker/))には 2 つの HTML ページがあり、それぞれのページが単純な計算をする JavaScript を実行しています。異なるスクリプトが計算を実行するために同一のワーカーファイルを使用しています。ページの異なるウィンドウ内で動作していても、どちらのスクリプトもワーカーファイルにアクセスできます。 From 35a6cbce1e6676b165027b0fb7e7d5ac1db02b69 Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Sun, 17 Sep 2023 00:36:16 +0900 Subject: [PATCH 040/268] =?UTF-8?q?2023/04/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=90=8C=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/ja/web/api/messageevent/lasteventid/index.md | 5 +++-- files/ja/web/api/messageevent/messageevent/index.md | 11 ++++++----- files/ja/web/api/messageevent/origin/index.md | 3 ++- files/ja/web/api/messageevent/ports/index.md | 7 ++++--- files/ja/web/api/messageevent/source/index.md | 9 +++++---- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/files/ja/web/api/messageevent/lasteventid/index.md b/files/ja/web/api/messageevent/lasteventid/index.md index 77d295937c131d..287fcc36ffd6ce 100644 --- a/files/ja/web/api/messageevent/lasteventid/index.md +++ b/files/ja/web/api/messageevent/lasteventid/index.md @@ -1,8 +1,9 @@ --- -title: MessageEvent.lastEventId +title: "MessageEvent: lastEventId プロパティ" +short-title: lastEventId slug: Web/API/MessageEvent/lastEventId l10n: - sourceCommit: 4b4638246aad5d39b9a2e5c572b179b4c39c0a84 + sourceCommit: 84f8672adab0fdb783d02676c42a2b7ae16b3606 --- {{APIRef("HTML DOM")}} diff --git a/files/ja/web/api/messageevent/messageevent/index.md b/files/ja/web/api/messageevent/messageevent/index.md index 74c105dd00a0ae..6b306577cc0699 100644 --- a/files/ja/web/api/messageevent/messageevent/index.md +++ b/files/ja/web/api/messageevent/messageevent/index.md @@ -1,8 +1,9 @@ --- -title: MessageEvent() +title: "MessageEvent: MessageEvent() コンストラクター" +short-title: MessageEvent() slug: Web/API/MessageEvent/MessageEvent l10n: - sourceCommit: b7556b71e1fc3e89057671b372871e9f33d3f0b8 + sourceCommit: 84f8672adab0fdb783d02676c42a2b7ae16b3606 --- {{APIRef("HTML DOM")}} @@ -11,9 +12,9 @@ l10n: ## 構文 -```js -new MessageEvent(type); -new MessageEvent(type, options); +```js-nolint +new MessageEvent(type) +new MessageEvent(type, options) ``` ### 引数 diff --git a/files/ja/web/api/messageevent/origin/index.md b/files/ja/web/api/messageevent/origin/index.md index dfd061a4afbc63..587f3979d563c7 100644 --- a/files/ja/web/api/messageevent/origin/index.md +++ b/files/ja/web/api/messageevent/origin/index.md @@ -1,5 +1,6 @@ --- -title: MessageEvent.origin +title: "MessageEvent: origin プロパティ" +short-title: origin slug: Web/API/MessageEvent/origin l10n: sourceCommit: 4b4638246aad5d39b9a2e5c572b179b4c39c0a84 diff --git a/files/ja/web/api/messageevent/ports/index.md b/files/ja/web/api/messageevent/ports/index.md index 58904836c77a5e..95d692dd97b825 100644 --- a/files/ja/web/api/messageevent/ports/index.md +++ b/files/ja/web/api/messageevent/ports/index.md @@ -1,8 +1,9 @@ --- -title: MessageEvent.ports +title: "MessageEvent: ports プロパティ" +short-title: ports slug: Web/API/MessageEvent/ports l10n: - sourceCommit: 4b4638246aad5d39b9a2e5c572b179b4c39c0a84 + sourceCommit: 84f8672adab0fdb783d02676c42a2b7ae16b3606 --- {{APIRef("HTML DOM")}} @@ -24,7 +25,7 @@ onconnect = (e) => { port.postMessage(workerResult); }); - port.start(); // Required when using addEventListener. Otherwise called implicitly by onmessage setter. + port.start(); // addEventListener を使用した場合は必要。 onmessage セッターからは暗黙に呼び出されます。 }; ``` diff --git a/files/ja/web/api/messageevent/source/index.md b/files/ja/web/api/messageevent/source/index.md index 5e9b20a10bf40b..3b93d831ac815f 100644 --- a/files/ja/web/api/messageevent/source/index.md +++ b/files/ja/web/api/messageevent/source/index.md @@ -1,17 +1,18 @@ --- -title: MessageEvent.source +title: "MessageEvent: source プロパティ" +short-title: source slug: Web/API/MessageEvent/source l10n: - sourceCommit: 4b4638246aad5d39b9a2e5c572b179b4c39c0a84 + sourceCommit: 84f8672adab0fdb783d02676c42a2b7ae16b3606 --- {{APIRef("HTML DOM")}} -**`source`** は {{domxref("MessageEvent")}} インターフェイスの読み取り専用プロパティで、メッセージ送信者を表す `MessageEventSource` ({{domxref("WindowProxy")}}, {{domxref("MessagePort")}}, {{domxref("ServiceWorker")}} オブジェクトのいずれか)です。 +**`source`** は {{domxref("MessageEvent")}} インターフェイスの読み取り専用プロパティで、メッセージ送信者を表す `MessageEventSource` ({{glossary("WindowProxy")}}, {{domxref("MessagePort")}}, {{domxref("ServiceWorker")}} オブジェクトのいずれか)です。 ## 値 -メッセージ送信者を表す `MessageEventSource` ({{domxref("WindowProxy")}}, {{domxref("MessagePort")}}, {{domxref("ServiceWorker")}} オブジェクトのいずれか)です。 +メッセージ送信者を表す `MessageEventSource` ({{glossary("WindowProxy")}}, {{domxref("MessagePort")}}, {{domxref("ServiceWorker")}} オブジェクトのいずれか)です。 ## 例 From 89027458d15d07998999cde34bf9fa28a166ca46 Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Sun, 17 Sep 2023 00:39:30 +0900 Subject: [PATCH 041/268] =?UTF-8?q?2023/08/19=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=90=8C=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/ja/web/api/messageevent/data/index.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/files/ja/web/api/messageevent/data/index.md b/files/ja/web/api/messageevent/data/index.md index d755e9a64f0e15..0dc0408b447a8c 100644 --- a/files/ja/web/api/messageevent/data/index.md +++ b/files/ja/web/api/messageevent/data/index.md @@ -1,8 +1,9 @@ --- -title: MessageEvent.data +title: "MessageEvent: data プロパティ" +short-title: data slug: Web/API/MessageEvent/data l10n: - sourceCommit: 4b4638246aad5d39b9a2e5c572b179b4c39c0a84 + sourceCommit: 6a0f22ee0b3a854ed37271373cbc1d1099c0d361 --- {{APIRef("HTML DOM")}} @@ -11,7 +12,7 @@ l10n: ## 値 -このメッセージの送信元が送信するデータです。これはどの型でも構いません。 +このメッセージの送信元が送信するデータです。このイベントの発信元が何であるかによって、あらゆるデータ型になる可能性があります。 ## 例 From 0e40b53e04148614ec578f8f0958d7ebb4ae053b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Maurice?= <55036198+tisma95@users.noreply.github.com> Date: Wed, 20 Sep 2023 12:22:29 +0200 Subject: [PATCH 042/268] =?UTF-8?q?Translate=20pseudo=20classes=20&=20?= =?UTF-8?q?=C3=A9l=C3=A9ments=20(#15806)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the reference section to be the same like english doc Set the doc according to english translation * Update files/fr/learn/css/building_blocks/selectors/pseudo-classes_and_pseudo-elements/index.md Co-authored-by: SphinxKnight --- .../index.md | 82 +++---------------- 1 file changed, 12 insertions(+), 70 deletions(-) diff --git a/files/fr/learn/css/building_blocks/selectors/pseudo-classes_and_pseudo-elements/index.md b/files/fr/learn/css/building_blocks/selectors/pseudo-classes_and_pseudo-elements/index.md index 2f0d358fbc6464..fcb88096f77259 100644 --- a/files/fr/learn/css/building_blocks/selectors/pseudo-classes_and_pseudo-elements/index.md +++ b/files/fr/learn/css/building_blocks/selectors/pseudo-classes_and_pseudo-elements/index.md @@ -123,75 +123,17 @@ Dans l'exemple suivant, nous avons ajouté une chaîne vide en utilisant le pseu L'utilisation des pseudo-éléments `::before` et `::after` avec la propriété `content` est appelée "Generated Content" en CSS, et vous verrez souvent cette technique utilisée pour diverses tâches. Un bon exemple est le site [CSS Arrow Please](http://www.cssarrowplease.com/), qui vous aide à générer une flèche avec le CSS. Examinez le CSS lorsque vous créez votre flèche et vous verrez les pseudo-éléments {{cssxref("::before")}} and {{cssxref("::after")}}utilisés. Chaque fois que vous voyez ces sélecteurs, regardez la propriété {{cssxref("content")}} pour voir ce qui est ajouté au document. -## Section de référence - -Il existe un grand nombre de pseudo-classes et pseudo-éléments, une bonne liste de références est donc utile. Vous trouverez ci-dessous des tableaux les répertoriant, avec pour chacun le lien vers la page de référence sur MDN. Vous y trouverez toutes les informations sur leur utilisation. - -### Pseudo-classes - -| Sélecteur | Description | -| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| {{ Cssxref(":active") }} | Matches when the user activates (for example clicks on) an element. | -| {{ Cssxref(":any-link") }} | Matches both the `:link` and `:visited` states of a link. | -| {{ Cssxref(":blank") }} | Matches an [`` element](/fr/docs/Web/HTML/Element/input) whose input value is empty. | -| {{ Cssxref(":checked") }} | Matches a radio button or checkbox in the selected state. | -| {{ Cssxref(":current") }} | Matches the element, or an ancestor of the element, that is currently being displayed. | -| {{ Cssxref(":default") }} | Matches the one or more UI elements that are the default among a set of similar elements. | -| {{ Cssxref(":dir") }} | Select an element based on its directionality (value of the HTML [`dir`](/fr/docs/Web/HTML/Global_attributes/dir) attribute or CSS [`direction`](/fr/docs/Web/CSS/direction) property). | -| {{ Cssxref(":disabled") }} | Matches user interface elements that are in an disabled state. | -| {{ Cssxref(":empty") }} | Matches an element that has no children except optionally white space. | -| {{ Cssxref(":enabled") }} | Matches user interface elements that are in an enabled state. | -| {{ Cssxref(":first") }} | In [Paged Media](/fr/docs/Web/CSS/Paged_Media), matches the first page. | -| {{ Cssxref(":first-child") }} | Matches an element that is first among its siblings. | -| {{ Cssxref(":first-of-type") }} | Matches an element which is first of a certain type among its siblings. | -| {{ Cssxref(":focus") }} | Matches when an element has focus. | -| {{ Cssxref(":focus-visible")}} | Matches when an element has focus and the focus should be visible to the user. | -| {{ Cssxref(":focus-within") }} | Matches an element with focus plus an element with a descendent that has focus. | -| {{ Cssxref(":future") }} | Matches the elements after the current element. | -| {{ Cssxref(":hover") }} | Matches when the user hovers over an element. | -| {{ Cssxref(":indeterminate") }} | Matches UI elements whose value is in an indeterminate state, usually [checkboxes](/fr/docs/Web/HTML/Element/input/checkbox). | -| {{ Cssxref(":in-range") }} | Matches an element with a range when its value is in-range. | -| {{ Cssxref(":invalid") }} | Matches an element, such as an ``, in an invalid state. | -| {{ Cssxref(":lang") }} | Matches an element based on language (value of the HTML [lang](/fr/docs/Web/HTML/Global_attributes/lang) attribute). | -| {{ Cssxref(":last-child") }} | Matches an element which is last among its siblings. | -| {{ Cssxref(":last-of-type") }} | Matches an element of a certain type that is last among its siblings. | -| {{ Cssxref(":left") }} | In [Paged Media](/fr/docs/Web/CSS/CSS_Pages), matches left-hand pages. | -| {{ Cssxref(":link")}} | Matches unvisited links. | -| {{ Cssxref(":local-link")}} | Matches links pointing to pages that are in the same site as the current document. | -| {{ Cssxref(":is", ":is()")}} | Matches any of the selectors in the selector list that is passed in. | -| {{ Cssxref(":not") }} | Matches things not matched by selectors that are passed in as a value to this selector. | -| {{ Cssxref(":nth-child") }} | Matches elements from a list of siblings — the siblings are matched by a formula of the form _an+b_ (e.g. 2n + 1 would match elements 1, 3, 5, 7, etc. All the odd ones.) | -| {{ Cssxref(":nth-of-type") }} | Matches elements from a list of siblings that are of a certain type (e.g. `

` elements) — the siblings are matched by a formula of the form _an+b_ (e.g. 2n + 1 would match that type of element, numbers 1, 3, 5, 7, etc. All the odd ones.) | -| {{ Cssxref(":nth-last-child") }} | Matches elements from a list of siblings, counting backwards from the end. The siblings are matched by a formula of the form _an+b_ (e.g. 2n + 1 would match the last element in the sequence, then two elements before that, then two elements before that, etc. All the odd ones, counting from the end.) | -| {{ Cssxref(":nth-last-of-type") }} | Matches elements from a list of siblings that are of a certain type (e.g. `

` elements), counting backwards from the end. The siblings are matched by a formula of the form _an+b_ (e.g. 2n + 1 would match the last element of that type in the sequence, then two elements before that, then two elements before that, etc. All the odd ones, counting from the end.) | -| {{ Cssxref(":only-child") }} | Matches an element that has no siblings. | -| {{ Cssxref(":only-of-type") }} | Matches an element that is the only one of its type among its siblings. | -| {{ Cssxref(":optional") }} | Matches form elements that are not required. | -| {{ Cssxref(":out-of-range") }} | Matches an element with a range when its value is out of range. | -| {{ Cssxref(":past") }} | Matches the elements before the current element. | -| {{ Cssxref(":placeholder-shown") }} | Matches an input element that is showing placeholder text. | -| {{ Cssxref(":playing") }} | Matches an element representing an audio, video, or similar resource that is capable of being "played" or "paused", when that element is "playing". | -| {{ Cssxref(":paused") }} | Matches an element representing an audio, video, or similar resource that is capable of being "played" or "paused", when that element is "paused". | -| {{ Cssxref(":read-only") }} | Matches an element if it is not user-alterable. | -| {{ Cssxref(":read-write") }} | Matches an element if it is user-alterable. | -| {{ Cssxref(":required") }} | Matches form elements that are required. | -| {{ Cssxref(":right") }} | In [Paged Media](/fr/docs/Web/CSS/CSS_Pages), matches right-hand pages. | -| {{ Cssxref(":root") }} | Matches an element that is the root of the document. | -| {{ Cssxref(":scope") }} | Matches any element that is a scope element. | -| {{ Cssxref(":valid") }} | Matches an element such as an `` element, in a valid state. | -| {{ Cssxref(":target") }} | Matches an element if it is the target of the current URL (i.e. if it has an ID matching the current [URL fragment](https://en.wikipedia.org/wiki/Fragment_identifier)). | -| {{ Cssxref(":visited") }} | Matches visited links. | - -### Pseudo-éléments - -| Sélecteur | Description | -| --------------------------------- | ---------------------------------------------------------------------------------------- | -| {{ Cssxref("::after") }} | Matches a stylable element appearing after the originating element's actual content. | -| {{ Cssxref("::before") }} | Matches a stylable element appearing before the originating element's actual content. | -| {{ Cssxref("::first-letter") }} | Matches the first letter of the element. | -| {{ Cssxref("::first-line") }} | Matches the first line of the containing element. | -| {{ Cssxref("::grammar-error") }} | Matches a portion of the document containing a grammar error as flagged by the browser. | -| {{ Cssxref("::selection") }} | Matches the portion of the document that has been selected. | -| {{ Cssxref("::spelling-error") }} | Matches a portion of the document containing a spelling error as flagged by the browser. | +## Résumé + +Dans cet article, nous avons présenté les pseudo-classes et les pseudo-éléments CSS, qui sont des types particuliers de sélecteurs. + +Les pseudo-classes vous permettent de cibler un élément lorsqu'il se trouve dans un état particulier, comme si vous aviez ajouté une classe pour cet état au DOM. Les pseudo-éléments agissent comme si vous aviez ajouté un nouvel élément au DOM, et vous permettent de le styliser. Les pseudo-éléments `::before` et `::after` vous permettent d'insérer du contenu dans le document à l'aide de CSS. + +Dans le prochain article, nous aborderons [les combinateurs](/fr/docs/Learn/CSS/Building_blocks/Selectors/Combinators). + +## Voir aussi + +- [La référence des pseudo-classes](/fr/docs/Web/CSS/Pseudo-classes) +- [La référence des pseudo-éléments](/fr/docs/Web/CSS/Pseudo-elements) {{PreviousMenuNext("Learn/CSS/Building_blocks/Selectors/Attribute_selectors", "Learn/CSS/Building_blocks/Selectors/Combinators", "Learn/CSS/Building_blocks")}} From a9518c8b08cfeb78a5f9f0f062743fbeee5f77ed Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Wed, 20 Sep 2023 13:02:44 +0200 Subject: [PATCH 043/268] Fix #14813 (#15889) Update to fix #14813 --- .../auto-placement_in_grid_layout/index.md | 154 ++++++------------ 1 file changed, 53 insertions(+), 101 deletions(-) diff --git a/files/fr/web/css/css_grid_layout/auto-placement_in_grid_layout/index.md b/files/fr/web/css/css_grid_layout/auto-placement_in_grid_layout/index.md index 100eddbb3fe2fa..2f629ee192cc2a 100644 --- a/files/fr/web/css/css_grid_layout/auto-placement_in_grid_layout/index.md +++ b/files/fr/web/css/css_grid_layout/auto-placement_in_grid_layout/index.md @@ -1,16 +1,18 @@ --- title: Le placement automatique sur une grille CSS slug: Web/CSS/CSS_grid_layout/Auto-placement_in_grid_layout +l10n: + sourceCommit: b906098e63b1eb3512b4381fe7c105b67037aff1 --- {{CSSRef}} -{{PreviousMenuNext("Web/CSS/CSS_Grid_Layout/Utiliser_des_lignes_nommées_sur_une_grille", "Web/CSS/CSS_Grid_Layout/Alignement_des_boîtes_avec_les_grilles_CSS","Web/CSS/CSS_Grid_Layout")}} - -En plus de pouvoir placer des objets de façon précise sur une grille, la spécification pour les grilles CSS définit le comportement obtenu lorsque certains des objets ne sont pas placés sur la grille (voire aucun). Pour voir comment fonctionne le placement automatique, il suffit de créer une grille avec un ensemble d'objets. Sans fournir aucune information de placement, ces objets se placeront chacun sur une cellule de la grille. +En plus de pouvoir placer des objets de façon précise sur une grille, la spécification pour les grilles CSS définit le comportement obtenu lorsque certains (voire aucun) des objets ne sont pas placés sur la grille. Pour voir comment fonctionne le placement automatique, il suffit de créer une grille avec un ensemble d'objets. ## Placement automatique +Sans fournir aucune information de placement, ces objets se placeront chacun sur une cellule de la grille. + ```css hidden * { box-sizing: border-box; @@ -49,17 +51,17 @@ En plus de pouvoir placer des objets de façon précise sur une grille, la spéc

``` -{{EmbedLiveSample('Placement_automatique', '500', '230')}} +{{EmbedLiveSample('', '500', '230')}} -## Définir des règles pour le placement automatique +## Les règles par défaut pour le placement automatique -Comme on peut le voir dans l'exemple précédent, si on crée une grille sans définir de placement, tous les objets occuperont chacun une cellule de la grille. Par défaut, les objets sont placés au fur et à mesure sur les lignes horizontales de la grille. Si on a créé des lignes supplémentaires avec `grid-template-rows`, les objets suivants seront placés sur ces lignes. En revanche, si la grille ne possède pas suffisamment de lignes sur la grille explicite, de nouvelles lignes, implicites, seront créées. +Comme on peut le voir dans l'exemple précédent, si on crée une grille sans définir de placement, tous les objets se placeront chacun sur une cellule de la grille. Par défaut, les objets sont placés au fur et à mesure sur les lignes horizontales de la grille. Si on a créé des lignes supplémentaires avec `grid-template-rows`, les objets suivants seront placés sur ces lignes. En revanche, si la grille ne possède pas suffisamment de lignes sur la grille explicite, de nouvelles lignes, _implicites_, seront créées. ### Dimensionner les lignes de la grille implicite Par défaut, les lignes implicites créées automatiquement ont une taille automatique. Autrement dit, elles seront dimensionnées pour contenir les éléments qu'elles doivent placer sans que ceux-ci dépassent. -Il est toutefois possible de contrôler la taille de ces lignes grâce à la propriété `grid-auto-rows`. Ainsi, si on veut que les lignes créées automatiquement mesurent 100 pixels de haut, on utilisera : +Il est toutefois possible de contrôler la taille de ces lignes grâce à la propriété `grid-auto-rows`. Ainsi, si on veut que les lignes créées automatiquement mesurent 100 pixels de haut, on utilisera : ```css hidden * { @@ -100,11 +102,11 @@ Il est toutefois possible de contrôler la taille de ces lignes grâce à la pro } ``` -{{EmbedLiveSample('Dimensionner_les_lignes_de_la_grille_implicite', '500', '330')}} +{{EmbedLiveSample('', '500', '330')}} -### Dimensionner les lignes avec minmax() +### Dimensionner les lignes avec `minmax()` -On peut utiliser la fonction {{cssxref("minmax","minmax()")}} pour la valeur de {{cssxref("grid-auto-rows")}} afin de créer des lignes avec une taille minimale mais qui puissent être plus grandes si le contenu est plus grand que cette taille minimale. +On peut utiliser la fonction [`minmax()`](/fr/docs/Web/CSS/minmax) pour la valeur de [`grid-auto-rows`](/fr/docs/Web/CSS/grid-auto-rows) afin de créer des lignes avec une taille minimale mais qui puissent être plus grandes si le contenu est plus grand que cette taille minimale. ```css hidden * { @@ -148,11 +150,11 @@ On peut utiliser la fonction {{cssxref("minmax","minmax()")}} pour la valeur de } ``` -{{EmbedLiveSample('Dimensionner_les_lignes_avec_minmax', '500', '330')}} +{{EmbedLiveSample('', '500', '330')}} ### Dimensionner les lignes avec une liste de pistes -On peut aussi passer en argument une liste de pistes qui se répèteront. Dans l'exemple ci-après, on crée une piste implicite pour une ligne de 100 pixels et une seconde de `200px`. Ce motif sera utilisé tant que du contenu sera ajouté à la grille implicite. +On peut aussi passer en argument une liste de pistes qui se répèteront. Dans l'exemple ci-après, on crée une piste implicite pour une ligne de 100 pixels et une seconde de 200 pixels. Ce motif sera utilisé tant que du contenu sera ajouté à la grille implicite. ```css hidden * { @@ -196,11 +198,11 @@ On peut aussi passer en argument une liste de pistes qui se répèteront. Dans l } ``` -{{EmbedLiveSample('Dimensionner_les_lignes_avec_une_liste_de_pistes', '500', '330')}} +{{EmbedLiveSample('', '500', '480')}} -### Utiliser le placement automatique pour les colonnes +### Utiliser le placement automatique avec les colonnes -On peut également paramétrer la grille pour que les objets soient placés automatiquement en suivant les colonnes de la grille. Pour obtenir ce résultat, on utilisera la propriété {{cssxref("grid-auto-flow")}} avec la valeur `column`. Dans ce cas, la grille ajoutera les objets dans les lignes verticales définies avec {{cssxref("grid-template-rows")}}. Lorsqu'une colonne sera pleine, les prochains objets seront placés dans la colonne explicite suivante ou dans une colonne implicite créée automatiquement s'il n'y a plus assez de colonnes explicites. La taille des pistes pour les colonnes implicites peut être définie avec {{cssxref("grid-auto-columns")}}, cette dernière fonctionne de façon analogue à {{cssxref("grid-auto-rows")}}. +On peut également paramétrer la grille pour que les objets soient placés automatiquement en suivant les colonnes de la grille. Pour obtenir ce résultat, on utilisera la propriété [`grid-auto-flow`](/fr/docs/Web/CSS/grid-auto-flow) avec la valeur `column`. Dans ce cas, la grille ajoutera les objets dans les lignes verticales définies avec [`grid-template-rows`](/fr/docs/Web/CSS/grid-template-rows). Lorsqu'une colonne sera pleine, les prochains objets seront placés dans la colonne explicite suivante ou dans une colonne implicite créée automatiquement s'il n'y a plus assez de colonnes explicites. La taille des pistes pour les colonnes implicites peut être définie avec [`grid-auto-columns`](/fr/docs/Web/CSS/grid-auto-columns), cette dernière fonctionne de façon analogue à [`grid-auto-rows`](/fr/docs/Web/CSS/grid-auto-rows). Dans le prochain exemple, on crée une grille avec trois lignes qui mesurent chacune 200 pixels de haut. On utilise le placement automatique en colonne. La première colonne qui sera créée mesurera 300 pixels de large, ensuite on aura une colonne de 100 pixels de large et ainsi de suite jusqu'à ce que tous les éléments puissent être placés. @@ -247,19 +249,19 @@ Dans le prochain exemple, on crée une grille avec trois lignes qui mesurent cha
``` -{{EmbedLiveSample('Utiliser_le_placement_automatique_pour_les_colonnes', '500', '640')}} +{{EmbedLiveSample('', '500', '640')}} ## L'ordre des éléments placés automatiquement -Une grille peut contenir un mélange d'éléments. Certains éléments peuvent avoir une position définie et d'autres être placés automatiquement. Ce placement automatique peut s'avérer utile lorsque l'ordre des éléments dans le document est celui qu'on veut utiliser pour organiser la grille : il n'y a alors pas besoin d'écrire de règles CSS pour positionner les éléments un par un. La spécification détaille exhaustivement [l'algorithme de placement des objets sur la grille](https://drafts.csswg.org/css-grid/#auto-placement-algo), mais voyons ici les quelques règles simples qu'il faut principalement retenir. +Une grille peut contenir un mélange d'éléments. Certains éléments peuvent avoir une position définie et d'autres être placés automatiquement. Ce placement automatique peut s'avérer utile lorsque l'ordre des éléments dans le document est celui qu'on veut utiliser pour organiser la grille : il n'y a alors pas besoin d'écrire de règles CSS pour positionner les éléments un par un. La spécification détaille exhaustivement [l'algorithme de placement des objets sur la grille](https://drafts.csswg.org/css-grid/#auto-placement-algo), mais voyons ici les quelques règles simples qu'il faut principalement retenir. ### Modification de l'ordre du document -Le placement des éléments qui n'ont pas eu d'ordre défini sont placés selon l'algorithme décrit dans la section _"order modified document order"_. Cela signifie que si on utilise uniquement la propriété `order`, les éléments seront placés selon cet ordre plutôt que selon l'ordre indiqué par le DOM. Sinon, l'ordre des éléments sera celui décrit par le document source. +Le placement des éléments qui n'ont pas eu d'ordre défini sont placés selon l'algorithme décrit dans la section _« order modified document order »_. Cela signifie que si on utilise uniquement la propriété `order`, les éléments seront placés selon cet ordre plutôt que selon l'ordre indiqué par le DOM. Sinon, l'ordre des éléments sera celui décrit par le document source. ### Les éléments avec des propriétés de placement -La grille commencera par placer les éléments pour lesquels on a défini une position. Dans l'exemple qui suit, on a une grille avec 12 éléments, l'élément 2 et l'élément 5 sont placés en utilisant les lignes. On put voir comment ces deux éléments sont placés et comment les autres sont placés automatiquement dans les espaces restants. Les objets placés automatiquement seront placés avant les éléments qui sont placés, dans l'ordre du DOM. +La grille commencera par placer les éléments pour lesquels on a défini une position. Dans l'exemple qui suit, on a une grille avec 12 éléments, l'élément 2 et l'élément 5 sont placés en utilisant les lignes. On peut voir comment ces deux éléments sont placés et comment les autres sont placés automatiquement dans les espaces restants. Les objets placés automatiquement seront placés avant les éléments qui sont placés, dans l'ordre du DOM, ils ne commencent pas après la position d'un élément placé qui les précède. ```css hidden * { @@ -315,13 +317,13 @@ La grille commencera par placer les éléments pour lesquels on a défini une po } ``` -{{EmbedLiveSample('Les_éléments_avec_des_propriétés_de_placement', '500', '450')}} +{{EmbedLiveSample('', '500', '450')}} ### Gérer les éléments qui s'étalent sur plusieurs pistes -On peut utiliser les propriétés de placement tout en tirant parti du placement automatique. Dans le prochain exemple, on complète la disposition en indiquant que les éléments 1, 4 et 9 (4n+1) doivent occuper deux pistes, pour les colonnes et pour les lignes. Pour obtenir ce résultat, on utilise les propriétés {{cssxref("grid-column-end")}} et {{cssxref("grid-row-end")}} avec la valeur `span 2`. La ligne de début sera déterminée automatiquement et la ligne de fin sera deux pistes plus loin. +On peut utiliser les propriétés de placement tout en tirant parti du placement automatique. Dans le prochain exemple, on complète la disposition en indiquant que les éléments 1, 5 et 9 (4n+1) doivent occuper deux pistes, pour les colonnes et pour les lignes. Pour obtenir ce résultat, on utilise les propriétés [`grid-column-end`](/fr/docs/Web/CSS/grid-column-end) et [`grid-row-end`](/fr/docs/Web/CSS/grid-row-end) avec la valeur `span 2`. La ligne de début sera déterminée automatiquement et la ligne de fin sera deux pistes plus loin. -On peut voir coment cela laisse des espaces dans la grille car lorsqu'un élément placé automatiquement n'a pas suffisamment de place sur une piste, une nouvelle ligne sera créée jusqu'à ce que l'élément ait la place. +On peut voir comment cela laisse des espaces dans la grille, car lorsqu'un élément placé automatiquement n'a pas suffisamment de place sur une piste, une nouvelle ligne sera créée jusqu'à ce que l'élément ait la place. ```css hidden * { @@ -381,15 +383,15 @@ On peut voir coment cela laisse des espaces dans la grille car lorsqu'un éléme } ``` -{{EmbedLiveSample('Gérer_les_éléments_qui_sétalent_sur_plusieurs_pistes', '500', '770')}} +{{EmbedLiveSample('', '500', '770')}} ### Combler les espaces -En dehors des éléments placés explicitement, la grille place les éléments automatiques en respectant l'ordre du DOM. C'est généralement le résultat qu'on souhaite lorsqu'on met en forme un document comme un formulaire. Toutefois on veut parfois obtenir une disposition plus dense, sans vide entre les différents éléments. +En dehors des éléments placés explicitement, la grille place les éléments automatiques en respectant l'ordre du DOM. C'est généralement le résultat qu'on souhaite lorsqu'on met en forme un document comme un formulaire (on ne voudrait pas que les libellés et les champs soient mélangés pour combler certains trous). Toutefois, on dispose parfois des éléments pour lesquels l'ordre logique n'a pas d'importance et où on veut obtenir une disposition plus dense, sans vide entre les différents éléments. -Pour cela, sur le conteneur, on ajoute la propriété {{cssxref("grid-auto-flow")}} avec la valeur `dense`. C'est la même propriété qu'on utilise pour modifier l'ordre du flux avec `column`. On peut aussi obtenir une disposition dense, rangée par colonne en utilisant les deux valeurs pour la propriété : `grid-auto-flow: column dense`. +Pour cela, sur le conteneur, on ajoute la propriété [`grid-auto-flow`](/fr/docs/Web/CSS/grid-auto-flow) avec la valeur `dense`. C'est la même propriété qu'on utilise pour modifier l'ordre du flux avec `column`. On peut aussi obtenir une disposition dense, rangée par colonne en utilisant les deux valeurs pour la propriété : `grid-auto-flow: column dense`. -Avec cette valeur, la grille cherchera donc à combler les espaces qu'elle a laissés quitte à ne pas respecter l'ordre du DOM. En revanche, l'ordre de la navigation au clavier (_tab order_) suivra toujours l'ordre du document. Nous étudierons cet aspect plus en détails dans [un article sur l'accessibilité](/fr/docs/Web/CSS/CSS_Grid_Layout/Les_grilles_CSS_et_l_accessibilité). +Avec cette valeur, la grille cherchera donc à combler les espaces qu'elle a laissés, quitte à ne pas respecter l'ordre du DOM. Cela ne modifiera pas l'ordre logique des éléments. Par exemple, l'ordre de la navigation au clavier suivra toujours l'ordre du document. Nous étudierons cet aspect plus en détails dans [un article sur l'accessibilité](/fr/docs/Web/CSS/CSS_grid_layout/Grid_layout_and_accessibility). Pour résumer, il faut faire attention quand on détache l'ordre visuel de l'ordre d'affichage. ```css hidden * { @@ -450,80 +452,34 @@ Avec cette valeur, la grille cherchera donc à combler les espaces qu'elle a lai } ``` -{{EmbedLiveSample('Combler_les_espaces', '500', '730')}} +{{EmbedLiveSample('', '500', '730')}} ### Les éléments anonymes de la grille -Dans la spécification, on utilise le concept d'élément anonyme. Ces éléments sont ceux qui sont créés lorsqu'on a une chaîne de caractères dans le conteneur de la grille et que celle-ci n'est pas contenue dans un autre élément. Dans l'exemple ci-après, on a trois éléments sur la grille : le premier est un élément anonyme car il n'est placé dans aucun élément, il sera alors placé automatiquement. Les deux éléments suivants sont placés dans des `div` et peuvent être placés automatiquement ou grâce à une autre méthode de positionnement. +Dans la spécification, on utilise le concept d'élément anonyme. Ces éléments sont ceux qui sont créés lorsqu'on a une chaîne de caractères dans le conteneur de la grille et que celle-ci n'est pas contenue dans un autre élément. Dans l'exemple ci-après, on a trois éléments sur la grille : -```css +- Le premier est un élément anonyme, car il n'est placé dans aucun élément, il sera alors placé automatiquement. +- Les deux éléments suivants sont placés dans des `div` et peuvent être placés automatiquement ou grâce à une autre méthode de positionnement. + +```html
- Je suis une chaîne de caractères et je serai placé - automatiquement. + Je suis une chaîne de caractères et je serai placée automatiquement.
Un élément de la grille
Un élément de la grille
``` -Les éléments anonymes sont toujours placés automatiquement car on ne peut pas les cibler autrement. Aussi, si on a du texte sans balise dans la grille, il faut se rappeler que celui-ci peut être placé à un endroit imprévu du fait des règles de placement automatique. +Les éléments anonymes sont toujours placés automatiquement, car on ne peut pas les cibler autrement. Aussi, si on a du texte sans balise dans la grille, il faut se rappeler que celui-ci peut être placé à un endroit imprévu du fait des règles de placement automatique. ### Les cas d'utilisation pour le placement automatique -Le placement automatique peut être utile lorsqu'on a un ensemble d'objets qui se ressemblent. Ce peut être des éléments qui n'ont pas d'ordre logique particulier : une galerie de photos, une liste de produits. Dans ces cas de figure, on peut choisir d'utiliser une disposition dense afin de combler les trous de la grille. Dans l'exemple qui représente la galerie d'images, on a certaines images en paysage et d'autres en portrait (lorsqu'on utilise la classe `landscape` l'élément s'étend sur deux colonnes). On utilise ensuite `grid-auto-flow: dense` afin de créer une grille dense. - -```css -.wrapper { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); - grid-gap: 10px; - grid-auto-flow: dense; - list-style: none; - margin: 1em auto; - padding: 0; - max-width: 800px; -} -.wrapper li { - border: 1px solid #ccc; -} -.wrapper li.landscape { - grid-column-end: span 2; -} -.wrapper li img { - display: block; - object-fit: cover; - width: 100%; - height: 100%; -} -``` - -```html -
    -
  • placeholder
  • -
  • - placeholder -
  • -
  • - placeholder -
  • -
  • - placeholder -
  • -
  • placeholder
  • -
  • placeholder
  • -
  • - placeholder -
  • -
  • placeholder
  • -
  • placeholder
  • -
  • placeholder
  • -
-``` +Le placement automatique peut être utile lorsqu'on a un ensemble d'objets qui se ressemblent. Ce peut être des éléments qui n'ont pas d'ordre logique particulier : une galerie de photos, une liste de produits. Dans ces cas de figure, on peut choisir d'utiliser une disposition dense afin de combler les trous de la grille. Dans l'exemple qui représente la galerie d'images, on a certaines images en paysage et d'autres en portrait (lorsqu'on utilise la classe `landscape` l'élément s'étend sur deux colonnes). On utilise ensuite `grid-auto-flow: dense` afin de créer une grille dense. -{{EmbedLiveSample('Les_cas_dutilisation_pour_le_placement_automatique', '500', '1300')}} +Dans l'exemple qui suit, retirez la ligne `grid-auto-flow: dense` pour voir la réorganisation du contenu et les espaces que cela crée. -Le placement automatique peut également aider à disposer des éléments d'interface utilisateur qui ont un ordre logique. Dans l'exemple suivant, on voit comment manipuler les listes de définition. Les listes de définition sont intéressantes car il n'y a pas de niveau de regroupement pour regrouper un terme et ses définitions. Dans cet exemple, on autorise le placement automatique mais on a une classe pour qu'un élément `dt` démarre sur la première ligne et que l'élément `dd` sur la ligne 2. On s'assure ainsi que les termes sont bien en face de chaque définition, peu importe le nombre de définitions qu'on a pour un terme. +{{EmbedGHLiveSample("css-examples/grid/docs/autoplacement.html", '100%', 1200)}} -### Autre exemple +Le placement automatique peut également aider lorsqu'on dispose des éléments d'interface sans ordre logique. Dans l'exemple qui suit, on a une liste de définitions. Dans une telle liste, rien ne regroupe particulièrement plusieurs éléments `
` et `
`. Ici, on autorise le placement automatique tout en utilisant des classes pour que les `
` soient dans la colonne 1 et les `
` dans la colonne 2. On s'assure ainsi que les termes et leurs définitions seront bien l'un en face de l'autre, quel que soit le nombre de définitions pour un terme. ```css hidden * { @@ -540,15 +496,15 @@ Le placement automatique peut également aider à disposer des éléments d'inte ```html
-
Mammals
-
Cat
-
Dog
-
Mouse
-
Fish
-
Guppy
-
Birds
-
Pied Wagtail
-
Owl
+
Mammifères
+
Chat
+
Chien
+
Souris
+
Poisson
+
Poisson rouge
+
Oiseaux
+
Bergeronnette
+
Hiboux
``` @@ -570,14 +526,10 @@ dd { } ``` -{{EmbedLiveSample('Autre_exemple', '500', '230')}} - -> **Note :** Voir [cet article de SitePoint](https://www.sitepoint.com/understanding-masonry-layout/) à propos de la disposition en briques pour d'autres cas d'utilisation. - -## Qu'est-ce que le placement automatique ne permet pas de réaliser (actuellement) ? +{{EmbedLiveSample('', '500', '230')}} -Certaines questions se posent encore. Actuellement on ne peut pas cibler toutes les autres cellules de la grille. On ne peut pas non plus définir une règle pour « placer tous les éléments automatiquement après la prochaine ligne intitulée `n` » (pour que certaines lignes soient sautées). Cette question [est décrite sur le dépôt GitHub du CSSWG](https://github.com/w3c/csswg-drafts/issues/796), n'hésitez pas à ajouter vos exemples de scénarios. +## Qu'est-ce que le placement automatique ne permet pas de réaliser (actuellement) ? -Si vous rencontrez des cas d'utilisation problématiques avec le placement automatique et les grilles, vous pouvez consulter les _issues_ existantes et les compléter ou ajouter les vôtres. Cela permettra que les prochaines versions de la spécification soient meilleures. +Certaines questions se posent encore. Actuellement on ne peut pas cibler toutes les autres cellules de la grille. On ne peut pas non plus définir une règle pour « placer tous les éléments automatiquement après la prochaine ligne intitulée `n` » (pour que certaines lignes soient sautées). Cette question [est décrite sur le dépôt GitHub du CSSWG](https://github.com/w3c/csswg-drafts/issues/796), n'hésitez pas à ajouter vos exemples de scénarios. -{{PreviousMenuNext("Web/CSS/CSS_Grid_Layout/Utiliser_des_lignes_nommées_sur_une_grille", "Web/CSS/CSS_Grid_Layout/Alignement_des_boîtes_avec_les_grilles_CSS","Web/CSS/CSS_Grid_Layout")}} +Si vous rencontrez des cas d'utilisation problématiques avec le placement automatique et les grilles, vous pouvez consulter les issues existantes et les compléter ou ajouter les vôtres. Cela permettra que les prochaines versions de la spécification soient meilleures. From 5adfed8c0b349fa2ca14a491912e09bc0aee9c1b Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Wed, 20 Sep 2023 13:03:05 +0200 Subject: [PATCH 044/268] Fix #15129 (#15928) Update and fix #15129 --- .../8-horizontal-tb.png | Bin 0 -> 5691 bytes .../index.md | 113 +++++++++++------- 2 files changed, 71 insertions(+), 42 deletions(-) create mode 100644 files/fr/web/css/css_grid_layout/grids_logical_values_and_writing_modes/8-horizontal-tb.png diff --git a/files/fr/web/css/css_grid_layout/grids_logical_values_and_writing_modes/8-horizontal-tb.png b/files/fr/web/css/css_grid_layout/grids_logical_values_and_writing_modes/8-horizontal-tb.png new file mode 100644 index 0000000000000000000000000000000000000000..4b833aa98e54b4edea3262ce68f0d4a9e9f6b996 GIT binary patch literal 5691 zcmds5i96KY+aF1`7$WPSs4SDGgbYGOSsTQRq}3>qWd>sxF=4`3vZTgdXlz-trLmMG zgU31}3}fH-UEg;+J@4;*uj~B}-s?KoIrsOR`~IB!+~@wB`?|h(Gq^qvmlzia1mZC? z(7Oo&9fE;CEJzMk=8VN>VRsOS6=Y^&c?|#nssR{}$FKG0GM6^(*#iRufwc*sKNt9L zLtkH?YJ&v&BPVUZK%Tj;uP;A8zqhydvuDo+4ZtBGAz@)*9v&Vz94;av!q3kSgTW98 z1S$qSH#a9EBNG%91k@rM8yh=1I(&S592^`}R8)ZWM4&$hD6s`r#{iNkP=^HyEP>9n zc?_6`hX?o`1x&W?_vdR12K-i5R#UaPJ52Zb-_Z;N zfhvoYm6i4GT&l59d3ia||8{nE_Vw%6%gf6H24EoT(s+3;@Gb1fks|;J&M*THc{&Xm z@dL{vgM))W&ugF$2mC}gG&F2FgQ%QK`Jh!0@U>rwJUFC(dzCcjL;w42(a zS-C@aJkXzMW@bh;kp%X3r>fqq;icy>B2zB1qekEXe_x;nKWHXEy=x8hC;qyn2z0$& z$uj-r{&b~3ce^K-Zo*Hu;G6Hy9ga&JM}l{fm8VfW)SKrQzGbeoW^QL_3>fhZ`1p=` zT&5am?$x;s8-W*tWa+mA7$4p*_@5d!l%%z2R#rUUmDMtCRN5$I2)KD;|y|85YaK5i?sU4fc$5?|@b9SjPd zY0m{3?@ihsA4|m143z0_Q-9ebfp!OgY(0;WTTj!Uao}UPD$Kd?Z5JZP9ze!R-_h=v z)A4~56&b7T?-=ihjI@}kirnE~k9qw4k^91oXrEz(0MJFCn#fQsV1qWuF;etOuq4nE zvr~F=qAGWioI80Jy#GO$o=BJ^1nj(3-6B1n#;XE7=+UfqYdx`mw;EodNZ!!zfl|gLG%u-)?(* zd#W*atNk5Nb%%E6%A`MPzdd5w2RVv;2z)f8$Kl6foMw}d8}TYsBb~`Cf@1Od2N3Ak zhN0dSOK;lTAZLuAl_>kt^hDc*F0zUErPzf>XS)2(%@t-+;18^=f2m$E5P2YMXdv_= z1_ufi3Bg}IeDtvU>szOe{guEct$;U-6qAu$CTtcMs&FDcSSlnU?janl>o%(=r>J+c zhu4T&K#^k@mFhe*+xKOA=W}0?eSr4iL(eat;N$o+gkR7LZsHn#EjJ;Yxgc%mfnbH; zo*a$4a?Fd3-8?BnT)PJZ!9CDxNk39`juzV62+VP?m_Z!W0nO z)lYQv-(TX&B^sV)oS6#ASeXocV-mxH#2%{^I-Nfp>wp+dIY|mWE=z(6^KND*|ErAR zpOir5`9V%=aIPu{sz$_O#jHPu4)a z*!C(RJ9FlAG_@0S7Bx5SA_zdCM1R;!ny1Sl)u-=g}ns-%mHx7AD2})=>eM`mD zx_jxtIqxI#EE2DHxCluM(Py{_BiXM<*qXbPLIjiGZ+N)iTJc2N&K6tUR2PrqMV{hC z?&7W#fua^+*EWHY0q@TP-o|y_jHYF2c`*qMkZibbq*ql2>qYF1$zNWT>0KNeSg}Qd zP;qn@x);{$TwDJLxB9ipXB4qLdc%cL?!s{Pu?>yzF7|dhPa972lPSc%Oo2>ID2aZ)y9@xlPR#kAkparM2 zx_LQ>mbeiU^1K(qfy;Hlx(29)2zId4{GGo$hq@uTw^Y>1z0OYm^pPr;hBjMQMP`M8 zC!jDprxtaU75|SYOnO6crA)u`@LLzVaTqjddG32gEt|bl%W`yWN3UeAciAT_bu*jW zTAlL4S;xL9?GrsxQTPwiH~CI7-AE9GqkN~WWauCQ3bvm-p0N?f3JY?-2#d0g zh!+v^hQk!~P%H04lEr{{gW17#W5gl$(&!MV7ASO^+qZwupbQd&Om=Ol8k zUGl(+oWW+l|FI=3F2ke5h?fqc;Lu{d;G7xWBGtxOaVFMEgQysV`0=b#qizr@j8cf8 z($k}vTmPqp=pO#(DZ=1nGz-&*2eH^} zB{zn}FlBFQE6LOFJ1HG_|^1UK~mDs)p?rB5+L8&hn zUd_X1VI7NB(MEA9o3$lm`AbkFyAfOS4Wwy-)`%jkG`oG@ft2l%^mxN0Wn)rDB5Oa% zc%q<&VTf1#Mk!ZQ{PN;i+U^nPX<|dEE!qf6a*OTx;hdw@tFC?j_IhdeD)sMpLyMdO z-{91Y&5|G04>X)3!(4V1G)2|~?_P(!us_a0tex^Ge}tWv$$DG32_c$1R1*(bTo!Xs z^9$?zwl(%himp>#R*U9pdzmVz#|>{OeWMYTS}8fas0vHAz#vgeYJ9Gd)HqS)R_>gR z{6n&R3q^JLZx%!oJU6|$D8e~8&G=QRS1zXW%lRg#cQ)yfXs&k0)c{k=hsZX|KEP#3 z5TbFjvfJ0U@1}1FT@pGB5deb%GT6D?aSQN%> z@#~j4&a;89qXfN&i+(9LAF?jcY*eG|MQi5CL-TH@tkB9yQp3Z35?_9=uzF(AGwpsw zyE`j3-r!ei-}Y4F%9a>epW3;HRs_xk&~f;2UIu{y7IA?@vC$4K&?ejW7gZ`Fzc9qPuu>)Jbg zkt+ABYjwPLFC$H@L*96pW+{}=_S8w!<4JeEv^YLF*_S^J7WBd!nkSm{JVmOqO@1R? z(pyhP@YGwQ2iOqa;WMgvV$WCc&fuZ4i8vpGXZVadb3(VqBPnop=W>EXrZ0udOP&4~ zJDCMSu0MGQaxh*&{!7UJ!$$Tnj(=FmZq34^_d(<3|1*~SF=c^3qz@oiAa-p3i`Gnj z|A*0kc>Ui!I{XjOV~+p9q0{;PK%apA!THxKqHR6CqsUtj4btZzJf2#MjS*o!NE}2F z(Rb0EBC*WZ=P*52Y4!Lub_kh2NEgZjPGXW^9WNGL444& z5=;>hV?untL=fub>}(VZWdwyJqsa2?L=GP2)>mNszS)_RBo?O34>QjUWh{R*%47!S z5c-&7{I0nGQX_Ph(1Fk83U?XMXe=x9GOU_ea>kA~SF^z)#aBT3`OyMORv_L( zymT0@vCu_9!Q4*$iiZj45PT#Fa3Yl2I}SBZL;UCIgQq&0#A{&X^qu#wG`TJ!cTO*7G>g64I^ zTD_fg6@BL1?9qxBSL_Wg$s@_4XvRe4R`>09+rre`E4wQzrs!*_W3 zVVxf{x5iGgkhHwO_9<1fI(0KLCdAavO8qn8s-2}8<%q%bg(KfeIPjcPt1j5 zc-sk)lSi4?#Ak~Zv;py6MYk1SsZm#;pU{IN_@$rj{b&RwBI2NQOf; z`GJ=k>ES;KXPD3=II3*GEVKGc;NH>!)Pah!^%}T0XL0N>ge*TL^nj^28F;t}hoW1u z!E6IRYV*HG+wIl+lKI66%|A6IY()sHg#N=1P9<6&6j>SHmMg3W?8tgD0cG9tLj=jF zK&;sP{fjl2In|Lu)Zi=)I}B$|cQY}&OIpXhXy6(tP<<>Mqj|Z3+l*}ayqi1giO>vN=Lz$y_s64ecRM=A z`9kGv+4#)J4WS4`=V9F%vk=66r@;|4_FEg7TNHerju zN>E-Y{+>>#`w_wJqw^dAug>C7g``a5whKHj$fBIYQ*9>J#AOPmWhYpb#$TIXdvinX zjOUV2+m77Q`#7E(z4c1gJuhZ$wn<_Md5oD9(5s{8+!l_5bvjn3#Ftk@vxF3(eV@B4 z&$Md5&g4~>y;7yf5fR&gb}E>}A;mqZjZJaxR7;yRMn*uXaLfCzw6uF~G6{h2TiniG zg=3ZfRMy{a`;l0*39>xjf1?F(d#-Gx*}UC(1f6|)EMUU#))!-wmMHxG_~fhhMFA*R zpJaf3t|HB*G-ov3zffn+_+qzuK?tgZ6sTr=O*I;1FGxR|44FK?LwW;M(Am_X98|S8<`VV=#hf(I$v&blX@t6 zp~iSvx&RFQ`gsO(&StG+rhsOg=b;#P-x6-j47$;cufEIT_6V6^20Xs;jQp^-l)VeN za`+ENh4O{?K+=}SnT`J5R2ABt|uHmMt8{})24ma-dAch42M;* z>1sGHdfr6gQ zjcBboNOXfXCDLpcc0D-}-5VPC{ZRmdZ0>*GI(uZU>@+cjEc)sxVnOc}`msc+y)LZR zijBzsD>m=Zu7w}6P_9grSp0ztCKFUTjWOTty;!qfywh*V23cU?fY3qgFft1-I*9fE zjo5qyZ8W$~uQYznN{kVZt@}|B!YF)cKMImnA^y$An?L{)YJL=_3&O~v4PvtQ;y$=N zMV}H6Yitx_hv`0-(I@;YstbJ1%8ZMWM&1hS5Mv~t3#J>=rR?U<31J3{FrrPck9p1v zm`DSsh04X!dQuG)At>g(3GX9aV&#Q!%6?6N{1!T0 zb92r0TPos)9;_}_Km{FduvlKUw)9C(OVI{+T;goqQ)xo#+nTAgPk)}};azn7(NC~f z*o3{__|)(XCY)GO)!e+m$trczTX;tcBeOz6A@9Z9$ppD zllt%_vN=tH$U4~1ohRNo=647%rb-s$H z6(S8=D5CW5@V1tUhX{sqfO}O9bY)B9bock=H6SCtYkK{99H(f}C*?A6bvGmSt?BBD z4PNbf{2RhXMU0E!>3b)e^o+JSI8NgDuKuUHkiQ4svDvjWoxJyq`R5m8cnz*sc=bW> Fe*v>8?GFF| literal 0 HcmV?d00001 diff --git a/files/fr/web/css/css_grid_layout/grids_logical_values_and_writing_modes/index.md b/files/fr/web/css/css_grid_layout/grids_logical_values_and_writing_modes/index.md index e44b4acf2fcb58..6d44345c2ae61a 100644 --- a/files/fr/web/css/css_grid_layout/grids_logical_values_and_writing_modes/index.md +++ b/files/fr/web/css/css_grid_layout/grids_logical_values_and_writing_modes/index.md @@ -1,17 +1,17 @@ --- title: Les grilles CSS, les valeurs logiques et les modes d'écriture slug: Web/CSS/CSS_grid_layout/Grids_logical_values_and_writing_modes +l10n: + sourceCommit: f224dbe80c60289cd8b7d2bf92871d091e0f5d0d --- {{CSSRef}} -{{PreviousMenuNext("Web/CSS/CSS_Grid_Layout/Alignement_des_boîtes_avec_les_grilles_CSS", "Web/CSS/CSS_Grid_Layout/Les_grilles_CSS_et_l_accessibilité","Web/CSS/CSS_Grid_Layout")}} - -Dans les articles précédents, nous avons évoqué un aspect important de la disposition en grille : la prise en charge des différents modes d'écriture. Dans ce guide, nous nous intéresserons plus particulièrement à cette fonctionnalité ainsi qu'aux autres méthodes modernes de disposition. Cela sera également l'occasion d'en apprendre plus sur les modes d'écritures et la notion de propriété logique/physique. +Dans les articles précédents, nous avons évoqué un aspect important de la disposition en grille : la prise en charge des différents modes d'écriture. Dans ce guide, nous nous intéresserons plus particulièrement à cette fonctionnalité ainsi qu'aux autres méthodes modernes de disposition. Cela sera également l'occasion d'en apprendre plus sur les modes d'écritures et la notion de propriété logique/physique. ## Les propriétés logiques, les propriétés physiques et les valeurs -CSS possède de nombreux mots-clés qui permettent de positionner **physiquement** les éléments : `left`, `right`, `top`, `bottom`… Si on positionne un élément de façon absolue, on utilisera ces mots-clés physiques comme valeurs pour indiquer le décalage de l'élément. Dans le fragment de code suivant, l'élément est décalé de 20 pixels depuis le haut du conteneur et de 30 pixels depuis le bord gauche du conteneur. +CSS possède de nombreux mots-clés qui permettent de positionner **physiquement** les éléments : `left`, `right`, `top`, `bottom`… Si on positionne un élément de façon absolue, on utilisera ces mots-clés physiques comme valeurs pour indiquer le décalage de l'élément. Dans le fragment de code suivant, l'élément est décalé de 20 pixels depuis le haut du conteneur et de 30 pixels depuis le bord gauche du conteneur. ```css .container { @@ -30,15 +30,48 @@ CSS possède de nombreux mots-clés qui permettent de positionner **physiquement ``` -On rencontre également ces mots-clés physiques avec `text-align: right` afin d'aligner le texte à droite. Il existe aussi des propriétés **physiques** en CSS. On ajoute des marges, du remplissage, des bordures grâces à cs propriétés physiques comme {{cssxref("margin-left")}}, {{cssxref("padding-left")}}, etc. +On rencontre également ces mots-clés physiques avec `text-align: right` afin d'aligner le texte à droite. Il existe aussi des propriétés **physiques** en CSS. On ajoute des marges, du remplissage, des bordures grâces à cs propriétés physiques comme [`margin-left`](/fr/docs/Web/CSS/margin-left), [`padding-left`](/fr/docs/Web/CSS/padding-left), etc. + +On qualifie ces propriétés de physiques, car elles concernent l'écran qu'on regarde : la gauche sera toujours la gauche, quelle que soit la direction du texte. + +### Les problèmes des propriétés physiques + +Cela peut devenir un problème lorsqu'on développe un site qui doit fonctionner avec plusieurs langues dont certaines sont écrites de droite à gauche et non de gauche à droite. Les navigateurs savent plutôt bien gérer les différentes directions d'écriture. Dans l'exemple qui suit, on a deux paragraphes. Pour le deuxième, aucune propriété [`text-align`](/fr/docs/Web/CSS/text-align) n'est utilisée, alors que pour le second, on utilise `text-align` avec `left` et on ajoute `dir="rtl"` sur l'élément HTML ce qui a pour effet de changer la direction d'écriture. On peut voir que, dans le second paragraphe, la direction change et le texte est écrit de droite à gauche. Dans le premier cependant, avec `text-align value: left`, l'alignement reste à gauche. + +```html hidden +

+ Pour ce paragraphe, on a text-align: left, il sera donc toujours + aligné à gauche, même si le sens d'écriture du document va de droite à gauche + (rtl). +

+ +

+ Aucun alignement imposé sur ce paragraphe, il suit la direction du document. +

+``` -On qualifie ces propriétés de physiques car elles concernent l'écran qu'on regarde : la gauche sera toujours la gauche, quelle que soit la direction du texte. +```css hidden +body { + direction: rtl; +} + +p { + border: 2px solid #ffa94d; + border-radius: 5px; + background-color: #ffd8a8; + padding: 1em; + margin: 1em; + color: #d9480f; +} -Cela peut devenir un problème lorsqu'on développe un site qui doit fonctionner avec plusieurs langues dont certaines sont écrites de droite à gauche et non de gauche à droite. Les navigateurs savent plutôt bien gérer les différentes directions d'écriture. Dans l'exemple qui suit, on a deux paragraphes. Pour le deuxième, aucune propriété {{cssxref("text-align")}} n'est utilisée, alors que pour le second, on utilise `text-align` avec `left` et on ajoute `dir="rtl"` sur l'élément HTML ce qui a pour effet de changer la direction d'écriture. On peut voir que, dans le second paragraphe, la direction change et le texte est écrit de droite à gauche. Dans le premier cependant, avec `text-align value: left`, l'alignement reste à gauche. +.left { + text-align: left; +} +``` -![A simple example of text direction.](8_direction_simple_example.png) +{{EmbedLiveSample("","",200)}} -Cela illustre un problème fréquent avec les propriétés et valeurs physiques en CSS : elles empêchent le navigateur de passer correctement d'un mode d'écriture à l'autre. +Cela illustre un problème fréquent avec les propriétés et valeurs physiques en CSS : en supposant que le texte est toujours écrit de gauche à droite et de bas en haut, elles empêchent le navigateur de passer correctement d'un mode d'écriture à l'autre. ### Les propriétés et valeurs logiques @@ -46,17 +79,17 @@ Les propriétés et les valeurs logiques n'émettent pas d'hypothèse quant à l ## L'axe de bloc et l'axe en ligne -Lorsqu'on commence à travailler avec les propriétés logiques plutôt qu'avec les propriétés physiques, on cesse de voir le monde comme un espace qui va de gauche à droite et de haut en bas. Il faut de nouveaux axes de références : l'axe de bloc (_block axis_ en anglais) et l'axe en ligne (_inline axis_). Le premier est l'axe orthogonal au sens d'écriture et le second est l'axe dans lequel on écrit. Ces axes _logiques_ sont très utiles et on comprend mieux leurs rôles sur la grille. +Lorsqu'on commence à travailler avec les propriétés logiques plutôt qu'avec les propriétés physiques, on cesse de voir le monde comme un espace qui va de gauche à droite et de haut en bas. Il faut de nouveaux axes de références : l'axe de bloc (block axis en anglais) et l'axe en ligne (inline axis en anglais). Le premier est l'axe orthogonal au sens d'écriture et le second est l'axe dans lequel on écrit. Ces axes _logiques_ sont très utiles et on comprend mieux leurs rôles sur la grille. -![An image showing the default direction of the Block and Inline Axes.](8-horizontal-tb.png) +![Une image illustrant la direction par défaut pour l'axe de bloc et l'axe en ligne.](8-horizontal-tb.png) ## Les modes d'écriture CSS -Nous allons ici aborder une autre spécification que nous allons utiliser dans nos exemples : la spécification CSS sur les modes d'écriture (_CSS Writing Modes_). Cette spécification régit comment les différents modes d'écriture peuvent être utilisés en CSS, pas seulement pour prendre en charge différentes langues mais aussi pour créer des effets artistiques. Nous allons utiliser la propriété {{cssxref("writing-mode")}} afin de modifier le mode d'écriture appliqué à la grille pour observer comment fonctionnent les valeurs logiques. Si vous souhaitez approfondir ces notions autour des modes d'écriture, vous pouvez consulter l'article [_CSS Writing Modes_ (en anglais)](https://24ways.org/2016/css-writing-modes/) écrit par Jen Simmons. +Nous allons ici aborder une autre spécification que nous allons utiliser dans nos exemples : la spécification CSS sur les modes d'écriture (CSS Writing Modes). Cette spécification régit comment les différents modes d'écriture peuvent être utilisés en CSS, pas seulement pour prendre en charge différentes langues mais aussi pour créer des effets artistiques. Nous allons utiliser la propriété [`writing-mode`](/fr/docs/Web/CSS/writing-mode) afin de modifier le mode d'écriture appliqué à la grille pour observer comment fonctionnent les valeurs logiques. Si vous souhaitez approfondir ces notions autour des modes d'écriture, vous pouvez consulter [l'article CSS Writing Modes (en anglais), écrit par Jen Simmons](https://24ways.org/2016/css-writing-modes/). ### `writing-mode` -Les modes d'écriture ne se limitent pas à l'écriture de droite à gauche ou de gauche à droite, la propriété `writing-mode` nous permet d'afficher du texte dans plusieurs directions. La propriété {{cssxref("writing-mode")}} peut prendre les valeurs suivantes : +Les modes d'écriture ne se limitent pas à l'écriture de droite à gauche ou de gauche à droite, la propriété `writing-mode` nous permet d'afficher du texte dans plusieurs directions. La propriété [`writing-mode`](/fr/docs/Web/CSS/writing-mode) peut prendre les valeurs suivantes : - `horizontal-tb` - `vertical-rl` @@ -64,7 +97,7 @@ Les modes d'écriture ne se limitent pas à l'écriture de droite à gauche ou d - `sideways-rl` - `sideways-lr` -Sur le Web, c'est la valeur `horizontal-tb` qui est la valeur par défaut pour le texte. C'est dans cette direction que vous lisez cet article. Les autres valeurs changeront la façon dont le texte est écrit sur le document et correspondent aux modes d'écriture utilisés dans d'autres langues. Dans l'exemple qui suit, on a deux paragraphes, le premier utilise la valeur par défaut `horizontal-tb` et le second utilise la valeur `vertical-rl`. Dans ce deuxième mode, le texte est toujours écrit de gauche à droite mais la direction du texte est verticale. Dans ce deuxième paragraphe, l'axe en ligne (_inline_) est donc l'axe vertical. +Sur le Web, c'est la valeur `horizontal-tb` qui est la valeur par défaut pour le texte. C'est dans cette direction que vous lisez cet article. Les autres valeurs changeront la façon dont le texte est écrit sur le document et correspondent aux modes d'écriture utilisés dans d'autres langues. Dans l'exemple qui suit, on a deux paragraphes, le premier utilise la valeur par défaut `horizontal-tb` et le second utilise la valeur `vertical-rl`. Dans ce deuxième mode, le texte est toujours écrit de gauche à droite mais la direction du texte est verticale. Dans ce deuxième paragraphe, l'axe en ligne est donc l'axe vertical. ```css hidden .wrapper > p { @@ -89,7 +122,7 @@ Sur le Web, c'est la valeur `horizontal-tb` qui est la valeur par défaut pour l ``` -{{EmbedLiveSample("writing-mode", '500', '420')}} +{{EmbedLiveSample("", '500', '420')}} ## La gestion des modes d'écriture avec une grille @@ -97,7 +130,7 @@ Si on reprend l'exemple avec la grille, on comprend mieux l'effet du changement ### Mode d'écriture par défaut -Dans le prochain exemple, la grille possède trois colonnes et deux lignes. Cela signifie qu'il y a trois pistes qui traversent l'axe de bloc. Avec le mode d'écriture par défaut, la grille commence par placer les objets en haut à gauche en remplissant les trois cellules sur la première ligne avant de passer à la suivante, en formant une nouvelle ligne, etc. +Dans le prochain exemple, la grille possède trois colonnes et deux pistes. Cela signifie qu'il y a trois pistes qui traversent l'axe de bloc. Avec le mode d'écriture par défaut, la grille commence par placer les objets en haut à gauche en remplissant les trois cellules sur la première ligne avant de passer à la suivante, en formant une nouvelle ligne, etc. ```css hidden * { @@ -138,11 +171,11 @@ Dans le prochain exemple, la grille possède trois colonnes et deux lignes. Cela ``` -{{EmbedLiveSample("Mode_d'écriture_par_défaut", '500', '330')}} +{{EmbedLiveSample("", '500', '230')}} -### Définir writing-mode +### Définir le mode d'écriture -Si on ajoute `writing-mode: vertical-lr` au conteneur de la grille, on peut voir que les axes logiques s'appliquent désormais dans une autre direction. L'axe de bloc (aussi appelé l'axe des colonnes pour la grille) s'étend maintenant de gauche à droite et l'axe en ligne court verticalement. +Si on ajoute `writing-mode: vertical-lr` au conteneur de la grille, on peut voir que les axes logiques s'appliquent désormais dans une autre direction. L'axe de bloc (aussi appelé l'axe des colonnes pour la grille) s'étend maintenant de gauche à droite et l'axe en ligne court verticalement, de haut en bas. ```css hidden * { @@ -184,9 +217,7 @@ Si on ajoute `writing-mode: vertical-lr` au conteneur de la grille, on peut voir ``` -{{EmbedLiveSample("Définir_writing-mode", '500', '330')}} - -![A image showing the direction of Block and Inline when writing-mode is vertical-lr](8-vertical-lr.png) +{{EmbedLiveSample("", '500', '330')}} ## L'utilisation de valeurs logiques pour l'alignement @@ -250,25 +281,25 @@ Dans le prochain exemple, on aligne des objets dans une grille pour laquelle `wr ``` -{{EmbedLiveSample("L'utilisation_de_valeurs_logiques_pour_l'alignement", '500', '330')}} +{{EmbedLiveSample("", '500', '240')}} Si vous souhaitez voir l'effet obtenu avec une écriture verticale de haut en bas et de droite à gauche, il suffit de passer de `vertical-lr` à `vertical-rl` pour changer de mode d'écriture. ## Le placement automatique et les modes d'écriture -On a vu dans l'exemple précédent que lorsqu'on changeait de mode d'écriture, cela changeait également la direction selon laquelle les éléments étaient placés sur la grille. Par défaut, les éléments sont placés en progressant sur l'axe en ligne, jusqu'à la fin de la ligne, une nouvelle ligne est ensuite créée si besoin mais cette ligne ne progresse pas nécessairement de gauche à droite. +On a vu dans l'exemple précédent que lorsqu'on changeait de mode d'écriture, cela changeait également la direction selon laquelle les éléments étaient placés sur la grille. Par défaut, les éléments sont placés en progressant sur l'axe en ligne, jusqu'à la fin de la ligne, une nouvelle ligne est ensuite créée si besoin, mais cette ligne ne progresse pas nécessairement de gauche à droite. ## Le placement sur les lignes et les modes d'écriture Il faut garder à l'esprit que lorsqu'on place des objets sur les lignes, la ligne 1 sera toujours la ligne de départ, quel que soit le mode d'écriture et la ligne -1 sera toujours la ligne de fin. -Dans l'exemple suivant, on a une grille avec la direction `ltr` et on positionne trois objets en utilisant le placement sur les lignes. +### Placement sur les lignes pour du texte de gauche à droite -- L'objet 1 commence à la colonne 1 et occupe une piste -- L'objet 2 commence à la colonne -1 et occupe -3 pistes -- L'objet 3 commence à la colonne 1 et s'étend jusqu'à la troisième colonne. +Dans l'exemple suivant, on a une grille avec la direction `ltr` et on positionne trois objets en utilisant le placement sur les lignes. -### Placement sur les lignes pour du texte de gauche à droite +- L'objet 1 commence à la ligne verticale 1 et occupe une piste +- L'objet 2 commence à la ligne verticale -1 (le bord tout à droite) et s'étend jusqu'à la ligne verticale -3 +- L'objet 3 commence à la ligne verticale 1 et s'étend jusqu'à la troisième ligne verticale. ```css hidden * { @@ -317,11 +348,11 @@ Dans l'exemple suivant, on a une grille avec la direction `ltr` et on positionne ``` -{{EmbedLiveSample("Placement_sur_les_lignes_pour_du_texte_de_gauche_à_droite", '500', '330')}} +{{EmbedLiveSample("", '500', '240')}} ### Placement sur les lignes pour du texte de droite à gauche -Si on ajoute alors la propriété {{cssxref("direction")}} avec la valeur `rtl` pour le conteneur de la grille, la colonne 1 sera la plus à droite et la colonne 1 sera à gauche. +Si on ajoute alors la propriété [`direction`](/fr/docs/Web/CSS/direction) avec la valeur `rtl` pour le conteneur de la grille, la colonne 1 sera la plus à droite et la colonne -1 sera à gauche. ```css hidden * { @@ -371,29 +402,29 @@ Si on ajoute alors la propriété {{cssxref("direction")}} avec la valeur `rtl` ``` -{{EmbedLiveSample("Placement_sur_les_lignes_pour_du_texte_de_droite_à_gauche", '500', '330')}} +{{EmbedLiveSample("", '500', '240')}} -On voit ici que si on change la direction du texte pour la page ou pour une partie de la page : la disposition change selon lees numéros de lignes. Si on ne veut pas que les lignes bougent, on pourra utiliser des lignes nommées pour éviter cet effet. +On voit ici que si on change la direction du texte pour la page ou pour une partie de la page, la disposition change selon les numéros de lignes. Si on ne veut pas que les lignes bougent, on pourra utiliser des lignes nommées pour éviter cet effet. ### L'étrange ordre des valeurs pour `grid-area` -La propriété {{cssxref("grid-area")}} permet d'indiquer les quatre lignes qui définissent une zone. Lorsqu'on apprend à utiliser cette propriété, on se surprend à voir que les quatre valeurs ne suivent pas le même ordre que celui utilisé par les propriétés raccourcies pour les marges (pour celles-ci, les valeurs suivent le sens horaire : haut, droit, bas, gauche). +La propriété [`grid-area`](/fr/docs/Web/CSS/grid-area) permet d'indiquer les quatre lignes qui définissent une zone. Lorsqu'on apprend à utiliser cette propriété, on se surprend à voir que les quatre valeurs ne suivent pas le même ordre que celui utilisé par les propriétés raccourcies pour les marges (pour celles-ci, les valeurs suivent le sens horaire : haut, droit, bas, gauche). -Pour les valeurs de `grid-area`, l'ordre est le suivant : +Pour les valeurs de `grid-area`, l'ordre est le suivant : - `grid-row-start` - `grid-column-start` - `grid-row-end` - `grid-column-end` -Si on transpose ces valeurs à un système d'écriture de gauche à droite, cela correspond aux valeurs physiques suivantes : +Si on transpose ces valeurs à un système d'écriture de gauche à droite, cela correspond aux valeurs physiques suivantes : - `top` - `left` - `bottom` - `right` -Ce qui correspond… au sens anti-horaire ! L'ordre est l'inverse de celui utilisé pour les marges et le remplissage. Pour comprendre, mieux vaut voir la propriété `grid-area` comme une propriété logique qui fonctionne selon les axes de bloc et en ligne : on commence donc avec les deux lignes de départ puis les deux lignes d'arrivée. Cet ordre est plus « logique » ! +Ce qui correspond… au sens anti-horaire ! L'ordre est l'inverse de celui utilisé pour les marges et le remplissage (padding). Pour comprendre, mieux vaut voir la propriété `grid-area` comme une propriété logique qui fonctionne selon les axes de bloc et en ligne : on commence donc avec les deux lignes de départ puis les deux lignes d'arrivée. Cet ordre est plus « logique » ! ## Utiliser des modes d'écriture hybrides et les grilles CSS @@ -455,11 +486,11 @@ Les modes d'écritures permettent d'afficher les documents en respectant les rè ``` -{{EmbedLiveSample("Utiliser_des_modes_d'écriture_hybrides_et_les_grilles_CSS", '500', '330')}} +{{EmbedLiveSample("", '500', '280')}} ## Les valeurs physiques et les grilles CSS -On rencontre souvent les propriétés physiques lorsqu'on construit un site web et, bien que la grille et les propriétés logiques permettent de respecter les modes d'écriture, il existe certains effets qui ne peuvent être obtenus qu'avec des propriétés et des valeurs physiques. Dans le guide sur [l'alignement des boîtes et les grilles](/fr/docs/Web/CSS/CSS_Grid_Layout/Box_Alignment_in_CSS_Grid_Layout), nous avons vu comment utiliser les marges automatiques sur les zones d'une grille. Utiliser les marges automatiques pour contraindre le placement d'un élément est une astuce qu'on rencontre aussi avec les boîtes flexibles mais cela couple la disposition avec l'espace physique. +On rencontre souvent les propriétés physiques lorsqu'on construit un site web et, bien que la grille et les propriétés logiques permettent de respecter les modes d'écriture, il existe certains effets qui ne peuvent être obtenus qu'avec des propriétés et des valeurs physiques. Dans le guide sur [l'alignement des boîtes et les grilles](/fr/docs/Web/CSS/CSS_grid_layout/Box_alignment_in_grid_layout), nous avons vu comment utiliser les marges automatiques sur les zones d'une grille. Utiliser les marges automatiques pour contraindre le placement d'un élément est une astuce qu'on rencontre aussi avec les boîtes flexibles mais cela couple la disposition avec l'espace physique. Si on utilise le positionnement absolu dans une zone d'une grille, là encore, on utilisera des décalages physiques pour décaler l'élément au sein de la zone. Dans ces cas, il faut être conscient du couplage qu'on ajoute avec l'espace physique et comprendre qu'il faudra adapter la feuille de style si on veut par exemple passer d'un mode `ltr` à un mode `rtl`. @@ -467,6 +498,4 @@ Si on utilise le positionnement absolu dans une zone d'une grille, là encore, o Les nouvelles méthodes de disposition, comme les grilles, permettent d'employer les valeurs logiques afin de placer les éléments. Cependant, dès qu'on combine ces valeurs avec des propriétés physiques, il faut maintenir ces dernières lorsque le mode d'écriture change. -La [spécification sur les propriétés logiques en CSS](https://drafts.csswg.org/css-logical-props/) vise à résoudre ce problème. Nous pourrons peut-être utiliser demain des [équivalents logiques](/fr/docs/Web/CSS/CSS_Logical_Properties) pour chacune des propriétés physiques telles que {{cssxref("margin-left")}} et {{cssxref("margin-right")}}. Firefox a déjà implémenté ces propriétés logiques et vous pouvez les y tester. En utilisant les grilles et en manipulant l'axe de bloc et l'axe de ligne, vous saurez également comment fonctionnent ces propriétés logiques à venir. - -{{PreviousMenuNext("Web/CSS/CSS_Grid_Layout/Alignement_des_boîtes_avec_les_grilles_CSS", "Web/CSS/CSS_Grid_Layout/Les_grilles_CSS_et_l_accessibilité","Web/CSS/CSS_Grid_Layout")}} +La [spécification sur les propriétés logiques en CSS](https://drafts.csswg.org/css-logical-props/) vise à résoudre ce problème en fournissant [des équivalents logiques](/fr/docs/Web/CSS/CSS_logical_properties_and_values) pour chacune des propriétés physiques telles que [`margin-left`](/fr/docs/Web/CSS/margin-left) et [`margin-right`](/fr/docs/Web/CSS/margin-right). Ces propriétés et valeurs sont bien prises en charge par les navigateurs récents. En utilisant les grilles et en manipulant l'axe de bloc et l'axe de ligne, cela vous aidera à comprendre le fonctionnement de ces propriétés logiques. From c6b1c6025ad3fb598b34304c71a5e6212d59850c Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Wed, 20 Sep 2023 13:12:51 +0200 Subject: [PATCH 045/268] Fix #14172 (#15826) * update and fix #14172 * fix asset compression --- files/fr/web/css/css_media_queries/index.md | 47 ++++++++++++++----- .../css/css_media_queries/media-queries.svg | 1 + 2 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 files/fr/web/css/css_media_queries/media-queries.svg diff --git a/files/fr/web/css/css_media_queries/index.md b/files/fr/web/css/css_media_queries/index.md index f222af221919cb..13f553e2a7372d 100644 --- a/files/fr/web/css/css_media_queries/index.md +++ b/files/fr/web/css/css_media_queries/index.md @@ -1,32 +1,52 @@ --- -title: Media queries +title: Requêtes média CSS (media queries) slug: Web/CSS/CSS_media_queries +l10n: + sourceCommit: 50e215d730cd173d93b9bf75785c0d8ed2f67cb0 --- {{CSSRef}} -Les requêtes média, plus souvent appelées **_media queries,_** sont un outil de _responsive design_ qui permet d'adapter la feuille de style CSS en fonction de différents paramètres ou caractéristiques de l'appareil. Par exemple, on pourra appliquer différents styles si l'écran de l'appareil utilisé pour consulter le document est plus petit qu'une taille donnée ou si l'utilisateur tient son appareil en mode portrait ou paysage. La règle @ (ou _at-rule_) {{cssxref("@media")}} est utilisée afin d'appliquer les styles de façon conditionnelle. +Les **requêtes média CSS**, plus souvent appelées **media queries**, sont un outil de [responsive design](/fr/docs/Learn/CSS/CSS_layout/Responsive_Design) qui permet d'adapter la feuille de styles CSS en fonction de différents paramètres ou caractéristiques de l'appareil. -De plus, la syntaxe des requêtes média est également employée dans d'autres contextes, notamment l'attribut [`media`](/fr/docs/Web/HTML/Element/source#media) de l'élément {{HTMLElement("source")}} qui permet de définir une chaîne de caractères contenant une requête média afin de choisir le fichier source utilisé pour une image grâce à l'élément HTML {{HTMLElement("picture")}}. +Par exemple, on pourra appliquer différentes mises en forme selon la taille de [la zone d'affichage](/fr/docs/Glossary/Viewport) pour que la disposition soit correcte selon les tailles d'écran des appareils. -De plus, la méthode du DOM {{domxref("Window.matchMedia()")}} peut être utilisée afin de tester le résultat d'une requête média pour la fenêtre courante. On peut également utiliser la méthode {{domxref("MediaQueryList.addListener()")}} afin de recevoir une notification lorsque l'état de la requête évolue. Grâce à cette fonctionnalité, un site ou une application peut réagir aux changements de configuration, d'orientation ou d'état. +Par exemple, on pourra utiliser une police de caractères plus petite pour les appareils avec des petits écrans, augmenter l'espace entre les paragraphes si la page est vue en mode portrait, ou encore augmenter la taille des boutons sur les écrans tactiles. -Vous pouvez en découvrir plus dans l'article [Tester des requêtes media](/fr/docs/Web/CSS/Requêtes_média/Tester_les_media_queries). +![Un ordinateur portable et un smartphone, chacun avec une taille de zone d'affichage différente, où le contenu est agencé différemment grâce aux media queries.](media-queries.svg) + +C'est [la règle @](/fr/docs/Web/CSS/At-rule) [`@media`](/fr/docs/Web/CSS/@media) qui est utilisée en [CSS](/fr/docs/Web/CSS) pour appliquer de façon conditionnelle un fragment d'une feuille de styles selon le résultat d'une requête média. Si on souhaite appliquer de façon conditionnelle une feuille de styles entière, on utilisera [`@import`](/fr/docs/Web/CSS/@import). + +Lorsqu'on conçoit des composants HTML réutilisables, on peut également utiliser [les requêtes de conteneur](/fr/docs/Web/CSS/CSS_container_queries) qui permettent d'appliquer des mises en forme selon la taille de l'élément englobant plutôt que par rapport à la zone d'affichage ou aux caractéristiques de l'appareil. + +### Les requêtes média en HTML + +En [HTML](/fr/docs/Web/HTML), on peut appliquer des requêtes média à différents éléments : + +- Dans l'attribut [`media`](/fr/docs/Web/HTML/Element/link#media) de l'élément [``](/fr/docs/Web/HTML/Element/link), qui définit le média auquel une ressource liée (généralement du CSS) s'applique. +- Dans l'attribut [`media`](/fr/docs/Web/HTML/Element/source#media) de l'élément [``](/fr/docs/Web/HTML/Element/source), qui définit le média sur lequel la source s'applique (uniquement valide à l'intérieur d'éléments [``](/fr/docs/Web/HTML/Element/picture)). +- Dans l'attribut [`media`](/fr/docs/Web/HTML/Element/style#media) de l'élément [`Lorem ipsum dolor sit amet, consectetur adipisicingelit, sed do eiusmod tempor incididunt ut labore etdolore magna aliqua.Praesent aliquam, enim at fermentum mollis, ligulamassa adipiscing nisl, ac euismod nibh nisl eu lectus.Fusce vulputate sem at sapien. Vivamus leoLorem ipsum dolor sit amet,consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Praesent aliquam, enim atfermentum mollis, ligula massaadipiscing nisl, ac euismod nibhnisl eu lectus. Fusce vulputatesem at sapien. Vivamus leoLargeur de la zone d'affichageLargeur de lazone d'affichageHauteurde la zoned'affichageHauteurde la zoned'affichageTitreTitre \ No newline at end of file From 327c08c4f3c1eaaebf8c07b58690bd92494f1bab Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Wed, 20 Sep 2023 13:31:30 +0200 Subject: [PATCH 046/268] Fix #13894 (#15802) Fixes #13894 and update 2 pages along the way --- .../reference/global_objects/number/index.md | 250 ++++++++++++------ .../global_objects/typedarray/slice/index.md | 49 ++-- 2 files changed, 189 insertions(+), 110 deletions(-) diff --git a/files/fr/web/javascript/reference/global_objects/number/index.md b/files/fr/web/javascript/reference/global_objects/number/index.md index 4b9c10816f778f..96436a622b6c48 100644 --- a/files/fr/web/javascript/reference/global_objects/number/index.md +++ b/files/fr/web/javascript/reference/global_objects/number/index.md @@ -1,137 +1,229 @@ --- title: Number slug: Web/JavaScript/Reference/Global_Objects/Number +l10n: + sourceCommit: b2a5f62d66b4e3d71704017d0fab7ad710e68057 --- {{JSRef}} -L'objet **`Number`** est une enveloppe objet (_wrapper_) autour du [type primitif numérique](/fr/docs/Web/JavaScript/Structures_de_données#Le_type_nombre). Autrement dit, il est utilisé pour manipuler les nombres comme des objets. Pour créer un objet `Number`, on utilise le constructeur `Number()`. +Les valeurs **`Number`** représentent les nombres décimaux comme `37` ou `-9.25`. -Le type JavaScript `Number` utilise [une représentation binaire à précision double sur 64 bits telle que décrite par le standard IEEE 754](https://fr.wikipedia.org/wiki/IEEE_754). Les implémentations plus récentes offrent un nouveau type : {{jsxref("BigInt")}} qui permet de représenter des entiers avec une précision arbitraire. +Le constructeur `Number()` contient des constantes et des méthodes pour manipuler les nombres. Les valeurs des autres types peuvent être converties en nombre à l'aide de la fonction `Number()`. -## Syntaxe +## Description + +Les nombres sont généralement exprimés sous leur forme littérale comme `255` ou `3.14159`. La [grammaire lexicale](/fr/docs/Web/JavaScript/Reference/Lexical_grammar#littéraux_numériques) contient une référence plus détaillée à ce sujet. ```js -new Number(valeur); -var a = new Number("123"); // a === 123 donnera false -var b = Number("123"); // b === 123 donnera true -a instanceof Number; // donnera true -b instanceof Number; // donnera false +255; // deux cent vingt-cinq +255.0; // le même nombre +255 === 255.0; // true +255 === 0xff; // true (notation hexadécimale) +255 === 0b11111111; // true (notation binaire) +255 === 0.255e3; // true (notation scientifique) ``` -### Paramètres +En JavaScript, un littéral numérique comme `37` est bien une valeur décimale et pas particulièrement entière. Il n'existe pas de type entier distinct pour un usage courant (le type [`BigInt`](/fr/docs/Web/JavaScript/Reference/Global_Objects/BigInt) existe mais sert à représenter les très grandes valeurs entières et pas les nombres courants comme `37`). -- `valeur` - - : La valeur numérique pour l'objet qu'on souhaite créer. +Quand on utilise `Number(valeur)` comme fonction, elle permet de convertir une chaîne de caractères ou une valeur d'un autre type en valeur de type `Number`. Si la valeur ne peut pas être convertie, elle renvoie [`NaN`](/fr/docs/Web/JavaScript/Reference/Global_Objects/NaN) -## Description +```js +Number("123"); // renvoie le nombre 123 +Number("123") === 123; // true + +Number("licorne"); // NaN +Number(undefined); // NaN +``` + +### Encodage des valeurs numériques + +Le type JavaScript `Number` utilise [une représentation binaire à précision double sur 64 bits telle que décrite par le standard IEEE 754](https://fr.wikipedia.org/wiki/IEEE_754). Cela signifie que les valeurs décimales peuvent être représentées, avec certaines limites sur l'amplitude et la précision. En résumé, un nombre à précision double IEEE 754 utilise 64 bits pour représenter trois fragments : + +- 1 bit pour _le signe_ (indiquant si le nombre est positif ou négatif) +- 11 bits pour _l'exposant_ (pouvant aller de -1022 à 1023) +- 52 bits pour _la mantisse_ (représentant un nombre entre 0 et 1) + +La mantisse est la partie qui représente la valeur effective (les chiffres significatifs). L'exposant indique la puissance de deux par laquelle la mantisse devrait être multipliée. On peut écrire la formule suivante (proche de la notation scientifique) : + +Nombre=(1)signe(1+mantisse)2exposant\text{Number} = ({-1})^{\text{signe}} \cdot (1 + \text{mantisse}) \cdot 2^{\text{exposant}} + +La mantisse est stockée sur 52 bits, interprétés comme les chiffres de la partie fractionnaire de `1.…` en binaire. La précision de la mantisse est donc 2-52 (valeur qu'on peut obtenir via [`Number.EPSILON`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON)), soit entre 15 et 17 chiffres en écriture décimale. Les valeurs arithmétiques au-delà de cette précision seront [arrondies](https://fr.wikipedia.org/wiki/IEEE_754#Arrondir_les_nombres_flottants). + +La valeur la plus grande qui puisse être représentée par un nombre en JavaScript est 21024 - 1 (ici l'exposant vaut 1023 et la mantisse vaut 0.1111… en base 2), valeur qu'on peut obtenir avec [`Number.MAX_VALUE`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE). Les valeurs supérieures à celle-ci sont remplacées par la constante spéciale [`Infinity`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Infinity). + +Les entiers peuvent uniquement être représentés sans perte de précision dans l'intervalle -253 + 1 à 253 - 1 inclus (valeurs qu'on peut obtenir avec [`Number.MIN_SAFE_INTEGER`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER) et [`Number.MAX_SAFE_INTEGER`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)), car la mantisse ne peut contenir que 53 bits (en comptant le 1). + +De plus amples précisions sont disponibles dans [le standard ECMAScript](https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#sec-ecmascript-language-types-number-type). + +### Conversion numérique + +De nombreuses opérations natives qui s'attendent à manipuler des nombres appliquent d'abord une conversion à leurs arguments pour les transformer en nombre (ce qui explique pourquoi les objets `Number` se comportent généralement comme des valeurs numériques primitives). [Cette opération de conversion](https://tc39.es/ecma262/multipage/abstract-operations.html#sec-tonumber) peut être résumée ainsi : + +- Les nombres sont renvoyés tels quels. +- [`undefined`](/fr/docs/Web/JavaScript/Reference/Global_Objects/undefined) est transformé en [`NaN`](/fr/docs/Web/JavaScript/Reference/Global_Objects/NaN). +- [`null`](/fr/docs/Web/JavaScript/Reference/Operators/null) est transformé en `0`. +- `true` est transformé en `1`, et `false` est transformé en `0`. +- Les chaînes de caractères sont converties en les analysant comme si elles contenaient [un littéral numérique](/fr/docs/Web/JavaScript/Reference/Lexical_grammar#numeric_literals). Toute erreur d'analyse produira `NaN`. Il y a quelques différences mineures par rapport à littéral numérique : + - Les blancs et fins de lignes au début ou à la fin sont ignorés. + - Un chiffre `0` en début de chaîne n'indique pas un littéral en base octale (et n'est pas rejeté en mode strict). + - `+` et `-` sont autorisés au début de la chaîne pour indiquer le signe. Dans du code littéral, ils semblent faire partie du littéral, mais sont en réalité des opérateurs unaires distincts. Toutefois, le signe ne peut apparaître qu'une seule fois et ne pas être suivi par des blancs. + - `Infinity` et `-Infinity` sont reconnus comme des valeurs littérales. Dans du code réel, il s'agit de variables globales. + - Les chaînes de caractères vides ou qui ne contiennent que des blancs sont converties en `0`. + - [Les séparateurs numériques](/fr/docs/Web/JavaScript/Reference/Lexical_grammar#séparateurs_numériques) (le tiret bas dans `1_050.95`) ne sont pas autorisés. +- [Les grands entiers (BigInts)](/fr/docs/Web/JavaScript/Reference/Global_Objects/BigInt) déclenchent une exception [`TypeError`](/fr/docs/Web/JavaScript/Reference/Global_Objects/TypeError) pour empêcher une perte de précision involontaire lors de la conversion implicite. +- [Les symboles](/fr/docs/Web/JavaScript/Reference/Global_Objects/Symbol) déclenchent une exception [`TypeError`](/fr/docs/Web/JavaScript/Reference/Global_Objects/TypeError) +- Les objets sont d'abord [convertis en une valeur primitive](/fr/docs/Web/JavaScript/Data_structures#primitive_coercion) à l'aide de leurs méthodes [`[@@toPrimitive]()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive) (où `"number"` est fourni comme indication), `valueOf()`, et `toString()`, selon cet ordre. La valeur primitive obtenue est alors convertie en nombre. + +Il existe deux méthodes qui permettent de déclencher cette conversion (ou presque) en JavaScript : -L'objet `Number` est principalement utilisé dans les cas de figure suivants : +- [Le plus unaire](/fr/docs/Web/JavaScript/Reference/Operators/Unary_plus) : `+x` applique l'algorithme explicité avant pour convertir `x`. +- [La fonction `Number()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/Number) : `Number(x)` utilise le même algorithme pour convertir `x`, sauf que [les grands entiers (BigInts)](/fr/docs/Web/JavaScript/Reference/Global_Objects/BigInt) ne déclenchent pas d'exception [`TypeError`](/fr/docs/Web/JavaScript/Reference/Global_Objects/TypeError) mais renvoient la valeur numérique correspondante, quitte à ce qu'il y ait une perte de précision. -- Si l'argument ne peut pas être converti en un nombre, il renverra {{jsxref("NaN")}}. -- Dans un contexte de fonction simple (quand il n'est pas utilisé comme un constructeur avec l'opérateur {{jsxref("Opérateurs/L_opérateur_new", "new")}}), `Number` peut être utilisé afin d'effectuer des conversions. +[`Number.parseFloat()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/parseFloat) et [`Number.parseInt()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/parseInt) sont semblables à `Number()` mais servent uniquement à convertir des chaînes de caractères, en suivant des règles légèrement différentes. Par exemple, `parseInt()` ne reconnaît pas le point décimal et `parseFloat()` ne reconnaît pas le préfixe `0x`. -## Propriétés +#### Conversion entière -- {{jsxref("Number.EPSILON")}} +Certaines opérations s'attendent à manipuler des entiers, notamment celles qui fonctionnent avec des indices de tableaux ou de chaînes de caractères, des composantes temporelles et des bases numériques. Après la conversion numérique décrite ci-avant, le résultat est [tronqué](/fr/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc) en un nombre entier (la partie fractionnaire est ignorée). Si le nombre est `±Infinity`, il est renvoyé tel quel. Si le nombre est `NaN` ou `-0`, c'est `0` qui est renvoyé. Le résultat est donc toujours un entier (qui n'est pas `-0`) ou `±Infinity`. + +On notera que, pour la conversion entière, `undefined` et `null` deviennent `0`, car `undefined` est d'abord converti en `NaN` lors de la conversion numérique, puis en `0` lors de la conversion entière qui suit. + +#### Conversion en nombre à longueur fixe + +Certaines fonctions JavaScript « bas-niveau » permettent de manipuler l'encodage binaire des nombres entiers, notamment [les opérateurs binaires](/fr/docs/Web/JavaScript/Reference/Operators#opérateurs_de_décalage_binaires) et les objets [`TypedArray`](/fr/docs/Web/JavaScript/Reference/Global_Objects/TypedArray). Les opérateurs binaires convertissent toujours leurs opérandes en entiers sur 32 bits. Dans ces cas, après la conversion numérique décrite avant, le nombre est normalisé à la largeur souhaitée en [tronquant](/fr/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc) la partie fractionnaire, puis en considérant les bits les plus faibles de la représentation de l'entier en complément à deux. + +```js +new Int32Array([1.1, 1.9, -1.1, -1.9]); // Int32Array(4) [ 1, 1, -1, -1 ] + +new Int8Array([257, -257]); // Int8Array(2) [ 1, -1 ] +// 257 = 0001 0000 0001 +// = 0000 0001 (mod 2^8) +// = 1 +// -257 = 1110 1111 1111 +// = 1111 1111 (mod 2^8) +// = -1 (comme entier signé) + +new Uint8Array([257, -257]); // Uint8Array(2) [ 1, 255 ] +// -257 = 1110 1111 1111 +// = 1111 1111 (mod 2^8) +// = 255 (comme entier non-signé) +``` + +## Constructeur + +- [`Number()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/Number) + - : Crée une nouvelle valeur `Number`. + +Lorsque `Number` est appelé comme constructeur (avec le mot-clé `new`), il crée un objet `Number` qui **n'est pas** une valeur primitive. Par exemple, on aura `typeof new Number(42) === "object"`, et `new Number(42) !== 42` (même si `new Number(42) == 42`). + +> **Attention :** Il est plutôt rare de devoir utiliser `Number` comme constructeur. + +## Propriétés statiques + +- [`Number.EPSILON`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON) - : Le plus petit intervalle entre deux valeurs qu'il est possible de représenter en JavaScript. -- {{jsxref("Number.MAX_SAFE_INTEGER")}} - - : La valeur entière maximale qu'on peut représenter en JavaScript (`2^53 - 1`). -- {{jsxref("Number.MAX_VALUE")}} +- [`Number.MAX_SAFE_INTEGER`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER) + - : La valeur entière maximale qu'on peut représenter en JavaScript (253 - 1). +- [`Number.MAX_VALUE`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE) - : La valeur numérique maximale qu'on peut représenter en JavaScript. -- {{jsxref("Number.MIN_SAFE_INTEGER")}} - - : La valeur entière minimale qu'on peut représenter en JavaScript (`-(2^53 - 1)`). -- {{jsxref("Number.MIN_VALUE")}} - - : La plus petite valeur qu'on peut représenter en JavaScript, c'est-à-dire le plus petit nombre positif (le nombre le plus près de zéro qui n'est pas égal à zéro et qu'on peut représenter en JavaScript). -- {{jsxref("Number.NaN")}} +- [`Number.MIN_SAFE_INTEGER`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER) + - : La valeur entière minimale qu'on peut représenter en JavaScript (-(253 - 1)). +- [`Number.MIN_VALUE`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_VALUE) + - : La plus petite valeur positive qu'on peut représenter en JavaScript, c'est-à-dire le nombre le plus près de zéro qui n'est pas égal à zéro et qu'on peut représenter en JavaScript. +- [`Number.NaN`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/NaN) - : Une valeur spéciale pour représenter les valeurs non-numériques (**NaN** correspond à « **N**ot **a** **N**umber » en anglais, qui signifie « n'est pas un nombre »). -- {{jsxref("Number.NEGATIVE_INFINITY")}} - - : Une valeur spéciale pour représenter l'infini négatif. -- {{jsxref("Number.POSITIVE_INFINITY")}} - - : Une valeur spéciale pour représenter l'infini (positif). -- {{jsxref("Number.prototype")}} - - : Cet objet permet d'ajouter des propriétés aux instances de `Number`. +- [`Number.NEGATIVE_INFINITY`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/NEGATIVE_INFINITY) + - : Une valeur spéciale pour représenter l'infini négatif. Cette valeur est renvoyée quand on dépasse les valeurs représentables. +- [`Number.POSITIVE_INFINITY`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/POSITIVE_INFINITY) + - : Une valeur spéciale pour représenter l'infini (positif). Cette valeur est renvoyée quand on dépasse les valeurs représentables. -## Méthodes +## Méthodes statiques -- {{jsxref("Number.isNaN()")}} - - : Cette méthode permet de déterminer si la valeur passée en argument vaut `NaN`. -- {{jsxref("Number.isFinite()")}} +- [`Number.isFinite()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite) - : Cette méthode permet de déterminer si la valeur numérique passée en argument est un nombre fini. -- {{jsxref("Number.isInteger()")}} +- [`Number.isInteger()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger) - : Cette méthode permet de déterminer si la valeur passée en argument est un entier. -- {{jsxref("Number.isSafeInteger()")}} - - : Cette méthode permet de déterminer si la valeur passée en argument peut correctement être représentée comme un entier en JavaScript (savoir si elle est comprise entre `-(2^53 - 1)` et `2^53 - 1`). -- {{jsxref("Number.toInteger()")}} {{deprecated_inline}} - - : Cette méthode est utilisée afin d'évaluer et de convertir la valeur passée en argument en entier (ou en l'{{jsxref("Infinity", "infini","",1)}}). Cette méthode a été supprimée. -- {{jsxref("Number.parseFloat()", "Number.parseFloat(string)")}} - - : Cette méthode correspond à la méthode {{jsxref("parseFloat", "parseFloat()")}} de l'objet global. -- {{jsxref("Number.parseInt()", "Number.parseInt(string, [radix])")}} - - : Cette méthode correspond à la méthode {{jsxref("parseInt", "parseInt()")}} de l'objet global. +- [`Number.isNaN()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN) + - : Cette méthode permet de déterminer si la valeur passée en argument vaut `NaN`. +- [`Number.isSafeInteger()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger) + - : Cette méthode permet de déterminer si la valeur passée en argument peut correctement être représentée comme un entier en JavaScript (savoir si elle est comprise entre -(253 - 1) et 253 - 1). +- [`Number.parseFloat()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/parseFloat) + - : Cette méthode correspond à la méthode [`parseFloat()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/parseFloat) de l'objet global. +- [`Number.parseInt()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/parseInt) + - : Cette méthode correspond à la méthode [`parseInt()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/parseInt) de l'objet global. -## Les instances de `Number` +## Propriétés des instances -Toutes les instances de `Number` héritent de {{jsxref("Number.prototype")}}. Il est possible de modifier le prototype du constructeur `Number` pour affecter toutes les instances de `Number`. +Ces propriétés sont définies sur `Number.prototype` et partagées par l'ensemble des instances de `Number`. -### Méthodes +- [`Number.prototype.constructor`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor) + - : La fonction utilisée comme constructeur pour créer l'instance objet. Pour les instances `Number`, la valeur initiale est le constructeur [`Number()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/Number). -- {{jsxref("Number.prototype.toExponential()" ,"Number.prototype.toExponential(fractionDigits)")}} +### Méthodes des instances + +- [`Number.prototype.toExponential()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/toExponential) - : Retourne une chaîne représentant le nombre en notation exponentielle. -- {{jsxref("Number.prototype.toFixed()", "Number.prototype.toFixed(digits)")}} - - : Retourne une chaîne représentant le nombre avec la notation virgule fixe. -- {{jsxref("Number.prototype.toLocaleString()", "Number.prototype.toLocaleString([locales [, options]])")}} - - : Retourne une chaîne avec une représentation sensible à la langue de ce nombre. Surcharge la méthode {{jsxref("Object.prototype.toLocaleString()")}}. -- {{jsxref("Number.prototype.toPrecision()", "Number.prototype.toPrecision(precision)")}} - - : Retourne une chaîne représentant le nombre avec une précision donnée en notation virgule fixe ou exponentielle. -- {{jsxref("Number.prototype.toString()", "Number.prototype.toString([radix])")}} - - : Retourne une chaîne représentant le nombre dans une base numérique (radix) donnée. Surcharge la méthode {{jsxref("Object.prototype.toString()")}}. -- {{jsxref("Number.prototype.valueOf()")}} - - : Retourne la valeur primitive de l'objet spécifié. Surcharge la méthode {{jsxref("Object.prototype.valueOf()")}}. +- [`Number.prototype.toFixed()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed) + - : Retourne une chaîne représentant le nombre avec la notation en virgule fixe. +- [`Number.prototype.toLocaleString()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString) + - : Retourne une chaîne avec une représentation du nombre tenant compte de la locale. Surcharge la méthode [`Object.prototype.toLocaleString()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Object/toLocaleString). +- [`Number.prototype.toPrecision()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/toPrecision) + - : Retourne une chaîne représentant le nombre avec une précision donnée en notation en virgule fixe ou exponentielle. +- [`Number.prototype.toString()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/toString) + - : Retourne une chaîne représentant le nombre dans une base numérique donnée. Surcharge la méthode [`Object.prototype.toString()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Object/toString). +- [`Number.prototype.valueOf()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number/valueOf) + - : Retourne la valeur primitive de l'objet spécifié. Surcharge la méthode [`Object.prototype.valueOf()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf). ## Exemples ### Utiliser l'objet `Number` pour affecter des valeurs numériques à des variables -Dans l'exemple suivant, on utilise les propriétés de l'objet `Number` pour affecter des valeurs à des variables numériques : +Dans l'exemple suivant, on utilise les propriétés de l'objet `Number` pour affecter des valeurs à des variables numériques : ```js -var plusGrandNombre = Number.MAX_VALUE; -var plusPetitNombre = Number.MIN_VALUE; -var infini = Number.POSITIVE_INFINITY; -var infiniNégatif = Number.NEGATIVE_INFINITY; -var nonNumérique = Number.NaN; +const plusGrandNombre = Number.MAX_VALUE; +const plusPetitNombre = Number.MIN_VALUE; +const infini = Number.POSITIVE_INFINITY; +const infiniNégatif = Number.NEGATIVE_INFINITY; +const nonNumérique = Number.NaN; ``` ### Intervalle entier pour `Number` -Dans l'exemple suivant, on illustre les valeurs numériques maximales et minimales (exclues) qu'on peut représenter avec un nombre en JavaScript (pour plus de détails, [voir le chapitre 6.1.6 du standard ECMAScript](https://tc39.github.io/ecma262/#sec-ecmascript-language-types-number-type)) : +Dans l'exemple suivant, on illustre les valeurs numériques entières maximales et minimales qu'on peut représenter avec une valeur `Number` : ```js -var biggestInt = 9007199254740992; //Number.MAX_SAFE_INTEGER+1 (2^53-1) -var smallestInt = -9007199254740992; //Number.MIN_SAFE_INTEGER-1 -(2^53-1) +const biggestInt = Number.MAX_SAFE_INTEGER; // (2**53 - 1) => 9007199254740991 +const smallestInt = Number.MIN_SAFE_INTEGER; // -(2**53 - 1) => -9007199254740991 ``` -Lorsqu'on analyse et convertit des données JSON, les valeurs en dehors de cet intervalle peuvent entraîner des erreurs ou des corruptions de valeurs lors de leurs conversions. Selon les objets qu'on souhaite représenter, on peut utiliser {{jsxref("String")}} dans certains cas pour représenter certaines valeurs. +Lorsqu'on analyse et convertit des données JSON, les valeurs en dehors de cet intervalle peuvent entraîner des erreurs ou des corruptions de valeurs lors de leurs conversions. + +Selon les objets qu'on souhaite représenter, on peut utiliser [`String`](/fr/docs/Web/JavaScript/Reference/Global_Objects/String) dans certains cas pour représenter certaines valeurs. -### Utiliser `Number` pour convertir un objet `Date` +Pour les plus grands nombres, on pourra utiliser le type [`BigInt`](/fr/docs/Web/JavaScript/Reference/Global_Objects/BigInt). -Dans l'exemple suivant, on convertit un objet {{jsxref("Date")}} en une valeur numérique grâce à la fonction `Number` : +### Utiliser `Number()` pour convertir un objet `Date` + +Dans l'exemple suivant, on convertit un objet [`Date`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Date) en une valeur numérique grâce à la fonction `Number()` : ```js -var d = new Date("December 17, 1995 03:24:00"); +const d = new Date("1995-12-17T03:24:00"); console.log(Number(d)); ``` -Ceci affichera "819167040000". +Ceci affichera `819199440000`. -### Convertir une chaîne représentant une valeur numérique en un nombre +### Convertir une chaîne de caractères représentant une valeur numérique, ou `null` en un nombre ```js Number("123"); // 123 +Number("123") === 123; // true Number("12.3"); // 12.3 Number("12.00"); // 12 Number("123e-1"); // 12.3 Number(""); // 0 +Number(null); // 0 Number("0x11"); // 17 Number("0b11"); // 3 Number("0o11"); // 9 @@ -140,8 +232,6 @@ Number("100a"); // NaN Number("-Infinity"); // -Infinity ``` -> **Note :** On pourra également convertir `null` en `0` grâce à `Number` : `Number(null)` donnera `0`. - ## Spécifications {{Specifications}} @@ -152,8 +242,8 @@ Number("-Infinity"); // -Infinity ## Voir aussi -- {{jsxref("NaN")}} -- L'objet global {{jsxref("Math")}} -- [Les types de données en JavaScript](/fr/docs/Web/JavaScript/Structures_de_données#Le_type_nombre) -- [Un billet sur le type `Number` (en anglais)](https://medium.com/@maximus.koretskyi/javascripts-number-type-8d59199db1b6#.9whwe88tz) -- Représenter de grands entiers avec une précision arbitraire : {{jsxref("BigInt")}} +- [Une prothèse d'émulation (polyfill) du comportement moderne de `Number` (dont la prise en charge des littéraux binaires et octaux) dans la bibliothèque `core-js`](https://github.com/zloirock/core-js#ecmascript-number) +- [`NaN`](/fr/docs/Web/JavaScript/Reference/Global_Objects/NaN) +- [Les opérateurs arithmétiques](/fr/docs/Web/JavaScript/Reference/Operators#opérateurs_arithmétiques) +- [`Math`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Math) +- [`BigInt`](/fr/docs/Web/JavaScript/Reference/Global_Objects/BigInt) diff --git a/files/fr/web/javascript/reference/global_objects/typedarray/slice/index.md b/files/fr/web/javascript/reference/global_objects/typedarray/slice/index.md index 8db67bc548de61..1090869590c544 100644 --- a/files/fr/web/javascript/reference/global_objects/typedarray/slice/index.md +++ b/files/fr/web/javascript/reference/global_objects/typedarray/slice/index.md @@ -1,26 +1,30 @@ --- title: TypedArray.prototype.slice() slug: Web/JavaScript/Reference/Global_Objects/TypedArray/slice +l10n: + sourceCommit: b2a5f62d66b4e3d71704017d0fab7ad710e68057 --- {{JSRef}} -La méthode **`slice()`** renvoie une copie superficielle (shallow copy) d'un fragment du tableau typé courant dans un nouveau tableau typé. Cette méthode utilise le même algorithme que {{jsxref("Array.prototype.slice()")}}_._ _TypedArray_ est utilisé par la suite de façon générique pour réprésenter l'un des [types de tableaux typés](/fr/docs/Web/JavaScript/Reference/Objets_globaux/TypedArray#Les_objets_TypedArray). +La méthode **`slice()`** des instances de [`TypedArray`](/fr/docs/Web/JavaScript/Reference/Global_Objects/TypedArray) renvoie une copie d'un fragment du tableau typé courant dans un nouveau tableau typé. La portion est prise entre les paramètres `début` (inclus) et `fin` (non-inclus) qui correspondent aux indices des éléments du tableau typé courant. Le tableau typé original ne sera pas modifié. Cette méthode utilise le même algorithme que [`Array.prototype.slice()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/slice) -{{EmbedInteractiveExample("pages/js/typedarray-slice.html")}} +{{EmbedInteractiveExample("pages/js/typedarray-slice.html", "shorter")}} ## Syntaxe -```js -typedarray.slice([début[, fin]]) +```js-nolint +slice() +slice(début) +slice(début, fin) ``` ## Paramètres - `début` {{optional_inline}} - - : L'indice (compté à partir de zéro) à partir duquel commencer le fragment. Si l'indice fourni est négatif, `début` indiquera le décalage par rapport à la fin de la séquence. Par exemple, `slice(-2)` extrait les deux derniers éléments de la séquence. Par défaut, si `début` n'est pas utilisé, `slice()` commencera à partir de l'indice `0`. + - : L'indice (compté à partir de zéro), [converti en entier](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number#conversion_entière), à partir duquel commencer le fragment. - `fin` {{optional_inline}} - - : L'indice (compté à partir de zéro) jusqu'auquel extraire le fragment. Le fragment obtenu n'incluera pas l'élément situé à l'indice `fin`. `slice(1,4)` extrait par exemple à partir du deuxième élément et jusqu'au quatrième (c'est-à-dire les éléments dont les indices respectifs sont 1, 2, et 3). Si l'indice utilisé est négatif, `fin` indiquera le décalage par rapport à la fin de la séquence. Ainsi, `slice(2,-1)` extraira à partir du troisième élément et jusqu'à l'avant dernier élément (compris). Par défaut, si `fin` n'est pas utilisé, `slice()` extraira les éléments jusqu'à la fin de la séquence (`arr.length`). + - : L'indice (compté à partir de zéro), [converti en entier](/fr/docs/Web/JavaScript/Reference/Global_Objects/Number#conversion_entière), jusqu'auquel extraire le fragment. Le fragment obtenu n'inclura pas l'élément situé à l'indice `fin`. ### Valeur de retour @@ -28,39 +32,20 @@ Un nouveau tableau typé qui contient les éléments extraits. ## Description -La méthode `slice()` ne modifie pas le tableau typé courant, elle renvoie une copie superficielle (_shallow copy_) du tableau typé original. - -Si un nouvel élément est ajouté à l'un des deux tableaux typés, l'autre ne sera pas impacté. +Voir [`Array.prototype.slice()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/slice) pour plus détails. Cette méthode n'est pas générique et peut uniquement être appelée sur les instances de tableaux typés. ## Exemples +### Renvoyer un fragment d'un tableau typé existant + ```js -var uint8 = new Uint8Array([1, 2, 3]); +const uint8 = new Uint8Array([1, 2, 3]); uint8.slice(1); // Uint8Array [ 2, 3 ] uint8.slice(2); // Uint8Array [ 3 ] uint8.slice(-2); // Uint8Array [ 2, 3 ] uint8.slice(0, 1); // Uint8Array [ 1 ] ``` -## Prothèse d'émulation (_polyfill_) - -Il n'existe pas d'objet global intitulé _TypedArray_, la prothèse doit donc uniquement être employée si nécessaire : - -```js -// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.slice -if (!Uint8Array.prototype.slice) { - Object.defineProperty(Uint8Array.prototype, "slice", { - value: function (begin, end) { - return new Uint8Array(Array.prototype.slice.call(this, begin, end)); - }, - }); -} -``` - -De plus cette prothèse n'est pas parfaite car elle renvoie une instance d'`Array` et pas de `Uint8Array`. Elle manque donc des propriétés normalement associées aux objets `TypedArray`. - -S'il faut également prendre en charge les moteurs JavaScript qui ne prennent pas en charge la méthode {{jsxref("Object.defineProperty")}}, mieux vaut ne pas ajouter de prothèse du tout pour `TypedArray.prototype` car on ne peut pas les rendre non-énumérables. - ## Spécifications {{Specifications}} @@ -71,4 +56,8 @@ S'il faut également prendre en charge les moteurs JavaScript qui ne prennent pa ## Voir aussi -- {{jsxref("Array.prototype.slice()")}} +- [Une prothèse d'émulation (polyfill) pour `TypedArray.prototype.slice()` dans la bibliothèque `core-js`](https://github.com/zloirock/core-js#ecmascript-typed-arrays) +- [Le guide sur les tableaux typés en JavaScript](/fr/docs/Web/JavaScript/Guide/Typed_arrays) +- [`TypedArray`](/fr/docs/Web/JavaScript/Reference/Global_Objects/TypedArray) +- [`Array.prototype.slice()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/slice) +- [`String.prototype.slice()`](/fr/docs/Web/JavaScript/Reference/Global_Objects/String/slice) From d6899591ed6a3921fd5ffa9f964773f068583692 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Wed, 20 Sep 2023 13:36:18 +0200 Subject: [PATCH 047/268] Fix #13769 (#15797) Fixes #13769 --- .../resizing_background_images/index.md | 112 +++++++++++------- 1 file changed, 69 insertions(+), 43 deletions(-) diff --git a/files/fr/web/css/css_backgrounds_and_borders/resizing_background_images/index.md b/files/fr/web/css/css_backgrounds_and_borders/resizing_background_images/index.md index bbd12c99587bf1..8e5acec07c50c2 100644 --- a/files/fr/web/css/css_backgrounds_and_borders/resizing_background_images/index.md +++ b/files/fr/web/css/css_backgrounds_and_borders/resizing_background_images/index.md @@ -1,119 +1,145 @@ --- -title: Mettre à l'échelle des images en arrière-plan +title: Redimensionner les images d'arrière-plan avec background-size slug: Web/CSS/CSS_backgrounds_and_borders/Resizing_background_images +l10n: + sourceCommit: 70b1b8ac18d3e3346645d4ee5155f654c83d96e0 --- {{CSSRef}} -La propriété CSS {{cssxref("background-size")}} permet d'ajuster la taille des images utilisées en arrière-plan et de remplacer le comportement par défaut qui consiste à créer un carrelage de l'image à sa pleine grandeur. Il est ainsi possible d'agrandir ou de rapetisser l'image. +La propriété [CSS](/fr/docs/Web/CSS) [`background-size`](/fr/docs/Web/CSS/background-size) permet d'ajuster la taille des images utilisées en arrière-plan et de remplacer le comportement par défaut qui consiste à créer une mosaïque répétant l'image à sa taille normale en indiquant une hauteur et/ou une largeur pour l'image. Il est ainsi possible d'agrandir ou de rapetisser l'image. -## Carreler une image de grande taille +## Répéter une grande image -Prenons une image de grande taille (par exemple l'ancien logo de Firefox en 2485x2340px). On souhaite la carreler en quatre copies de 300x300 px, comme dans l'image suivante. +Prenons une grande image, ici le logo de Firefox aux dimensions 2982x2808 pixels. Imaginons qu'on veuille (pour de mauvaises raisons), obtenir une mosaïque avec quatre exemplaires de cette image dans un élément de 300x300 pixels. Pour cela, on pourra fixer la propriété `background-size` à 150 pixels. -![](logo-quantum.9c5e96634f92.png) +### HTML -On peut utiliser la feuille de style CSS suivante pour obtenir l'effet voulu : +```html +
+``` + +### CSS ```css -.square { - width: 300px; - height: 300px; +.tiledBackground { background-image: url(https://www.mozilla.org/media/img/logos/firefox/logo-quantum.9c5e96634f92.png); - border: solid 2px; - text-shadow: white 0px 0px 2px; - font-size: 16px; background-size: 150px; + width: 300px; + height: 300px; + border: 2px solid; + color: pink; } ``` -On notera que, dans l'exemple précédent, une seule valeur avait été précisée pour {{cssxref("background-size")}} : 150 px. Dans ce cas, cette valeur est utilisée pour la largeur et la hauteur est alors fixée à `auto`. +### Résultat + +{{EmbedLiveSample("", 340, 340)}} ## Étirer une image -Il est aussi possible de spécifier, respectivement, la largeur et la hauteur de l'image, comme dans l'exemple suivant, où la taille de l'image est imposée à 300x150 px. +On peut aussi indiquer les dimensions horizontale et verticale de l'image, comme ceci : + +### CSS ```css background-size: 300px 150px; ``` -L'image suivante montre le résultat obtenu. +### Résultat -![Logo de Firefox étité](s.codepen.io_richienb_debug_lonxgp_pnkvygvggyxa.png) +![Le logo étiré](stretched_firefox_logo.png) ## Agrandir une image -On peut agrandir une image en arrière-plan. À l'image suivante, une favicône de 32x32 px est agrandie à 300x300 px. +À l'inverse, on peut vouloir agrandir une image en arrière-plan. Ici, on passe d'une icône de 32x32 pixels à 300x300 pixels : -![Logo MDN à l'échelle](favicon57.de33179910ae.1.1.png) +### CSS ```css .square2 { - width: 300px; - height: 300px; background-image: url(favicon.png); background-size: 300px; - border: solid 2px; + width: 300px; + height: 300px; + border: 2px solid; text-shadow: white 0px 0px 2px; font-size: 16px; } ``` -On remarque que la feuille de style utilisée est identique à la précédente, sauf en ce qui concerne le nom de l'image. +### Résultat -## Valeurs spéciales : `contain` et `cover` +![Logo de MDN agrandi](scaled_mdn_logo.png) -En plus de {{cssxref("<length>")}}, la propriété CSS {{cssxref("background-size")}} permet d'employer deux autres valeurs : `contain` et `cover`. +Comme vous pouvez le voir, le CSS est quasi-identique, seul le nom du fichier a été modifié. -### `contain` +## Les valeurs spéciales `contain` et `cover` -La valeur `contain` spécifie les dimensions de l'image d'arrière-plan de manière à ce que sa largeur et sa hauteur soient aussi grandes que possible, tout en conservant l'image à l'intérieur de son élément conteneur. Ainsi, l'image ne peut déborder de son élément conteneur. +En plus des valeurs de longueur (type [``](/fr/docs/Web/CSS/length)), la propriété [`background-size`](/fr/docs/Web/CSS/background-size) permet d'utiliser valeurs spéciales `contain` et `cover`. Voyons ce qu'ils offrent. -Essayez de redimensionner la fenêtre de votre navigateur afin de voir la valeur `contain` en action (Votre navigateur doit supporter la mise à l'échelle d'images d'arrière-plan). +### `contain` -{{EmbedLiveSample("contain", "100%", "220")}} +La valeur `contain` indique que, quelle que soit la taille de la boîte englobante, l'image d'arrière-plan devrait être redimensionnée afin que chaque côté soit aussi grand que possible, sans dépasser la taille du conteneur. Redimensionnez l'exemple qui suit pour observer l'effet obtenu. + +#### HTML ```html
-

Redimensionnez la fenêtre de votre navigateur.

+

Essayez de redimensionner cet élément !

``` +#### CSS + ```css .bgSizeContain { - height: 200px; background-image: url(https://www.mozilla.org/media/img/logos/firefox/logo-quantum.9c5e96634f92.png); background-size: contain; - border: 2px solid darkgray; - color: #000; - text-shadow: 1px 1px 0 #fff; + width: 160px; + height: 160px; + border: 2px solid; + resize: both; + overflow: scroll; } ``` -### `cover` +#### Résultat -La valeur `cover` assure que l'image d'arrière-plan soit aussi petite que possible, tout en maintenant ses dimensions plus grandes ou égales à la taille de l'élément conteneur. L'échelle entre la largeur et la hauteur est maintenue. +{{EmbedLiveSample('', 250, 250)}} -{{EmbedLiveSample("cover", "100%", "220")}} +### `cover` + +La valeur `cover` indique que l'image d'arrière-plan devrait être aussi petite que possible tout en ayant ses deux dimensions supérieures ou égales à celles du conteneur. Vous pouvez redimensionner l'exemple qui suit pour observer l'effet obtenu. -Cet exemple utilise le document HTML et la feuille de style suivants : +#### HTML ```html
-

Redimensionnez la fenêtre de votre navigateur.

+

Essayez de redimensionner cet élément !

``` +#### CSS + ```css .bgSizeCover { - height: 200px; background-image: url(https://www.mozilla.org/media/img/logos/firefox/logo-quantum.9c5e96634f92.png); background-size: cover; - border: 2px solid darkgray; - color: #000; text-shadow: 1px 1px 0 #fff; + width: 160px; + height: 160px; + border: 2px solid; + resize: both; + overflow: scroll; +} ``` +#### Résultat + +{{EmbedLiveSample('', 250, 250)}} + ## Voir aussi -- {{cssxref("background-size")}} -- {{cssxref("background")}} +- [`background-size`](/fr/docs/Web/CSS/background-size) +- [`background`](/fr/docs/Web/CSS/background) +- [Redimensionnement des arrières-plans SVG](/fr/docs/Web/CSS/Scaling_of_SVG_backgrounds) From 8ad29f1df50ecac764a3fa29c09cacb9e4518c58 Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Wed, 20 Sep 2023 13:41:07 +0200 Subject: [PATCH 048/268] Fix #13734 for `fr` (#15793) * Fixes #13734 * Fix img compression --- .../confirm/firefoxcomfirmdialog_zpsf00ec381.png | Bin 0 -> 2636 bytes files/fr/web/api/window/confirm/index.md | 14 ++++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 files/fr/web/api/window/confirm/firefoxcomfirmdialog_zpsf00ec381.png diff --git a/files/fr/web/api/window/confirm/firefoxcomfirmdialog_zpsf00ec381.png b/files/fr/web/api/window/confirm/firefoxcomfirmdialog_zpsf00ec381.png new file mode 100644 index 0000000000000000000000000000000000000000..5d05fe4c70c995f201244e104ba983e864836ad1 GIT binary patch literal 2636 zcmYk8dpOhWAIImA^Oiz(_!cQm*1@4PlG>bQBNSVR^W49juAR zp&DhF;!&aYIBd-f={KeF)VGJ6X3kuozf?hvbBN7Qn>uACPLOqQv1s73BKnO0%z(qSd zCs8Tcue2Wo6;iNwZthE=P*t3yKKvbzqk&-WxpNnj>f~fn6w2B@2}gMQc9bh!gp9UR zC?`;yC8cuS-Obr>FtrK0nh!EjV=j7KSvT-viZJUjySR1ygx>#Xgu4tv(Iq>zpq)z@m<1;Uu2Hs&ACm@jz)Ww?Oq&vQR2F?pWeV<(m-z0`BUD z0O-+f2)G9V?o9Cqj_d+3xG;pJ-OCpPDfEI<%=4_A6y&!3fp8R)b^gq0`pcKENXa>| zF{C(p5pn}Q^jKj5Biq*fU?7Esc277;b|oMHrwzcN`0V^dLQy^?|8%}90!Su>+97}w zkzQxdUf>oG3g`*Bv0m{J;ko%tMjk`dqcHYW^_&eEm4dQ+O(XRJ)!v!4|f2=xt(8wDuJUfx1Qv$Iy-)!sVT5NGn%|K@= z)18%P+&Y$d?bx;9FDI0b7sgI1kDVIN9)D4O*V`uU4Rhhi^7>YOpo2110mcMp8Dh%n zya(cTZG?nv<1GzX@&5=q!`Ps=Y0{iUK7NLwbq(I>DO-Wb6$UwD7%}!M{g&%@>p(fO zbu3srb0r76$#!pA-pYHcUc_jnT>cHw5wLm2Hr2Ok=RVwbE#l?d#d{tLp4%RqF|6EH zXtOVVnRa5FeefGSSe8v7T?1<wcxstRq+N$X6n zC!3aAa#|uwA}K9_QTlfrZ7-4Gdvl8-DJM>L9^abUb?gh#vDRg}_x=_BobOGKANrc* zP)=Y*!4b6bmRr-TCQvFVJYSI0d^#heJIB`LKo%BeW*FiCT-lC3LCf0N&Od8XVuz2> zs%2XMD=bzHfi7Gdx09isQ}4|Oe>+eDv%qn%&qx0#-btOZy8C08v)?|^O3_5wHZ?f1GNiZdIPU}5H>QO$wsPsQI z6|wt+;YZ8C=ek_4TPZ*5BTT=p*P*T*2c;K3I{~jcaUbtL96^ux;J^Q?gXu57KDfJT zGG@r19!TlqNvGh(%rh2ZzhWr*ZcWe{Y{E?}1)l&@?<3tCD*2YM`F0dEH4EpYr_C5U z)`3jM#%j`dCf%Xf1D5U6U5pyLVE<*VG^g8k@D6cFzhmIxET7#9-{~^7F0;N@KtuPA zvd+OLkIf@e*HylzrL6+E0dHH)=h7aq3SI7P2-Vcjvm7^EuP`m49^TSyQ@!agD9+Y( zMTa;*IdmdWTmJfUL|qfuf%4&R1+=c#j`>`$j84Bhe|Y5Mx6i97b4o|Lh8j$=M+N== zxc{R6>;50@tNqOs(iIw}ft{R@`8{_L*alVSY`6visL#afF0^Y!Nk{&QI}l&R{*ch- zz9=&J7jAIKMBy}--r5~JP7Q0e{t-p0u4PM{+0oC%$bDbsuQnX12ym8vxYEn-lh@5| zY>j8cC0miO7h>g=EiXUxPlfad*3!zhRG#Ha{)(D;9khM#ySRhzAGC2u0cl+JqoY~W z!lt08Fv6vYumI0PHR>PYhX=Z}zcrg-Qp19yXg6AuZcRe*3lk51GGIS#xx1}f3ld4P z`HM>}&weyxp!n5X{p&pE;qrxWjPB#st;1AUwom$wp>DMi2Xtd*cGZst(Z<%0H^uzL z$L0DH@rgA}VPW^?DiaM;Oh+t>??iE$(WmYXx%fAE)l7-scckSvU}BHfZgD-ome}fW zI4hg^aK+Xqm%z0RbN3tIe!upP z5m<0i1Q*#29;(nNI!NNzZ*{%RQ-Ujkw-0qjZk`wWkR125R4Pnii2o%2z(ktFxV2jxV7WI<+#oOM7@4GJ6-qHL~D_<)(|CWz&U*o{Qz&jQTx(kKL_~;yftsLci^PTu~ zYS4s04>Z7P-*00HfJp4_zbQu$_UKRZ4>r@O;nG=gb8*g^#|t@m{PS27SnTHsX}rMk z0cD$^1^EC1cpj8X@u*Ydqo8Nn;&p0zH0@)Sw!Tqy#65r2eniCtJ(aCqu z>nm)k!+*vSj3mZr1+aQF#0Fp`un!gyCK&wRt2w3;k7ek?N$e<)V@J_R8QL>YfZp&@^7at60Dul^qm^|bW!}$vNIBiU&CeV z7eJ|0@)fF@J=E!TU4fRp2?P-2_O0r($+Fq^Opl24xO}@I&*Ftf@U0>y|XQ4ZI;b$|zj*1B7_H6W#9PBl7+Y;0NC6 literal 0 HcmV?d00001 diff --git a/files/fr/web/api/window/confirm/index.md b/files/fr/web/api/window/confirm/index.md index f38d89d90cdcf3..4b291c57a56ec0 100644 --- a/files/fr/web/api/window/confirm/index.md +++ b/files/fr/web/api/window/confirm/index.md @@ -1,6 +1,8 @@ --- -title: Window.confirm() +title: "Window : méthode confirm()" slug: Web/API/Window/confirm +l10n: + sourceCommit: 70b1b8ac18d3e3346645d4ee5155f654c83d96e0 --- {{ApiRef("Window")}} @@ -11,8 +13,8 @@ Sous certaines conditions, par exemple au changement d'onglet, le navigateur pou ## Syntaxe -```js -confirm(message); +```js-nolint +confirm(message) ``` ### Paramètres @@ -27,8 +29,8 @@ Un booléen qui indique si l'option « OK » (`true`) ou « Annul ## Exemples ```js -if (window.confirm("Do you really want to leave?")) { - window.open("exit.html", "Thanks for Visiting!"); +if (window.confirm("Souhaitez-vous vraiment quitter le site ?")) { + window.open("exit.html", "Merci de votre visite !"); } ``` @@ -42,7 +44,7 @@ Ces boîtes de dialogue sont des fenêtres modales qui empêchent d'accéder au Il y a également d'autres raisons [d'éviter les boîtes de dialogue pour demander une confirmation](https://alistapart.com/article/neveruseawarning/). -Une autre méthode consiste à utiliser l'élément [``](/fr/docs/Web/HTML/Element/dialog) afin d'afficher des demandes de confirmation. +Une autre méthode consiste à utiliser l'élément HTML [``](/fr/docs/Web/HTML/Element/dialog) afin d'afficher des demandes de confirmation. ## Spécifications From 7a1456919206ecc60fe8a18a1a0ccfb344aaf038 Mon Sep 17 00:00:00 2001 From: Jason Ren <40999116+jasonren0403@users.noreply.github.com> Date: Wed, 20 Sep 2023 21:02:32 +0800 Subject: [PATCH 049/268] [zh-cn]: update TLS page (#15946) --- .../transport_layer_security/index.md | 95 ++++++++++++++++++- 1 file changed, 90 insertions(+), 5 deletions(-) diff --git a/files/zh-cn/web/security/transport_layer_security/index.md b/files/zh-cn/web/security/transport_layer_security/index.md index 36aa98cf3bf7e2..c63a9bb5d52d39 100644 --- a/files/zh-cn/web/security/transport_layer_security/index.md +++ b/files/zh-cn/web/security/transport_layer_security/index.md @@ -1,16 +1,101 @@ --- -title: 传输层安全协议 +title: 传输层安全 slug: Web/Security/Transport_Layer_Security --- -使用传输层安全性协议(TLS)进行的任何连接的安全性在很大程度上取决于密码套件和所选的安全性参数。本文的目的是帮助你确保客户端和服务器之间的机密性和完整性通信。Mozilla 运营安全团队(OpSec)维护了 [服务器端 TLS 参考配置的 Wiki 条目](https://wiki.mozilla.org/Security/Server_Side_TLS)。 +{{QuickLinksWithSubpages("/zh-CN/docs/Web/Security")}} -传输层安全性协议(Transport Layer Security protocol,TLS)是使两个联网应用程序或设备能够安全可靠地交换信息的标准。使用 TLS 的应用程序可以自行选择安全性参数,这可能会对数据的安全性和可靠性产生重大影响。本文对 TLS 进行了概述,并提供了多种在保护内容时需要做出的决策。 +使用传输层安全协议(TLS)进行的任何连接的安全性在很大程度上取决于密码套件和所选的安全性参数。本文的目的是帮助你确保客户端和服务器之间的机密性和完整性通信。Mozilla 运营安全团队(OpSec)维护了[服务器端 TLS 参考配置的 Wiki 条目](https://wiki.mozilla.org/Security/Server_Side_TLS)。 -### 参见 +传输层安全协议(Transport Layer Security protocol,TLS)是使两个联网应用程序或设备能够安全可靠地交换信息的标准。使用 TLS 的应用程序可以自行选择安全性参数,这可能会对数据的安全性和可靠性产生重大影响。本文对 TLS 进行了概述,并提供了多种在保护内容时需要做出的决策。 + +## 历史 + +HTTPS 推出时,是基于 Netscape 公司推出的安全套接字层(SSL)2.0 技术的。不久后,该技术更新为 SSL 3.0,随着使用范围的扩大,显然需要指定一种通用的标准加密技术,以确保所有 web 浏览器和服务器之间的互操作性。1999 年 1 月,[互联网工程任务组](https://www.ietf.org/)(IETF)在 {{RFC(2246)}} 中规定了 TLS 1.0。TLS 的当前版本为 1.3({{RFC(8446)}})。 + +尽管 web 现在使用 TLS 进行加密,但许多人仍然习惯性地将其称为“SSL”。 + +虽然 TLS 可用于任何底层传输协议,但该协议的最初目标是加密 HTTP 流量。使用 TLS 加密的 HTTP 通常被称为 {{Glossary("HTTPS")}}。根据惯例,TLS 加密的网络流量默认在 443 端口交换,而未加密的 HTTP 默认使用 80 端口。HTTPS 仍是 TLS 的一个重要用例。 + +## 在 TLS 上的 HTTP + +TLS 提供三种主要服务,有助于确保与之交换的数据的安全性: + +- 身份验证 + - : 通过认证,通信的每一方都可以验证另一方的身份。 +- 加密 + - : 在用户代理和服务器之间传输数据时对数据进行加密,以防止未经授权的各方读取和解读数据。 +- 完整性 + - : TLS 确保数据在加密、传输和解密过程中不会丢失、损坏、篡改或伪造任何信息。 + +TLS 连接以握手阶段开始,在此阶段,客户端和服务器就共享秘密和重要参数(如密码套件)达成一致。一旦参数确定,就进入数据交换模式,交换应用数据(如 HTTP)。 + +### 密码套件 + +TLS 握手协商的主要参数是[密码套件](https://zh.wikipedia.org/wiki/密码套件)。 + +在 TLS 1.2 及更早版本中,协商密码套件包括一组加密算法,这些算法共同提供了共享秘密的协商、服务器身份验证方法以及用于加密数据的方法。 + +TLS 1.3 中的密码套件主要用于数据加密,密钥协议和身份验证则使用单独的协商方法。 + +不同的软件可能会对相同的密码套件使用不同的名称。例如,OpenSSL 和 GnuTLS 使用的名称与 TLS 标准中的名称不同。Mozilla OpSec 团队关于 TLS 配置的文章中的[密码名称对应表](https://wiki.mozilla.org/Security/Server_Side_TLS#Cipher_names_correspondence_table)列出了这些名称以及有关兼容性和安全级别的信息。 + +### 配置服务器 + +正确配置服务器至关重要。一般来说,应尽量将密码支持限制在与希望连接到网站的浏览器兼容的最新密码上。[Mozilla OpSec TLS 配置指南](https://wiki.mozilla.org/Security/Server_Side_TLS)提供了更多有关推荐配置的信息。 + +为了帮助你配置网站,Mozilla 提供了一个有用的 [TLS 配置生成器](https://ssl-config.mozilla.org/),它可以为以下 Web 服务器生成配置文件: + +- Apache +- Nginx +- Lighttpd +- HAProxy +- Amazon Web Services CloudFormation Elastic Load Balancer + +建议使用[配置生成器](https://ssl-config.mozilla.org/)来创建配置,以满足你的需要;然后将其复制并粘贴到服务器上的相应文件中,并重新启动服务器以接收更改。配置文件可能需要进行一些调整才能包含自定义设置,因此在使用前一定要检查生成的配置文件;安装配置文件时如果不确保任何域名等引用都是正确的,就会导致服务器无法正常工作。 + +## TLS 1.3 + +{{RFC("8446", "TLS 1.3")}} 是对 TLS 的重大修订。TLS 1.3 包含大量改进安全性和性能的变更。TLS 1.3 的目标是: + +- 删除 TLS 1.2 中未使用和不安全的特性。 +- 在设计中加入强大的安全分析。 +- 通过加密更多协议来提高隐私性。 +- 缩短完成握手所需的时间。 + +TLS 1.3 改变了协议的许多基本原理,但保留了以前 TLS 版本的几乎所有基本功能。对于 web 而言,启用 TLS 1.3 不会影响兼容性,但也有极少数例外情况(见下文)。 + +TLS 1.3 的主要更改有: + +- 在大多数情况下,TLS 1.3 的握手在一次往返中完成,从而减少了握手延迟。 +- 服务器可以启用 0-RTT(零往返时间)握手。重新连接服务器的客户端可以立即发送请求,完全消除了 TLS 握手的延迟。虽然 0-RTT 带来的性能提升非常明显,但也存在一定的重放攻击风险,因此在启用此功能前需要谨慎。 +- TLS 1.3 仅支持前向安全模式,除非连接恢复或使用预共享密钥。 +- TLS 1.3 定义了一组 TLS 1.3 独有的新密码套件。这些密码套件全部使用现代的关联数据验证加密(AEAD)算法。 +- 除了建立共享秘密所需的信息外,TLS 1.3 的握手过程都是加密的。这尤其意味着服务器和客户端证书是加密的。但请注意,客户端发送给服务器的服务器标识(服务器名称或 SNI 扩展名)不加密。 +- 许多机制已被禁用:重新协商、通用数据压缩、[数字签名算法](https://zh.wikipedia.org/wiki/数字签名算法)(DSA)证书、静态 RSA 密钥交换和使用自定义 Diffie-Hellman(DH)组的密钥交换。 + +TLS 1.3 的草案版本已经实现。一些浏览器已启用 TLS 1.3,包括 0-RTT 模式。启用 TLS 1.3 的 web 服务器可能需要调整配置,以便 TLS 1.3 成功运行。 + +TLS 1.3 只增加了一个重要的新用例。0-RTT 握手可为网络等对延迟敏感的应用带来显著的性能提升。启用 0-RTT 需要额外的步骤,既要确保成功部署,又要管理重放攻击的风险。 + +TLS 1.3 中取消了重新协商功能,这可能会影响到一些依赖使用证书进行客户端身份验证的 web 服务器。一些 web 服务器会使用重新协商来确保客户端证书已加密,或仅在请求某些资源时才请求客户端证书。为了保护客户证书的隐私,TLS 1.3 握手的加密可确保客户证书是加密的;但这可能需要对软件进行一些修改。TLS 1.3 支持使用证书进行反应式客户端验证,但并未广泛实施。替代机制正在开发中,也将支持 HTTP/2。 + +## 移除对旧 TLS 版本的支持 + +为了帮助实现更现代、更安全的 web,所有主流浏览器都在 2020 年初开始取消对 TLS 1.0 和 1.1 的支持。需要确保你的 web 服务器支持 TLS 1.2 或 1.3。 + +从版本 74 开始,Firefox 浏览器在连接使用旧版 TLS 的服务器时会返回 [Secure Connection Failed](https://support.mozilla.org/en-US/kb/secure-connection-failed-firefox-did-not-connect) 错误([Firefox bug 1606734](https://bugzil.la/1606734))。 + +## TLS 握手超时值 + +如果 TLS 握手由于某种原因开始变得缓慢或反应迟钝,用户的体验就会受到严重影响。为了缓解这一问题,现代浏览器已经实现了握手超时: + +- 从版本 58 开始,Firefox 浏览器实现了 TLS 握手超时,默认值为 30 秒。超时值可通过编辑 about:config 中的 `network.http.tls-handshake-timeout` 首选项来更改。 + +## 参见 - [Mozilla SSL 配置生成器](https://ssl-config.mozilla.org)和 [Cipherlist.eu](https://cipherlist.eu/) 帮助你为服务器生成配置文件以保护你的站点。 -- Mozilla 运营安全(OpSec)团队维护了一个带有[引用的 TLS 配置](https://wiki.mozilla.org/Security/Server_Side_TLS)的 wiki 页面。 +- Mozilla 运营安全(OpSec)团队维护了一个带有[参考的 TLS 配置](https://wiki.mozilla.org/Security/Server_Side_TLS)的 wiki 页面。 - [Mozilla Observatory](https://observatory.mozilla.org/)、[SSL Labs](https://www.ssllabs.com/ssltest/) 以及 [Cipherscan](https://github.com/mozilla/cipherscan) 可以帮助你测试站点以了解其 TLS 配置的安全性。 - [安全上下文](/zh-CN/docs/Web/Security/Secure_Contexts) - [Strict-Transport-Security](/zh-CN/docs/Web/HTTP/Headers/Strict-Transport-Security) HTTP 标头 From 041b3d4b638c8c5ac6533e30da4494ed537bff6b Mon Sep 17 00:00:00 2001 From: Jason Ren <40999116+jasonren0403@users.noreply.github.com> Date: Wed, 20 Sep 2023 21:03:15 +0800 Subject: [PATCH 050/268] [zh-cn]: update html element

(#15947) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: A1lo --- files/zh-cn/web/html/element/p/index.md | 152 ++++++++++++++++++++++-- 1 file changed, 139 insertions(+), 13 deletions(-) diff --git a/files/zh-cn/web/html/element/p/index.md b/files/zh-cn/web/html/element/p/index.md index 7a9933e99657df..b42d8dad8ec3e8 100644 --- a/files/zh-cn/web/html/element/p/index.md +++ b/files/zh-cn/web/html/element/p/index.md @@ -1,38 +1,164 @@ --- -title:

+title:

:段落元素 slug: Web/HTML/Element/p --- {{HTMLSidebar}} -**HTML \

**元素(或者说 HTML 段落元素)表示文本的一个段落。该元素通常表现为一整块与相邻文本分离的文本,或以垂直的空白隔离或以首行缩进。另外,\

是[块级元素](/zh-CN/docs/HTML/Block-level_elements)。 - -- _[内容分类](/zh-CN/docs/Web/HTML/Content_categories)_ [Flow content](/zh-CN/docs/Web/HTML/Content_categories#Flow_content), palpable content. -- _允许的内容_ [Phrasing content](/zh-CN/docs/Web/HTML/Content_categories#Phrasing_content). -- *标签省略*起始标签是必需的,结束标签在以下情形中可以省略。\

元素后紧跟{{HTMLElement("address")}}, {{HTMLElement("article")}}, {{HTMLElement("aside")}}, {{HTMLElement("blockquote")}}, {{HTMLElement("div")}}, {{HTMLElement("dl")}}, {{HTMLElement("fieldset")}}, {{HTMLElement("footer")}}, {{HTMLElement("form")}}, {{HTMLElement("h1")}}, {{HTMLElement("h2")}}, {{HTMLElement("h3")}}, {{HTMLElement("h4")}}, {{HTMLElement("h5")}}, {{HTMLElement("h6")}}, {{HTMLElement("header")}}, {{HTMLElement("hr")}}, {{HTMLElement("menu")}}, {{HTMLElement("nav")}}, {{HTMLElement("ol")}}, {{HTMLElement("pre")}}, {{HTMLElement("section")}}, {{HTMLElement("table")}}, {{HTMLElement("ul")}}或另一个{{HTMLElement("p")}}元素;或者父元素中没有其他内容了,而且父元素不是{{HTMLElement("a")}}元素 -- *允许的父元素*任何接受[flow content](/zh-CN/docs/Web/HTML/Content_categories#Flow_content)的元素 -- _DOM 接口_ {{domxref("HTMLParagraphElement")}} +[HTML](/zh-CN/docs/Web/HTML) **`

`** 元素表示文本的一个段落。在视觉媒体中,段落通常表现为用空行和/或首行缩进与相邻段落分隔的文本块,但 HTML 段落可以是相关内容的任何结构分组,如图像或表格字段。 + +段落是[块级元素](/zh-CN/docs/Glossary/Block-level_content),如果在关闭的 `

` 标签之前解析了另一个块级元素,则该标签将自动关闭。请参阅下面的“标签省略”。 + +{{EmbedInteractiveExample("pages/tabbed/p.html", "tabbed-standard")}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 内容分类 + + 流式内容、可感知内容。 +
允许的内容类型 + 短语内容。 +
标签省略 + 开始标签是必要的。如果 {{HTMLElement("p")}} 元素后面紧跟 {{HTMLElement("address")}}、{{HTMLElement("article")}}、{{HTMLElement("aside")}}、{{HTMLElement("blockquote")}}、{{HTMLElement("div")}}、{{HTMLElement("dl")}}、{{HTMLElement("fieldset")}}、{{HTMLElement("footer")}}、{{HTMLElement("form")}}、{{HTMLElement("Heading_Elements", "h1")}}、{{HTMLElement("Heading_Elements", "h2")}}、{{HTMLElement("Heading_Elements", "h3")}}、{{HTMLElement("Heading_Elements", "h4")}}、{{HTMLElement("Heading_Elements", "h5")}}、{{HTMLElement("Heading_Elements", "h6")}}、{{HTMLElement("header")}}、{{HTMLElement("hr")}}、{{HTMLElement("menu")}}、{{HTMLElement("nav")}}、{{HTMLElement("ol")}}、{{HTMLElement("pre")}}、{{HTMLElement("section")}}、{{HTMLElement("table")}}、{{HTMLElement("ul")}} 或其他 {{HTMLElement("p")}} 元素,或者父元素中已没有内容,且父元素不是 {{HTMLElement("a")}} 元素,则可以省略结束标签。 +
允许的父元素 + 任何接受流式内容的元素。 +
隐式 ARIA 角色 + paragraph +
允许的 ARIA 角色任意
DOM 接口{{domxref("HTMLParagraphElement")}}
## 属性 这个元素包含[全局属性](/zh-CN/docs/Web/HTML/Global_attributes)。 -\

元素的 **align** 属性已被弃用,请不要使用。 +> **备注:** `

` 标签的 `align` 属性已被弃用,请不要使用。 ## 示例 +### HTML + ```html

这是第一个段落。这是第一个段落。这是第一个段落。这是第一个段落。

这是第二个段落。这是第二个段落。这是第二个段落。这是第二个段落。

``` -输出如下: +### 运行结果 + +{{EmbedLiveSample('示例')}} + +## 为段落添加样式 + +默认情况下,浏览器会用一个空行来分隔段落。其他分隔方法,如首行缩进,可以通过 {{glossary("CSS")}} 来实现: + +### HTML + +```html +

+ 用空行分隔段落最便于读者扫描,但也可以通过缩进首行来分隔段落。这样做通常是为了减少所占空间,例如节省印刷用纸。 +

+ +

+ 学校试卷和草稿等需要编辑的写作,会同时使用空行和缩进进行分隔。在完成的作品中,将两者结合起来会被认为是多余和业余的。 +

+ +

+ 在非常古老的文字中,段落之间用一种特殊的字符:¶(称为段落符号)分隔。如今,这个符号太密集了,难以阅读。 +

+ +

+ 究竟有多难阅读?自己试一下: + +

+``` + +### CSS + +```css +p { + margin: 0; + text-indent: 3ch; +} + +p.pilcrow { + text-indent: 0; + display: inline; +} +p.pilcrow + p.pilcrow::before { + content: " ¶ "; +} +``` + +### JavaScript + +```js +document.querySelector("button").addEventListener("click", (event) => { + document.querySelectorAll("p").forEach((paragraph) => { + paragraph.classList.toggle("pilcrow"); + }); + + [event.target.innerText, event.target.dataset.toggleText] = [ + event.target.dataset.toggleText, + event.target.innerText, + ]; +}); +``` -{{ EmbedLiveSample('示例') }} +### 运行结果 -## 注意 +{{EmbedLiveSample('为段落添加样式')}} -使用[CSS](/zh-CN/docs/Web/CSS) {{cssxref("margin")}}属性去改变段落之间的间隙,**不要**在段落之间插入空的段落元素或者{{HTMLElement("br")}}元素。 +## 无障碍考虑 + +将内容分成段落有助于使页面更易于访问。屏幕阅读器和其他辅助技术提供的快捷方式可以让用户跳到下一个或上一个段落,让他们可以略读内容,就像留白可以让视觉用户跳来跳去一样。 + +使用空的 `

` 元素在段落之间添加空格,对于使用读屏技术浏览的人来说是有问题的。屏幕阅读器可能会显示段落的存在,但不会显示其中包含的任何内容——因为没有内容。这会让使用屏幕阅读器的人感到困惑和沮丧。 + +如果需要额外的空间,可以使用 {{glossary("CSS")}} 属性,如 {{cssxref("margin")}} 来创建效果: + +```css +p { + margin-bottom: 2em; /* 增加段落之后的空白 */ +} +``` ## 规范 From 7720a5e00702cd911d9911adb42483777b749fc6 Mon Sep 17 00:00:00 2001 From: PADAone <50942816+yo-goto@users.noreply.github.com> Date: Mon, 18 Sep 2023 13:20:21 +0900 Subject: [PATCH 051/268] =?UTF-8?q?fix:=206=20primitive=20data=20types=20?= =?UTF-8?q?=E2=86=92=207=20primitive=20data=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/ja/glossary/primitive/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/ja/glossary/primitive/index.md b/files/ja/glossary/primitive/index.md index 6c052d288244f9..55c0f96a59459e 100644 --- a/files/ja/glossary/primitive/index.md +++ b/files/ja/glossary/primitive/index.md @@ -5,7 +5,7 @@ l10n: sourceCommit: 72e6429af2f0ad138223623fb2c86087a008d4dd --- -{{Glossary("JavaScript")}} において、**プリミティブ** (primitive、プリミティブ値、プリミティブデータ型) は{{Glossary("object","オブジェクト")}}でなく、{{glossary("method","メソッド")}}を持たないデータのことです。 6 種類のプリミティブデータ型があります。 +{{Glossary("JavaScript")}} において、**プリミティブ** (primitive、プリミティブ値、プリミティブデータ型) は{{Glossary("object","オブジェクト")}}でなく、{{glossary("method","メソッド")}}を持たないデータのことです。 7 種類のプリミティブデータ型があります。 - {{Glossary("string","文字列")}} - {{Glossary("number","数値")}} From 39563fc576cda4d8cf65aa9df5b1d1d212053d63 Mon Sep 17 00:00:00 2001 From: wonseok Date: Thu, 21 Sep 2023 07:29:07 +0900 Subject: [PATCH 052/268] =?UTF-8?q?ko:=20203=20status=20=EB=B2=88=EC=97=AD?= =?UTF-8?q?=20(#15888)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ko: 203 status 번역 --- files/ko/web/http/status/203/index.md | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 files/ko/web/http/status/203/index.md diff --git a/files/ko/web/http/status/203/index.md b/files/ko/web/http/status/203/index.md new file mode 100644 index 00000000000000..64fd43522dae73 --- /dev/null +++ b/files/ko/web/http/status/203/index.md @@ -0,0 +1,28 @@ +--- +title: 203 Non-Authoritative Information +slug: Web/HTTP/Status/203 +l10n: + sourceCommit: 0880a90f3811475d78bc4b2c344eb4146f25f66c +--- + +{{HTTPSidebar}} + +The HTTP **`203 Non-Authoritative Information`** 는 요청이 성공했지만 오리진 서버의 {{HTTPStatus("200")}} (`OK`) 응답에서 {{Glossary("Proxy server", "proxy")}}에 의해 포함된 페이로드가 수정되었음을 나타냅니다. + +`203` 응답은 {{HTTPHeader("Warning")}} 헤더 코드의 변환 적용을 의미하는 [`214`](/ko/docs/Web/HTTP/Headers/Warning#warning_codes) 값과 유사하며, 모든 상태 코드가 있는 응답에 적용할 수 있다는 추가적인 이점이 있습니다. + +## 상태 + +```http +203 Non-Authoritative Information +``` + +## 명세 + +{{Specifications}} + +## 같이 보기 + +- {{HTTPStatus("200")}} +- {{Glossary("Proxy server")}} +- {{HTTPHeader("Warning")}} From b6229a9bd87d43da95addc853210518cb84acaac Mon Sep 17 00:00:00 2001 From: pirateTurtle <75886763+wogha95@users.noreply.github.com> Date: Thu, 21 Sep 2023 07:33:33 +0900 Subject: [PATCH 053/268] [ko] translate `accept-post` (#15493) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * accept-post 1차 번역 완료 * accept-post 소제목 용어 가이드 반영 --- .../ko/web/http/headers/accept-post/index.md | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 files/ko/web/http/headers/accept-post/index.md diff --git a/files/ko/web/http/headers/accept-post/index.md b/files/ko/web/http/headers/accept-post/index.md new file mode 100644 index 00000000000000..d61a5092834e4d --- /dev/null +++ b/files/ko/web/http/headers/accept-post/index.md @@ -0,0 +1,64 @@ +--- +title: Accept-Post +slug: Web/HTTP/Headers/Accept-Post +l10n: + sourceCommit: 0880a90f3811475d78bc4b2c344eb4146f25f66c +--- + +{{HTTPSidebar}} + +**`Accept-Post`** 응답 HTTP 헤더는 HTTP 포스트 요청에 대해 서버가 수락하는 [미디어 유형](/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types)을 알립니다. + +모든 메소드에 대한 응답으로 **`Accept-Post`** 를 사용하면 요청된 리소스에서 `POST`가 허용됨을 의미합니다. 헤더의 모든 문서/미디어 형식은 해당 문서 형식이 허용됨을 추가로 나타냅니다. + +예를 들어, 지원되지 않는 미디어 유형이 포함된 `POST` 요청을 수신하는 서버는 {{HTTPStatus("415")}} `Unsupported Media Type`과 하나 이상의 지원되는 미디어 유형을 참조하는 **`Accept-Post`** 헤더를 사용하여 응답할 수 있습니다. + +> **참고:** IANA 레지스트리는 [공식 콘텐츠 인코딩의 전체 목록](https://www.iana.org/assignments/http-parameters/http-parameters.xml#http-parameters-1)을 유지 관리합니다. + + + + + + + + + + + + +
헤더 유형{{Glossary("Response header", "응답 헤더")}}
{{Glossary("Forbidden header name", "금지된 헤더 이름")}}
+ +## 구문 + +```http +Accept-Post: / +Accept-Post: /* +Accept-Post: */* +``` + +> **참고:** `Accept-Post` 헤더는 기본 설정 개념이 없다는 점(즉, `q` 인수가 없다는 점)을 제외하면 {{HTTPHeader("Accept")}}와 동일한 방식으로 미디어 범위를 지정합니다. 이는 `Accept-Post`가 응답 헤더인 반면 `Accept`는 요청 헤더이기 때문입니다. + +## 지시어 + +없습니다. + +## 예제 + +```http +Accept-Post: application/example, text/example +Accept-Post: image/webp +Accept-Post: */* +``` + +## 명세서 + +{{Specifications}} + +## 브라우저 호환성 + +브라우저 호환성은 이 헤더와 관련이 없습니다. 헤더는 서버에서 전송되며 사양은 클라이언트 동작을 정의하지 않습니다. + +## 같이 보기 + +- HTTP 메서드 {{HTTPMethod("POST")}} +- HTTP 시맨틱 및 컨텍스트 {{RFC("7231", "POST", "4.3.3")}} From 27a6c97500fca135959a1aece983fd62aed7da87 Mon Sep 17 00:00:00 2001 From: KyeongSang Yu Date: Thu, 21 Sep 2023 07:35:55 +0900 Subject: [PATCH 054/268] [ko] add translation to typesetting a homepage in CSS styling text (#15130) * add : translation of typesetting a homepage * delete image file --- .../typesetting_a_homepage/index.md | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 files/ko/learn/css/styling_text/typesetting_a_homepage/index.md diff --git a/files/ko/learn/css/styling_text/typesetting_a_homepage/index.md b/files/ko/learn/css/styling_text/typesetting_a_homepage/index.md new file mode 100644 index 00000000000000..dcd4682c181027 --- /dev/null +++ b/files/ko/learn/css/styling_text/typesetting_a_homepage/index.md @@ -0,0 +1,98 @@ +--- +title: 커뮤니티 대학 홈페이지 레이아웃 구성하기 +slug: Learn/CSS/Styling_text/Typesetting_a_homepage +l10n: + sourceCommit: 751d58669499de0c6ea0d5b356e0e1448418c5d3 +--- + +{{LearnSidebar}}{{PreviousMenu("Learn/CSS/Styling_text/Web_fonts", "Learn/CSS/Styling_text")}} + +이 평가에서는 커뮤니티 대학 홈페이지의 텍스트 스타일을 지정하도록 하여 이 모듈에서 다룬 모든 텍스트 스타일링 기법에 대한 이해도를 테스트합니다. 여러분은 그 과정에서 재미를 느낄 수 있습니다. + + + + + + + + + + + + +
필요한 사전 지식: + 이 평가를 진행하기 전에 이 모듈의 모든 문서를 이미 살펴봤어야 합니다. +
목표:CSS 텍스트 스타일링 기법에 대한 이해도를 테스트합니다.
+ +## 시작 지점 + +이 평가를 시작하기 위해서는 다음과 같이 해야 합니다. + +- 연습용 [HTML](https://github.com/mdn/learning-area/blob/main/css/styling-text/typesetting-a-homepage-start/index.html) 및 [CSS](https://github.com/mdn/learning-area/blob/main/css/styling-text/typesetting-a-homepage-start/style.css) 파일과 제공된 [외부 링크 아이콘](https://github.com/mdn/learning-area/blob/main/css/styling-text/typesetting-a-homepage-start/external-link-52.png)을 가져옵니다. +- 여러분의 로컬 컴퓨터에 복사본을 만듭니다. + +또는, [JSBin](https://jsbin.com/)이나 [Glitch](https://glitch.com/)와 같은 사이트를 사용하여 평가를 수행할 수도 있습니다. 이러한 온라인 편집기 중 하나에 HTML을 붙여 넣고 CSS를 입력한 다음, [이 URL](https://mdn.github.io/learning-area/css/styling-text/typesetting-a-homepage-start/external-link-52.png)을 사용하여 배경 이미지를 지정할 수 있습니다. 사용 중인 온라인 편집기에 별도의 CSS 패널이 없는 경우, 문서의 head 부분의 `