首页 > web前端 > css教程 > 即使键盘打开,如何保持元素固定在底部

即使键盘打开,如何保持元素固定在底部

WBOY
发布: 2024-08-10 08:59:33
原创
862 人浏览过

嘿开发者!我在开发我的笔记应用程序时发现了这一点。
这是使用我的应用程序的帖子。
在 X (Twitter) 上分享进展

您是否曾因 CSS 没有按您预期的方式工作而感到惊讶?
当我将一个元素设置为固定在底部,然后打开 iPhone 上的键盘时,这种情况再次发生在我身上。

<div className="fixed bottom-0" />
登录后复制

我所看到的是该元素根本不可见。
因为它是固定的。到底部。键盘后面。

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 hook 的内容即可。

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 (
    <>
      <div
        className={classNames(
          'absolute left-0 top-0', // <-- attention, it's absolute
          top === 0 && 'hidden'    // while calculating, we don't need to show it 
        )}
        style={{ transform: `translateY(${debouncedTop}px)` }}
      >
        I am fixed
      </div>
    </>
  );
};

登录后复制

最终结果

我还需要添加一些动画并隐藏滚动上的块,但您不必这样做,它始终可见。

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

以上是即使键盘打开,如何保持元素固定在底部的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板