- Манипулирование CSS становится проще с новым объектом модели CSS Typed .
- Доступ к буферу обмена теперь асинхронный.
- Появился новый контекст рендеринга для элементов холста.
И это еще не все !
Меня зовут Пит ЛеПейдж . Давайте окунемся в мир и посмотрим, что нового для разработчиков в Chrome 66!
Хотите полный список изменений? Ознакомьтесь со списком изменений в исходном репозитории Chromium .
Типизированная объектная модель CSS
Если вы когда-либо обновляли свойство CSS через JavaScript, вы использовали объектную модель CSS. Но она возвращает все как строку.
el.style.opacity = 0.3;
console.log(typeof el.style.opacity);
> 'string' // A string!?
Чтобы анимировать свойство opacity , мне пришлось бы преобразовать строку в число, затем увеличить значение и применить мои изменения. Не совсем идеально.
function step(timestamp) {
const currentOpacity = parseFloat(el.style.opacity);
const newOpacity = currentOpacity + 0.01;
element.style.opacity = newOpacity;
if (newOpacity <= 1) {
window.requestAnimationFrame(step);
}
}
Благодаря новой типизированной объектной модели CSS значения CSS представляются как типизированные объекты JavaScript, что устраняет необходимость в значительной части манипуляций с типами и обеспечивает более разумный способ работы с CSS.
Вместо использования element.style вы получаете доступ к стилям через свойство .attributeStyleMap или .styleMap . Они возвращают объект, похожий на карту, который легко читать или обновлять.
el.attributeStyleMap.set('opacity', 0.3);
const oType = typeof el.attributeStyleMap.get('opacity').value;
console.log(oType);
> 'number' // Yay!
По сравнению со старой объектной моделью CSS ранние тесты показывают улучшение количества операций в секунду примерно на 30%, что особенно важно для анимаций JavaScript.
el.attributeStyleMap.set('opacity', 0.3);
el.attributeStyleMap.has('opacity'); // true
el.attributeStyleMap.delete('opacity');
el.attributeStyleMap.clear(); // remove all styles
Он также помогает устранить ошибки, вызванные тем, что забывают преобразовать значение из строки в число, и автоматически обрабатывает округление и фиксацию значений. Плюс, есть несколько довольно изящных новых методов для работы с преобразованиями единиц, арифметикой и равенством.
el.style.opacity = 3;
const opacity = el.computedStyleMap().get('opacity').value;
console.log(opacity);
> 1
У Эрика есть отличный пост с несколькими демонстрациями и примерами в его объяснении .
API асинхронного буфера обмена
const successful = document.execCommand('copy');
Синхронное копирование и вставка с использованием document.execCommand может быть приемлемым для небольших фрагментов текста, но для всего остального есть большая вероятность, что его синхронная природа заблокирует страницу, что приведет к плохому опыту пользователя. А модель разрешений между браузерами непоследовательна.
Новый API асинхронного буфера обмена — это замена, которая работает асинхронно и интегрируется с API разрешений, обеспечивая пользователям лучший опыт.
Текст можно скопировать в буфер обмена, вызвав writeText() .
navigator.clipboard.writeText('Copy me!')
.then(() => {
console.log('Text is on the clipboard.');
});
Поскольку этот API является асинхронным, функция writeText() возвращает Promise, который будет разрешен или отклонен в зависимости от того, был ли успешно скопирован переданный нами текст.
Аналогичным образом текст можно прочитать из буфера обмена, вызвав getText() и дождавшись, пока возвращаемое Promise разрешится с текстом.
navigator.clipboard.getText()
.then((text) => {
console.log('Clipboard: ', text);
});
Посмотрите пост Джейсона и демонстрации в Explainer . У него также есть примеры, в которых используются async функции.
Новый контекст холста BitmapRenderer
Элемент canvas позволяет вам манипулировать графикой на уровне пикселей, вы можете рисовать графики, манипулировать фотографиями или даже выполнять обработку видео в реальном времени. Но, если вы не начинаете с чистого canvas , вам нужен способ рендеринга изображения на canvas .
Исторически это означало создание тега image , а затем отображение его содержимого на canvas . К сожалению, это означает, что браузеру необходимо хранить несколько копий изображения в памяти.
const context = el.getContext('2d');
const img = new Image();
img.onload = function () {
context.drawImage(img, 0, 0);
}
img.src = 'llama.png';
Начиная с Chrome 66, появился новый асинхронный контекст рендеринга, который упростил отображение объектов ImageBitmap . Теперь они рендерятся эффективнее и с меньшими задержками, работая асинхронно и избегая дублирования памяти.
Чтобы использовать его:
- Вызовите
createImageBitmapи передайте ему объект изображения, чтобы создать изображение. - Извлекаем контекст
bitmaprendererизcanvas. - Затем перенесите изображение.
const image = await createImageBitmap(imageBlob);
const context = el.getContext('bitmaprenderer');
context.transferFromImageBitmap(image);
Готово, я отрендерил изображение!
АудиоВорклет
Worklets уже здесь! PaintWorklet поставляется в Chrome 65, и теперь мы включаем AudioWorklet по умолчанию в Chrome 66. Этот новый тип Worklet может использоваться для обработки аудио в выделенном аудиопотоке, заменяя устаревший ScriptProcessorNode, который работал в основном потоке. Каждый AudioWorklet работает в своей собственной глобальной области действия, что снижает задержку и повышает стабильность пропускной способности.
There are some interesting examples of AudioWorklet over on Google Chrome Labs .
И многое другое!
Это лишь некоторые из изменений в Chrome 66 для разработчиков, конечно, их гораздо больше.
-
TextAreaиSelectтеперь поддерживают атрибутautocomplete. - Настройка
autocapitalizeдля элементаformбудет применена ко всем дочерним полям формы, что улучшает совместимость с реализациейautocapitalizeв Safari. - Теперь доступны
trimStart()иtrimEnd()как стандартные способы удаления пробелов из строк.
Обязательно ознакомьтесь с разделом Новое в Chrome DevTools , чтобы узнать, что нового в DevTools в Chrome 66. А если вас интересуют Progressive Web Apps, посмотрите новую серию видео PWA Roadshow . Затем нажмите кнопку подписки на нашем канале YouTube , и вы будете получать уведомления по электронной почте всякий раз, когда мы запускаем новое видео.
Меня зовут Пит ЛеПейдж, и как только выйдет Chrome 67, я сразу же расскажу вам, что нового в Chrome!