「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > キーボードが開いているときでも要素を下部に固定しておく方法

キーボードが開いているときでも要素を下部に固定しておく方法

2024 年 8 月 25 日に公開
ブラウズ:454

開発者の皆さん!メモアプリを使っているときにこれを発見しました。
私のアプリを使った投稿はこちらです。
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