Firefox 75: Metas para abril

Incluso en los actuales tiempos de aislamiento, nuestros equipos de ingeniería han sabido adaptarse, enfocarse y trabajar duro para ofrecer otra nueva y emocionante versión de Firefox al mundo. En lo que respecta a las herramientas para desarrollador, a partir de ahora encontramos un sistema de evaluación instantánea en la consola, puntos de interrupción de eventos para WebSockets y muchas otras cosas más.

En el lado de la plataforma web, las nuevas adiciones incluyen la carga diferida (lazy loading) de HTML para imágenes, las funciones min(), max() y clamp() de CSS, los campos public static class y otras novedades al soporte de la API Web Animations.

Como siempre, sigue leyendo para conocer los aspectos más destacados o consulta la lista completa de adiciones en los siguientes artículos:

Adiciones a las herramientas para desarrolladores

Comencemos por revisar las adiciones más interesantes de las herramientas para desarrolladores de la versión 75.

Evaluación instantánea de las expresiones de consola

La captura de pantalla muestra la consola web con una evaluación instantánea de las expresiones de la consola.

Evaluar expresiones en la consola es una forma rápida de analizar el estado de su aplicación, consultar el DOM o, simplemente, probar las API de JavaScript.
Ahora es más fácil prototipar código más largo con el modo multilínea de la consola de Firefox, que se vuelve cada vez más cómodo de usar, más similar a un entorno de desarrollo como tal.

El nuevo sistema de evaluación instantánea muestra una vista previa de los resultados de la expresión actual a medida que se escribe, de forma similar a editores como Quokka.js. En caso de que las expresiones introducidas en la consola no produzcan efectos secundarios, sus resultados se previsualizarán mientras se escriben.

Se ha trabajado mucho para conseguir que la vista previa sea lo más fluida posible. Los elementos de los nodos del DOM aparecen resaltados en los resultados. La herramienta de autocompletar código recomienda métodos y propiedades en base al tipo del resultado. Además, se puede obtener una vista previa de los errores para poder corregir las expresiones más rápido.

Mejor inspección y medición

La medición del área ahora es redimensionable

Una captura de pantalla que muestra la herramienta de medición de érea en las herramientas para desarrolladores, que permite dibujar rápidamente rectángulos sobre la página para medir la altura, la anchura y la longitud diagonal de áreas específicas. Mediante la herramienta de medición de área opcional en las herramientas para desarrolladores, puede dibujar rápidamente rectángulos sobre su página para medir la altura, la anchura y la longitud diagonal de áreas específicas. Puede habilitar la herramienta en la configuración, bajo "Botones disponibles en la caja de herramientas". Gracias a Sebastian Zartner [:sebo], estos rectángulos ahora tienen controles para redimensionar que permiten ajustarlos con precisión.

Usar XPath para encontrar elementos DOM

Las herramientas de automatización suelen hacer uso de las consultas XPath para indicarle al software qué elementos buscar para interactuar. Gracias, de nuevo, a sebo, ahora puede usar XPath en la búsqueda de HTML del Inspector para los elementos del DOM. Esto hace que sea más fácil probar expresiones y afinar las consultas con precisión en entornos reales.

Puntos de interrupción de eventos para WebSockets

Las características de inspección de WebSockets han mejorado en todas las versiones recientes de las herramientas de desarrollo. Esta vez tenemos buenos aportes a la depuración, gracias a una contribución del talentoso Chujun Lu.

Ahora tenemos la opción de pausar o registrar los manejadores de eventos de WebSocket cuando estos se ejecuten. Utilice los puntos de interrupción para event listeners, recientemente agregados en el depurador. Cuando selecciona la opción de registro, se guardarán los datos del evento y el manejador que se ha ejecutado sin detener la ejecución. Entre otras novedades del inspector de WebSocket, el filtro de mensajes ahora admite expresiones regulares gracias a nuestro ampliamente conocido colaborador Outvi V.

Adiciones de red

Se ha realizado una gran cantidad de trabajo en mejorar la calidad y el rendimiento del panel de red para Firefox 75. Esta versión incorpora importantes avances en cuanto a la rapidez con la que se procesan las solicitudes simultáneas de ejecución rápida sin afectar a la CPU.

En el lado de la interfaz, el colaborador Florens Verschelde dirigió la propuesta y el diseño de los nuevos bordes entre columnas, pensados para facilitar la legibilidad. Ahora podemos observar cómo el diseño es más consistente con el aspecto general de las herramientas de desarrollo. Los botones de filtro también son más legibles, con un mejor contraste entre estados, gracias al colaborador Vitalii.

El panel de bloqueo de peticiones sirve para probar la resistencia de un sitio cuando fallan las solicitudes coincidentes. Ahora permite patrones comodín con "*". Gracias a Duncan Dean por tal contribución.

Funciones de acceso temprano en las herramientas de desarrollo

Developer Edition es el canal de prelanzamiento de Firefox, que proporciona acceso temprano a las nuevas herramientas y funciones de la plataforma. Su configuración también facilita más características para los desarrolladores de forma predeterminada. Nos complace poder llevar nuevas funciones rápidamente a Developer Edition para poder conocer sus comentarios, como los de los siguientes aspectos destacados.

Rastros de pila asíncrona para el depurador y la consola

El código de JavaScript moderno depende en gran medida del uso de async/await, además de otras operaciones asíncronas como eventos, promesas y temporizadores. Gracias a una mejor integración con el motor de JavaScript, ahora se captura la ejecución asincrónica para proporcionar una imagen más completa.

Las pilas de llamadas asíncronas en el depurador le permiten ver eventos, temporizadores y llamadas a funciones basadas en promesas que se ejecutan en diferentes momentos de tiempo. En la consola, las pilas asíncronas facilitan la búsqueda de las causas raíz de los errores.

Actualizaciones de la plataforma web

Observemos lo que nos proporciona Firefox 75 en términos de actualizaciones de la plataforma web.

Carga diferida de HTML para imágenes

La carga diferida (lazy load) es una estrategia común para mejorar el rendimiento al identificar recursos como no bloqueantes (no críticos) y cargarlos solo cuando sea necesario, en lugar de cargarlos todos de inmediato. Las imágenes son uno de los elementos más comúnmente responsables de la lentitud en la carga de las aplicaciones web.

Para facilitar la carga diferida de imágenes, hemos introducido soporte para el atributo load en el elemento HTML <img>. Establecer el valor en lazy le indicará al navegador que posponga la carga de imágenes que están fuera de la pantalla hasta que el desplazamiento del usuario se aproxime a ellas. El otro único valor posible es eager, que es el predeterminado, como era de esperar.

<img src="image.jpg" loading="lazy" alt="..." />

Puede determinar si una imagen determinada ha terminado de cargar examinando el valor de su propiedad booleana complete. Nota: El evento load se ejecuta cuando se ha terminado de cargar todo el contenido con el atributo eager. En ese punto, es posible (o incluso probable) que haya imágenes que deban cargarse en diferido dentro de pantalla y que aún no lo hayan hecho.

Nota: Chrome también ha implementado un soporte experimental para la carga diferida de contenidos <iframe>, pero esto aún no es estándar. Por nuestro lado, estamos esperando hasta que se haya estandarizado.

CSS min(), max() y clamp()

¡Algunas nuevas y emocionantes adiciones de CSS este mes! Hemos agregado soporte para tres funciones CSS muy útiles que, a pesar de estar estrechamente relacionadas entre sí, tienen diferentes propósitos:

  • min() — acepta uno o más posibles valores o cálculos entre los que elegir, y garantiza que el valor utilizado en todas las situaciones sea el más pequeño de entre las posibilidades. En la práctica, esto proporciona un rango de valores para diseños responsivos, junto con un valor máximo permitido.
  • max() — acepta uno o más posibles valores o cálculos entre los que elegir, y garantiza que el valor utilizado en todas las situaciones sea el más grande de entre las posibilidades. En la práctica, esto proporciona un rango de valores para diseños responsivos, junto con un valor mínimo permitido.
  • clamp() — acepta tres valores o cálculos: un mínimo, un preferido y un máximo. Se utilizará el mínimo o el máximo si el valor calculado cae por debajo del mínimo o por encima del máximo, respectivamente. Si el valor calculado cae entre ambos, se usará el valor preferido. Esto permite que el valor de la propiedad se adapte a los cambios en el elemento o la página a la que está asignado, al mismo tiempo que permanece entre los valores mínimo y máximo.

Estas funciones son muy útiles para un diseño responsivo, y permiten ahorrar tiempo y código haciendo cosas que anteriormente se podían hacer usando una combinación de min-width, width y max-width, múltiples media queries o, incluso, JavaScript.

CSS min(), max() y clamp() en acción

Estudiemos el siguiente ejemplo:

html { font-family: sans-serif; } body { margin: 0 auto; width: min(1000px, calc(70% + 100px)); } h1 { letter-spacing: 2px; font-size: clamp(1.8rem, 2.5vw, 2.8rem) } p { line-height: 1.5; font-size: max(1.2rem, 1.2vw); }

Aquí, tenemos el ancho del body establecido en min(1000px, calc(70% + 100px)), lo que significa que, en viewports más amplios, el contenido del body tendrá una anchura de 1000px. En viewports más estrechos, el contenido del body será un 70% del ancho del viewport más 100px (hasta que el resultado de este cálculo sea 1000px o más).

El tamaño de fuente del encabezado de nivel superior se establece en clamp(1.8rem, 2.5vw, 2.8rem). Por lo tanto, tendrá un mínimo de 1.8rem y un máximo de 2.8rem. Entre esos valores, se activará el valor ideal de 2.5vw, por lo que veremos crecer el texto del encabezado, y reducirse en los anchos de viewport donde 2.5vw se calcule como mayor que 1.8rem, pero menor que 2.8rem.

El tamaño de fuente del párrafo se establece en max(1.2rem, 1.2vw), lo que significa que tendrá un mínimo de 1.2rem. Pero comenzará a crecer en el momento en que el valor calculado de 1.2vw sea mayor que el valor calculado de 1.2rem.

Se puede ver esto en acción en nuestro sencillo ejemplo de min(), max(), clamp().

Funciones del lenguaje JavaScript

Ha habido algunas adiciones interesantes de JavaScript en la versión 75.

En primer lugar, ahora tenemos campos public static class. Son útiles cuando queremos que un campo exista solo una vez por clase, pero no en cada instancia de clase que se cree. Esto es particularmente relevante para la caché, la configuración fija o cualquier otro tipo de información que no haga falta replicar en todas las instancias. La sintaxis básica tiene este aspecto:

class ClassWithStaticField { static staticField = &apos;static field&apos; } console.log(ClassWithStaticField.staticField) // expected output: "static field"​

A continuación, tenemos otra mejora a la funcionalidad de internacionalización (i18n) con la adición de Intl.Locale, un constructor estándar incorporado que representa un identificador de configuración regional Unicode. Por ejemplo, podría crear un objeto de configuración regional para el coreano así:

const korean = new Intl.Locale(&apos;ko&apos;, { script: &apos;Kore&apos;, region: &apos;KR&apos;, hourCycle: &apos;h24&apos;, calendar: &apos;gregory&apos; });

Y, luego, retorna las propiedades del objeto como cabría esperar:

console.log(korean.hourCycle, japanese.hourCycle); // expected output: "h24" "h12"

Adiciones para formularios

Tenemos un par de adiciones útiles específicas para la de API de formulario en Firefox 75:

  • La interfaz HTMLFormElement ahora tiene un nuevo método, requestSubmit(). A diferencia del antiguo (y aún disponible) método submit(), requestSubmit() actúa como si se hubiera hecho clic en un botón de enviar (submit) concreto, en lugar de, simplemente, enviar los datos del formulario al destinatario. Por lo tanto, se ejecuta el evento submit y se verifica la validez del formulario antes de enviar los datos.
  • El evento submit ahora está representado por un objeto de tipo SubmitEvent en lugar de un simple Event. SubmitEvent incluye una nueva propiedad submitter que devuelve el Element invocado para activar el envío del formulario. Con este evento, podemos disponer de un único manejador para eventos submit que puede discernir cuál de los múltiples botones o enlaces de submit se ha utilizado para enviar el formulario.

Mejoras en la API de Animaciones Web (Web Animations)

En la versión 75, hemos añadido una serie de nuevas características de la API Web Animations, haciendo que esta especificación sea aún más interesante y útil.

Fotogramas clave con inicio o final implícitos

A partir de ahora, se puede establecer un estado inicial o final solo para una animación (es decir, un único fotograma clave o keyframe). A continuación, el navegador inferirá el otro extremo de la animación, si puede. Por ejemplo, veamos esta sencilla animación: el objeto del fotograma clave se ve así:

let rotate360 = [ { transform: &apos;rotate(360deg)&apos; } ];

Solo hemos especificado el estado final de la animación, y el inicial está implícito.

Eliminar automáticamente animaciones de relleno

Es posible activar una gran cantidad de animaciones en el mismo elemento. Si son indefinidas (es decir, llenan hacia adelante), se podría generar una lista de animaciones enorme que produciría un desbordamiento de memoria. Por esta razón, hemos implementado la parte de la especificación de Web Animations que elimina automáticamente las animaciones de relleno hacia adelante, a menos que el desarrollador indique explícitamente que quiere conservarlas.

Esto se puede ver acción en nuestra sencilla demostración de sustitución de animaciones indefinidas. Las características de JavaScript implicadas son las siguientes:

  • animation.commitStyles() — ejecute este método para confirmar el estado final del estilo de una animación en el elemento que se está animando, incluso después de que se haya eliminado dicha animación. Provocará que el estado final del estilo se escriba en el elemento que se está animando, en la forma de propiedades de un atributo de estilo.
  • animation.onremove — permite ejecutar un controlador de eventos que se activa cuando se elimina la animación (es decir, se ubica en un estado de reemplazo activo).
  • animation.persist() — cuando se desea explícitamente que se conserven las animaciones hay que invocar persist().
  • animation.replaceState — devuelve el estado de reemplazo de la animación. Este será active si la animación ha sido eliminada, o persisted si se ha invocado persist().

Líneas de Tiempo (Timelines)

El getter Animation.timeline o las funciones Document.timeline, DocumentTimeline y AnimationTimeline ahora están habilitados de manera predeterminada, lo que significa que ya se puede acceder a la información de la línea de tiempo de su animación. Esta característica es valiosísima para devolver valores de tiempo con propósitos de sincronización.

Por defecto, la línea de tiempo de la animación y la del documento son las mismas.

Obtener animaciones activas

Por último, pero no menos importante, los métodos Document.getAnimations() y Element.getAnimations() ahora estén habilitados por defecto. Respectivamente, permiten devolver una matriz de todas las animaciones activas en un documento completo o en un elemento específico.

Anotaciones ARIA

En Firefox 75 (en Linux y Windows), veré la adición de soporte para un conjunto de nuevas características de accesibilidad conocidas colectivamente como anotaciones ARIA, que se publicarén en la próxima versión 1.3 de la especificación WAI-ARIA. Estas características hacen posible crear anotaciones accesibles dentro de los documentos web. Los casos de uso típicos incluyen sugerencias de edición (es decir, una adición y/o eliminación en un documento editable) y comentarios (por ejemplo, un comentario editorial relacionado con una parte de un documento en revisión).

Todavía no hay soporte disponible para las anotaciones ARIA en lectores de pantalla, pero pronto podremos utilizar estos nuevos roles y demás atributos. Para ver ejemplos y más información de compatibilidad, lea las anotaciones de ARIA en MDN.

Extensiones del navegador

Se han añadido dos nuevos browserSettings a la API de WebExtensions: zoomFullPage para ampliar el texto en una pégina y zoomSiteSpecific, que determina si el zoom se aplica solo a la pestaña activa o a todas las pestañas del mismo sitio.

Resumen

Eso ha sido todo. Hemos incluido nuevas características interesantes en Firefox 75. ¡No dudes en echarles un vistazo y diviértete probando! Como siempre, siéntase libre de dar us opiniones y formular sus preguntas en los comentarios.

About Chris Mills

Chris Mills is a senior tech writer at Mozilla, where he writes docs and demos about open web apps, HTML/CSS/JavaScript, A11y, WebAssembly, and more. He loves tinkering around with web technologies, and gives occasional tech talks at conferences and universities. He used to work for Opera and W3C, and enjoys playing heavy metal drums and drinking good beer. He lives near Manchester, UK, with his good lady and three beautiful children.

More articles by Chris Mills…

Firefox 75: 四月新氣象

即使在這段隔離的時期,我們的工程團隊也已經調整好步調,保持專注並努力工作,並獻上令人興奮的新版Firefox。在開發人員工具方面,你可以在網頁主控台中使用即時求值、WebSockets事件斷點以及許多其他功能。在網頁平台方面,新增的功能包括HTML延遲載入圖片、CSS min()max()clamp()函數、公開靜態類別屬性以及支援網頁動畫API附加功能等。

與往常一樣,請點擊下方閱讀重點,或在下文瀏覽所有新增功能的完整列表:

新增開發人員工具

讓我們先來看看Firefox 75中最有趣的開發人員新工具。

即時測試控制台表達式

螢幕截圖為網頁控制台進行表達式的即時測試

控制台中測試表達式是了解應用程序狀態、查詢DOM或試用JavaScript API非常便捷的方法。現在,利用Firefox控制台的多行模式使編寫較長的代碼更為容易,在使用上更為友善,且更貼近整合開發環境。

新的即時測試可以在輸入時預覽當前表達式的結果,有點類似Quokka.js編輯器。只要在Web控制台中鍵入的表達式沒有副作用,在輸入時便可以直接預覽結果。

為了使預覽盡可能無縫,需要花費很大的功夫。以當前的成果來說,DOM節點的元素表現出色,而代碼內自動完成功能也會根據結果類型推薦方法和屬性。此外,更可以預覽錯誤以快速地修復表達式。

更佳的檢查和測量方法

現在可以調整測量面積大小

螢幕截圖顯示DevTools中的面積測量工具,可以在頁面上快速繪製矩形以測量特定區域的高度、寬度和對角線長度。

使用DevTools中的選用面積測量工具可以在頁面上快速繪製矩形以測量特定區域的高度、寬度和對角線長度。在「可用的工具箱按鈕」的設置中可以啟用該工具。感謝Sebastian Zartner [:sebo],這些矩形現在具有調整大小的句柄,因此可以精準地進行調整。

利用Xpath查詢DOM元素

Xpath查詢通常用於自動化工具中,以告知軟件要定位與互動的元素。再次感謝Sebo,現在可以利用HTML的頁面檢測器搜索以XPath來查詢DOM元素。這使得在網站上實際測試表達式和修改變得更加容易。

WebSockets的事件斷點

在每個最新的DevTools版本中,WebSocket檢查功能都持續進步。這次,天資聰穎的Chujun Lu在除錯方面做出了很大的貢獻。

在執行WebSocket事件處理程序時,你可以利用除錯器中新的事件監聽器斷點(Event Listener Breakpoints)暫停或是記錄。選擇紀錄選項後,事件數據和已執行的處理程序會被記錄下來,但是不會暫停執行。

在WebSocket Inspector中,由於Outvi V長期的貢獻,消息過濾器現在可以支援一般的表達式。

網路新增功能

Firefox 75在網絡介面的質量和性能方面有大幅的進步。這個版本的渲染效能立下了新的里程碑,可以快速渲染同時發動的請求,又不增加CPU的負擔。

在介面方面,貢獻者Florens Verschelde提出了在列之間添加邊框以提升可讀性的建議和設計。這個設計使DevTools整體的外觀更加一致。貢獻者Vitalii在改善狀態之間的對比度後,篩選按鈕也變得更清晰。

阻斷請求面板可協助測試匹配請求失敗時網站的彈性。現在,它允許包含“ *”的萬用字源。感謝Duncan Dean的貢獻。

開發者版本中搶先體驗DevTools功能

開發者版本是Firefox的預發布渠道,可以提早體驗編程和平台功能。默認情況中,瀏覽器的設定提供開發人員了更多功能。我們希望盡快在開發者版本中加入新功能,並收集不同的反饋,包括以下重點。

除錯器和控制台的異步堆棧跟踪追蹤

現代的JavaScript編碼很大程度上取決於在其他異步作業(例如:event、promise和timeout)之上堆疊async/await。在與JavaScript引擎整合優化之後,現在異步作業得以提供更完整的服務。

利用除錯器中的異步堆棧可以逐步了解所執行的event、timeout和基於promise的函數調用。在控制台中,透過異步堆棧使查找錯誤的根本原因變得更加容易。

網頁平台更新

讓我們看看Firefox 75網頁平台方面的更新。

HTML延遲載入圖片

延遲加載是用來提升性能常用的一個策略。透過將資源標記為非阻塞(非關鍵)資源,並在需要時才加載,而不是立即加載所有資源。Web App中延遲加載的最常見的資源之一為圖片。

為了讓延遲載入圖片時在使用上更為簡便,我們提供支援HTML <img>元素的load屬性。只要將之設定為lazy,就可以使瀏覽器延遲載入尚未出現在畫面中的圖片,直到使用者快瀏覽到圖片時才加以載入。另一個屬性則是eager,也就是一般預設的屬性。

<img src="image.jpg" loading="lazy" alt="..." />

你可以透過檢查布林 complete屬性的值來確定圖片是否已完成加載。

注意:當網頁一次載入所有內容時,將觸發load事件。這時,畫面中可能尚未載入延遲加載的圖片。

注意:Chrome目前正在測試延遲加載<iframe>內容,但這尚未正式發行。

CSS min()max()clamp()

這個月增加了一些令人興奮的CSS新功能!我們開始支援三個非常實用的CSS函數,這些CSS函數彼此密切相關,但目的卻不同:

  • min() —接受一個或多個可能的值或運算以選擇,並確保在所有情況下使用的值都是最小可能的值。實作上,這提供響應式設計一系列的值以及最大允許值。
  • max() — 接受一個或多個可能的值或運算以選擇,並確保在所有情況下使用的值都是最大可能的值。實作上,這提供響應式設計一系列的值以及最小允許值。
  • clamp() — 接受三個值或運算:最小值,首選值和最大值。如果計算值低於最小值,則將使用最小值。如果計算值大於最大值,則將使用最大值。如果計算值介於兩者之間,則將使用首選值。這使屬性值適應所分配的元素或頁面中的變更,同時保持在最小值和最大值之間。

這些功能對於響應式設計來說非常實用,可以節省大量時間和代碼。先前可能需要同時運用min-widthwidth還有max-width,或是多媒體查詢,甚至JavaScript才能完成同樣的事情。

CSS min()max()clamp()實例

讓我們看看下方的例子:

html {
  font-family: sans-serif;
}
 
body {
  margin: 0 auto;
  width: min(1000px, calc(70% + 100px));
}
 
h1 {
  letter-spacing: 2px;
  font-size: clamp(1.8rem, 2.5vw, 2.8rem)
}
 
p {
  line-height: 1.5;
  font-size: max(1.2rem, 1.2vw);
}

我們這裡將body寬度設為min(1000px, calc(70% + 100px)),也就是說在較寬的視區中,body為1000px。在較窄的視區中,body為視區的70%,再加上100px(直到這個運算結果達到1000px以上)!

頂部標題的字體大小設置為clamp(1.8rem, 2.5vw, 2.8rem),所以最小值為1.8rem,最大值為2.8rem。在這個範圍區間,最適合的值為2.5vw。你可以看到標題會放大或縮小,因為2.5vw大於1.8rem,且小於2.8rem

段落的字體大小設置為max(1.2rem, 1.2vw),所以最小值為1.2rem。但是當1.2vw的值大於1.2rem的值時,字體則會開始放大。

你可以參閱此處min()max()clamp()簡易的實作

JavaScript功能

Firefox 75中新增了一些有趣的JavaScript功能。

首先,我們現在有公共靜態字段。如果你希望一個字段在每個類別中僅存在一次,而不存在於你所創建的每個類別的實例中時,這時就很有幫助。對於緩存,固定配置或不需要跨實例複製的其他資料很有用。基本語法如下:

class ClassWithStaticField {
  static staticField = 'static field'
}
 
console.log(ClassWithStaticField.staticField)
// expected output: "static field"​

接下來,我們透過加入Intl.Locale提升國際化(i18n)功能。Intl.Locale為標準的內置屬性,它代表Unicode語言環境標識符。你可以參考以下範例創建一個韓文語言環境對象:

const korean = new Intl.Locale('ko', {
  script: 'Kore', region: 'KR', hourCycle: 'h24', calendar: 'gregory'
});

然後依照預期返回對象的屬性:

console.log(korean.hourCycle, japanese.hourCycle);
// expected output: "h24" "h12"

表單元素功能

在Firefox 75中,我們添加了一些可用於表單API的實用功能:

  • HTMLFormElement介面有一個新的方法requestSubmit()。目前舊有的submit()方法仍可使用,不同的是requestSubmit()運作的方式就像點擊了指定的提交按鈕一樣,而不僅僅是將表單數據發送給收件人。因此,submit事件被提交了,而表單的有效性也在數據送出之前完成了檢查。
  • submit事件 event is now represented by an object of type SubmitEvent rather than a simple Event. SubmitEvent包含一個新的submitter屬性,該屬性會回傳一個觸發提交表單的元素。透過這個事件,你可以使用一個處理程序來掌管提交的事件,並判斷提交表單的按鍵或連結。

Web Animations API提升

在Firefox 75中,我們添加了許多新的Web Animations API功能,讓這個版本在使用上更加有趣和實用。

定義關鍵影格的起始和結束

從現在開始,你可以只定義動畫的起始和結束(例如:單個關鍵影格)。然後,瀏覽器會嘗試推斷動畫的結束。例如,請參考這個簡易動畫──關鍵影格物件如下所示:

let rotate360 = [
  { transform: 'rotate(360deg)' }
];

我們只有指定動畫的結束狀態,而瀏覽器自動推算了起始狀態。

自動移除填充動畫

同一元素可能會觸發大量動畫,所以如果動畫屬性為無限重複(例如:向前填充動畫),可能會導致動畫列表過大,進而造成記憶體流失。因此,我們根據Web動畫規範,自動刪除覆蓋的向前填充動畫,除非開發人員明確要求保留動畫。

在我們簡易的替換無限重複動畫範例中看到這個動作。相關JavaScript功能如下:

  • animation.commitStyles() — 執行這個方法將提交動畫的最終樣式狀態給要進行動畫的元素,即便該動畫已被刪除。最終樣式狀態會以樣式屬性中特性的形式寫入進行動畫的元素。
  • animation.onremove —允許你在動畫刪除時(例如:置換狀態)觸發事件處理器並加以執行。
  • animation.persist() — 當你確定希望保留動畫時,請調用persist()
  • 則此方法將處於活動狀態;如果已調用persist(),則將保留該屬性。

  • animation.replaceState — 返回動畫的置換狀態。如果動畫已刪除,會處於active狀態。如果已調用persist(),則會處於persisted狀態。

時間軸

預設模式中啟用了,Animation.timeline getter、Document.timelineDocumentTimelineAnimationTimeline功能,所以你現在可以取得動畫的時間軸信息。這個功能在回傳時間值以同步資料時非常實用。

在預設模式中,動畫和檔案的時間軸為一致的。

Getting active animations

最後,Document.getAnimations()Element.getAnimations()方法現在為預設。你可以返回檔案或特定元素中所有有效的動畫的陣列。

ARIA批註

在Windows和Linux上的Firefox 75中,你可以看到稱為ARIA批註的一組新輔助功能,目前預計於WAI-ARIA 1.3版規範中發布。透過ARIA批註可以在Web文檔中建立可訪問的註釋,常見的實例包括編輯建議(例如:在可編輯文檔中添加或刪除內容)以及評論(例如:審核中部分文檔的相關編輯評論)。

目前螢幕報讀器並未支援ARIA批註,但是不久後我們將能夠使用這些新角色和其他屬性。欲瞭解更多實例和其他細節,請閱讀MDN中的ARIA批註

瀏覽器擴充功能

WebExtensions API中的browserSettings新增了兩項新屬性:zoomFullPage可以放大網頁中的內文;zoomSiteSpecific可以只放大網頁中運作中的標籤,也可以放大網頁中所有的標籤。

總結

以上是我們在Firefox 75中新增的一些有趣的新功能;歡迎大家來體驗,祝大家玩得愉快!與往常一樣,歡迎隨時提供反饋並在評論區提出問題。check them out, and have fun playing!

About Chris Mills

Chris Mills is a senior tech writer at Mozilla, where he writes docs and demos about open web apps, HTML/CSS/JavaScript, A11y, WebAssembly, and more. He loves tinkering around with web technologies, and gives occasional tech talks at conferences and universities. He used to work for Opera and W3C, and enjoys playing heavy metal drums and drinking good beer. He lives near Manchester, UK, with his good lady and three beautiful children.

More articles by Chris Mills…

Firefox 75:四月的远大志向

即使在隔离时期,我们的工程团队也努力适应、保持专注并努力工作,为您带来又一个令人兴奋的新版Firefox。在开发人员工具方面,您会找到控制台中的即时评估、WebSockets的事件断点,以及其他许多功能。在网络平台方面,新增的功能包括图像的HTML延迟加载、CSS min()max()clamp()函数、公共静态类字段以及对Web动画API支持的补充。

请照例阅读重点内容或从以下文章中找到所有新增内容的完整列表:

开发人员工具补充

我们首先来看看75最有趣的开发人员工具。

控制台表达式即时评估

屏幕快照显示了具有控制台表达式即时评估的Web控制台

控制台中的评估表达式是探索应用程序状态、查询DOM或试用JavaScript API的快速方法。现在,Firefox的多行控制台模式已经变得更友好、更像IDE,可用于更轻松地为更长的代码制作原型。

新的即时评估会在您键入时显示当前表达式的结果预览,类似于Quokka.js 这样的编辑器。只要在Web控制台中键入的表达式没有副作用,就会在您键入时显示结果预览。

为了使预览尽可能无缝,进行了大量改进。结果中DOM节点的元素为突出显示。代码内自动填写功能根据结果类型推荐方法和属性。另外,您可以预览错误以更快地修复表达式。

更好地检查和测量

面积测量现可调整大小

显示DevTools中的面积测量工具的屏幕快照,可让您快速在页面上绘制矩形以测量特定区域的高度、宽度和对角线长度。

使用DevTools中的可选面积测量工具,您可以在页面上快速绘制矩形以测量特定区域的高度、宽度和对角线长度。您可以在“可用工具箱按钮”下的设置中启用该工具。感谢Sebastian Zartner [:sebo],这些矩形现在有调整大小的句柄,方便您精确地调整。

使用XPath查找DOM元素

XPath查询通常用于自动化工具中,以告知软件要查找并与之交互的元素。您现在可以在Inspector的HTML搜索中将XPath用于DOM元素,这也是归功于sebo。这使得在实际站点上测试表达式和微调查询变得更加容易。

WebSocket的事件断点

最近的每个DevTools版本都对WebSocket检查功能进行了改进。这次,由于才华横溢的Chujun Lu的贡献,调试方面得到了一个不错的补充。

现在,您可以在执行WebSocket事件处理程序时选择暂停或记录。使用调试器中新添加的事件监听器断点。选择“记录”选项时,将记录事件数据和执行的处理程序,但执行不会暂停。

WebSocket Inspector的新消息还包括:由于Outvi V的长期贡献,消息过滤器现支持正则表达式。

网络添加

Firefox 75的“网络”面板中进行了大量质量和性能方面的工作。此版本中在不增加CPU负担的情况下大幅提升了发出快速请求的速度。

在界面方面,贡献者Florens Verschelde推进了在列之间添加边框以提高可读性的建议和设计。注意设计变得与DevTools的整体外观更加一致了。感谢贡献者Vitalii,过滤器按钮也更加清晰易读,状态之间的对比度得到了改善。

“请求阻止”面板可帮助您测试匹配请求失败时站点的恢复能力。现在,它允许带有“*”的通配符模式。感谢Duncan Dean所做的贡献。

Developer Edition(开发人员版)中DevTools功能抢先体验

Developer Edition是Firefox的预发布渠道,可以抢先体验各种工具和平台功能。该版本的默认设置中还为开发人员开启了更多的功能。我们喜欢将新功能快速引入到Developer Edition,以便收集反馈信息,重点包括以下内容。

调试器 & 控制台异步堆栈跟踪

现代JavaScript代码在很大程度上取决于在其他异步操作(如事件、承诺以及超时)之上堆叠async/await。由于与JavaScript引擎集成得好,现已可以捕捉到异步执行过程,以提供更完整的画面。

调试器中的异步调用堆栈使您可以单步调试事件、超时以及依照时间执行的基于承诺的函数调用。控制台的异步堆栈使查找错误的根本原因变得更为容易。

Web平台更新

我们来探讨一下Firefox 75在网络平台更新方面提供的功能。

图像的HTML延迟加载

延迟加载是通过将资源标识为非阻塞(非关键)资源、以仅在需要时加载而不是立即加载来提高性能的常见策略。图像是要在网络应用中延迟加载的最常见资产之一。

为了简化图像延迟加载,我们在HTML <img>元素上引入了对加载属性的支持。将值设置为lazy会指示浏览器推迟加载屏幕外的图像,直到用户滚动到附近为止。唯一可能的其他值为eager,如您所想,这是默认值。

<img src="image.jpg" loading="lazy" alt="..." />

您可以通过检查其布尔complete属性的值来确定给定图像是否已完成加载。

注意:当所有立即加载的内容都已加载时,会触发load事件。到那时,有一定可能(或者很可能)在即将加载的可视视口中有一些延迟加载的图像。

注意:Chrome还为<iframe>内容延迟加载提供了实验性支持,但还没有列入标准;我们正在等它标准化。

CSS min()max()clamp()

本月新增了一些令人兴奋的CSS新功能!我们对三个非常实用的CSS函数新增了支持,这几个CSS函数彼此密切相关,但目的不同:

  • min() — 接受一个或多个可能值或计算结果以供选择,并确保所有情况下使用的值都是可能值中最小的。这为响应式设计提供了一系列值以及最大允许值。
  • max() — 接受一个或多个可能值或计算结果以供选择,并确保所有情况下使用的值都是可能值中最大的。这为响应式设计提供了一系列值以及最小允许值。
  • clamp() — 接受三个值或计算结果:最小值、首选值和最大值。如果计算值低于最小值或高于最大值,则将使用最小值或最大值。如果计算值介于两者之间,则将使用首选值。这样,属性值就可以适应分配给它的元素或页面的变更,同时保持在最小值和最大值之间。

这些函数对于响应式设计非常实用,可用于进行您之前使用min-widthwidthmax-width、多个media queries、甚至JavaScript的组合进行的操作,并且可以节省大量时间、减少大量代码。

CSS min()max()clamp()的实际运行情况

我们来学习以下示例:

html {
  font-family: sans-serif;
}
 
body {
  margin:0 auto;
  width: min(1000px, calc(70% + 100px));
}
 
h1 {
  letter-spacing:2px;
  font-size: clamp(1.8rem, 2.5vw, 2.8rem)
}
 
p {
  line-height:1.5;
  font-size: max(1.2rem, 1.2vw);
}

在这里,正文宽度设置为min(1000px, calc(70% + 100px)),这意味着在更宽的视口中,正文内容将为1000px宽。在较窄的视口中,正文内容将为视口宽度的70%加<100px(直到此计算结果变为1000px或更高)!

顶层标题的字体大小设置为clamp(1.8rem, 2.5vw, 2.8rem)。因此,最小值为1.8rem,最大值为2.8rem。在这两个值之间,将使用2.5vw的理想值,因此如计算出2.5vw大于1.8rem,但小于2.8rem,您将看到标题文本随视口宽度增大和缩小。

段落字体大小设置为max(1.2rem, 1.2vw),这意味着它的最小值为1.2rem。但是,当code>1.2vw的计算值大于1.2rem的计算值时,它将开始增长。

您可以在我们的

<

h4>CSS min()max()clamp()简单示例中查看实际运行情况。

JavaScript语言功能

75中新添了一些有趣的JavaScript。

首先,我们现在有了公共静态类字段。如果您希望一个字段在每个类中仅出现在一次,而不是在您创建的每个类实例中都出现时,就可以使用这些选项。对于缓存、固定配置或不需要在实例之间复制的任何其他数据而言尤其实用。基本语法如下所示:

class ClassWithStaticField {
  static staticField = 'static field'
}
 
console.log(ClassWithStaticField.staticField)
// expected output: "static field"​

另外,我们通过添加Intl.Locale——一个代表Unicode语言环境标识符的标准内置构造函数——进一步增强了国际化(i18n)功能。例如,您可以创建一个韩语语言环境对象,如下所示:

const korean = new Intl.Locale('ko', {
  script:'Kore', region:'KR', hourCycle: 'h24', calendar: 'gregory'
});

然后返回对象的属性,如您所预期:

console.log(korean.hourCycle, japanese.hourCycle);
// expected output: "h24" "h12"

表单添加

在Firefox 75中,我们添加了一些实用的特定于表单的API:

  • HTMLFormElement接口具有一个新方法,即requestSubmit()。与旧的(仍然可用)submit()方法不同,requestSubmit()的行为就像单击了指定的提交按钮一样,而不仅仅是将表单数据发送给收件人。因此,在提交数据之前,会发送submit事件,并检查表单的有效性。
  • submit事件现在由类型为SubmitEvent的对象、而不是简单的Event表示。SubmitEvent包括一个新的submitter属性,它返回被调用以触发表单提交的Element。利用此事件,您可以将可识别出使用了哪个提交按钮或链接来提交表单的处理程序用于提交事件。

Web Animations API增强功能

在75中,我们添加了许多新的Web Animations API功能,使此规范更加有趣和实用。

从关键帧推算

从现在开始,您可以仅为动画设置开始或结束状态(即单个关键帧)。然后,如果浏览器具备相应能力,就可以推断动画的另一端。以这个简单的动画为例,关键帧对象看起来像这样:

let rotate360 = [
  { transform: 'rotate(360deg)' }
];

我们仅指定了动画的结束状态,就可以默示开始状态了。

自动删除填充动画

可以在同一元素上触发大量动画。如果元素为不确定的(即,向前填充),则可能会导致动画列表过大,从而造成内存泄漏。因此,我们实施了Web动画规范中自动取消覆盖前向填充动画的部分,除非开发人员明确指定保留动画。

您可以在我们简单的替换不确定动画演示中看到相关的实际运行情况。相关的JavaScript功能如下:

  • animation.commitStyles() — 运行此方法以将动画的最终样式状态提交给要动画化的元素,即使该动画已被删除也是如此。它将以样式属性内的属性形式将最终样式状态写入正在动画化的元素。
  • animation.onremove — 允许您运行在动画被删除时(即处于活动替换状态)触发的事件处理程序。
  • animation.persist() —当您明确希望保留动画时,调用persist()
  • animation.replaceState — 返回动画的替换状态。如果已删除动画,则将为active;如果已调用persist(),则将为persisted

时间轴

Animation.timeline getter、Document.timelineDocumentTimelineAnimationTimeline功能现在为默认启用,这意味着您现在可以访问动画的时间轴信息。此功能对于返回时间值以进行同步非常实用。

默认情况下,动画的时间轴和文档的时间轴相同。

获取活动动画

最后,Document.getAnimations()Element.getAnimations()方法现在为默认启用。您可以分别将它们用于返回整个文档或特定元素上所有活动动画的数组。

ARIA注释

在Firefox 75(Linux和Windows版本)上,我们新添了对一组新的辅助功能的支持,这些新功能统称为ARIA批注,将在即将发布的WAI-ARIA 1.3版规范中发布。这些功能使在Web文档中创建可访问注释成为可能。典型的用例包括编辑建议(即,在可编辑文档中进行添加和/或删除)和评论(例如,与正在审核的文档的一部分相关的编辑评论)。

目前还没有针对ARIA注释的屏幕阅读器支持,但是我们很快就能使用这些新角色和其他属性。有关示例和更多支持详细信息,请阅读MDN上的ARIA注释

浏览器扩展

两个新的browserSettings已添加到WebExtensions API: zoomFullPage来放大页面上的文本,还添加了zoomSiteSpecific,可确定缩放是仅应用于活动选项卡还是同一网站的所有选项卡。

总结

就是这样了。我们为Firefox 75提供了有趣的新功能;赶快了解一下,从中寻找乐趣吧!和之前一样,欢迎您随时提供反馈并在评论中提出问题。

About Chris Mills

Chris Mills is a senior tech writer at Mozilla, where he writes docs and demos about open web apps, HTML/CSS/JavaScript, A11y, WebAssembly, and more. He loves tinkering around with web technologies, and gives occasional tech talks at conferences and universities. He used to work for Opera and W3C, and enjoys playing heavy metal drums and drinking good beer. He lives near Manchester, UK, with his good lady and three beautiful children.

More articles by Chris Mills…