嘿開發者!我在開發我的筆記應用程式時發現了這一點。
這是使用我的應用程式的帖子。
在 X (Twitter) 上分享進展
您是否曾因 CSS 沒有以您預期的方式工作而感到驚訝?
當我將一個元素設定為固定在底部,然後打開 iPhone 上的鍵盤時,這種情況再次發生在我身上。
我所看到的是該元素根本不可見。
因為它是固定的。到底部。鍵盤後面。
似乎要修復這個問題,我們需要一些 JS。
有一個具有良好支援的瀏覽器 API 可用於這些目的:VisualViewport。
它傳回實際可見視口的寬度和高度。 MDN 文件連結。
但是,請自行調查,看看您的目標版本是否支援它。
基本上,我們需要處理元素相對於視覺視窗的位置,以及滾動位置和元素的高度。我們來算算吧。
此外,由於這種方式的數學要簡單得多,因此使用頂部參數而不是底部參數是有意義的。
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> ); };
我還需要添加一些動畫並隱藏滾動上的區塊,但您不必這樣做,它始終可見。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3