Захват и использование события изменения размера - PullRequest
0 голосов
/ 24 мая 2019

Я ищу разумный способ контролировать и обрабатывать стандартную функцию изменения размера / увеличения в браузере.Цель состоит в том, чтобы переопределить функцию по умолчанию и использовать эту функцию для управления размером определенных элементов на моей странице.

После некоторых обширных исследований я выкинул свой общий метод для включения:

  1. Использование rem для управления размером элементов.
  2. Использование события resize в браузере для запуска изменения размера.

IСразу отметим, что я использую Firefox 62, и провел некоторое тестирование на Chrome 69.

1.Используя rem для управления размером элементов:

Используя rem, я могу более точно настроить то, что масштабируется при изменении размера страницы.Другой вариант использовал transform: scale(), который мне, возможно, придется использовать в зависимости от ответов на этот вопрос.

Вот фрагмент кода html & css, показывающий это:

<style type="text/css">
    @keyframes size { 0% { font-size: 62.5% } 25% { font-size:  100% } 50% { font-size: 62.5% } 75% { font-size:   25% } 100% { font-size: 62.5% } }
    :root { font-size: 62.5%; /* gives a base factor of 10px */ animation: size 10s infinite; }
    div         { padding: 40px; width: 200px; font-size: 40px; background: steelblue; text-align: center; margin: 16px; }
    div.zoomer  { padding: 4rem; width: 20rem; font-size: 4rem; background: steelblue; text-align: center; margin: 16px; }
    /* note that the margins are set to px on both versions (technically unnecessary but for illustration) and it can be controlled what gets resized */
</style>
<body>
    <div>px</div>
    <div class="zoomer">rem</div>
</body>

2.Использование события resize в браузере для запуска изменения размера.

Именно здесь начинаются проблемы.

Я исследовал различные события «увеличения», которые могу прослушивать.К ним относятся wheel и keypress:

window.addEventListener('wheel',e => {
    if (e.ctrlKey) {
        e.preventDefault();
        // zoom handler
    }
});
window.addEventListener('keypress',e => {
    if ((e.charCode===61||e.charCode===45)&&e.ctrlKey) { // ctrl+, ctrl-
        e.preventDefault();
        // zoom handler
    }
});

Но главное событие масштабирования - resize, и для него гораздо больше смысла слушать:

window.addEventListener('resize',handler);

НекоторыеПричины для прослушивания события resize:

  1. Помимо ctrl+, ctrl- и ctrl[mousewheel] в качестве методов масштабирования, есть также раздел меню браузера (гамбургер)-меню в правом верхнем углу браузера), который позволяет нажимать +, - и в некоторых случаях изменять масштаб на 100%.Единственное событие, которое я обнаружил - это событие resize.
  2. Теоретически вы можете запустить собственное событие resize, которое затем будет обработано должным образом.Т.е., если у вас была пользовательская кнопка: <button type="button" onclick="myZoomFunction(amount)">Zoom In</button> на самой веб-странице.
  3. Семантика

Проблемы с прослушиванием resize, которые я обнаружил:

  1. Не похоже, что preventDefault() работает с событием resize.Поэтому вы не можете остановить браузер от масштабирования (хотя вы можете использовать preventDefault() на wheel и click, чтобы остановить масштабирование).
  2. Объект event, который передается, не выглядитвключить любые данные, если масштаб был увеличен или уменьшен (что я могу найти).

Например:

window.addEventListener('resize', e => {
    e.preventDefault(); // doesn't do anything.
    console.log(e.defaultPrevented); // false
    myZoomFunction(e.resizePropertyThatDoesNotExist);
})

// obviously this function is a conjecture as I need to figure out what values I can actually get passed in.
function myZoomFunction(amount) {
    const CURRENT_ROOT_FONT_SIZE_PX = Number.parseInt(window.getComputedStyle(document.documentElement).getPropertyValue('font-size').replace(/\D+/g,''));
    return document.documentElement.style.fontSize = `${CURRENT_ROOT_FONT_SIZE_PX+amount}px`;
}

Я пытаюсь решить эти две проблемы, еслиУ кого-нибудь есть идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...