«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как сохранить элемент зафиксированным внизу, даже когда клавиатура открыта

Как сохранить элемент зафиксированным внизу, даже когда клавиатура открыта

Опубликовано 25 августа 2024 г.
Просматривать:484

Привет, разработчики! Я обнаружил это, работая над своим приложением для заметок.
Вот пост с использованием моего приложения.
Делимся прогрессом в X (Twitter)

Вы когда-нибудь удивлялись, что CSS работает не так, как вы ожидали?
Это случилось со мной (снова), когда я установил элемент для фиксации внизу, а затем открыл клавиатуру на своем iPhone.

Я видел, что этот элемент вообще не виден.
Потому что это исправлено. До дна. За клавиатурой.

How to keep an element fixed at the bottom, even when the keyboard is open

Похоже, чтобы исправить это, нам нужен JS.

ВизуальныйВьюпорт

Для этих целей можно использовать API браузера с хорошей поддержкой: VisualViewport.
Он возвращает ширину и высоту фактического видимого окна просмотра. Ссылка MDN на документацию.
Однако проведите собственное расследование, чтобы узнать, поддерживается ли он для версий, на которые вы ориентируетесь.

How to keep an element fixed at the bottom, even when the keyboard is open

Математика

По сути, нам нужно обрабатывать положение элемента относительно области визуального просмотра, а также положение прокрутки и высоту элемента. Давайте посчитаем.

Кроме того, поскольку математические вычисления в этом случае намного проще, имеет смысл использовать верхний параметр вместо нижнего.

top = viewport height   scroll - element height

Выполнение

Я буду использовать React. Для любого другого фреймворка вы можете просто скопировать содержимое хука useEffect.

import { useEffect, useState } from 'react';
import classNames from 'classnames';
import { useDebounce } from 'use-debounce';

const elementHeight = 55; // elem. height in pixels
// It's also a good idea to calculate it dynamically via ref

export const FixedBlock = () => {
  // top postion -> the most important math result goes here
  const [top, setTop] = useState(0);

  useEffect(() => {
    function resizeHandler() {
      // viewport height
      const viewportHeight = window.visualViewport?.height ?? 0;
      // math
      setTop(viewportHeight   window.scrollY - elementHeight)
    }

    // run first time to initialize 
    resizeHandler();

    // subscribe to events which affect scroll, or viewport position
    window.visualViewport?.addEventListener('resize', resizeHandler);
    window.visualViewport?.addEventListener('scroll', resizeHandler);
    window?.addEventListener('touchmove', resizeHandler);

    // unsubscribe
    return () => {
      window.visualViewport?.removeEventListener('resize', resizeHandler);
      window.visualViewport?.removeEventListener('scroll', resizeHandler);
      window?.removeEventListener('touchmove', resizeHandler);
    };
  }, [debouncedScroll]);

  return (
    
      
I am fixed
> ); };

Окончательные результаты

Мне также нужно было добавить несколько анимаций и скрыть блок при прокрутке, но это не обязательно, и он всегда будет виден.

How to keep an element fixed at the bottom, even when the keyboard is open

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/rita/how-to-keep-an-element-fixed-at-the-bottom-even-when-the-keyboard-is-open-n0m?1 Любой нарушение, пожалуйста, свяжитесь с [email protected], чтобы удалить
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3