useSize

作者: skoll | 来源:发表于2020-09-18 16:16 被阅读0次

    当前窗口,元素的大小变化

    缺点

    1 .并不能真实的反应div元素的大小,只是height的大小。padding,margin,border等最后也会影响表现的是不会累加的。
    2 .所以虚拟列表的时候用这个就跪了,还找了很久。

    // 订阅当前屏幕大小的钩子
    import {useState,useLayoutEffect} from 'react'
    import ResizeObserver from 'resize-observer-polyfill'
    import {getTargetElement,BasicTarget} from './utils/dom'
    
    interface Size {
        width?:number,
        height?:number,
    }
    
    export default function useSize(target:BasicTarget):Size{
        const [state,setState]=useState<Size>(()=>{
            const el=getTargetElement(target)
            return {
                width:((el||{}) as HTMLElement).clientWidth,
                height:((el||{}) as HTMLElement).clientWidth,
            }
        })
    
        useLayoutEffect(()=>{
            const el=getTargetElement(target)
            if(!el)return ()=>{}
            const resizeObserver=new ResizeObserver((entries)=>{
                entries.forEach((entry)=>{
                    setState({
                        width:entry.target.clientWidth,
                        height:entry.target.clientHeight,
                    })
                })
            })
            resizeObserver.observe(el as HTMLElement)
            return ()=>{
                resizeObserver.disconnect()
            }
        },[state,target])
    
        return state
    }
    
    
    import useSize from '../useSize'
    
    export default function(){
      const ref = useRef<HTMLDivElement>(null);
      const size = useSize(ref);
      return (
        <div ref={ref}>
          try to resize the preview window <br />
          dimensions -- width: {size.width} px, height: {size.height} px
        </div>
      );
        
    }
    

    1 .有的时候发现这些需要计算的值,在第一时间是null,第二遍才会得出计算的值,但是别的依赖可能就取了第一次的值,如果多个依赖的话,无法实现新值变化,依赖重新计算

    div大小计算

    1 .box-size

    1 .content-box:css给的height就是实际div的高度,clientHeight=height+padding,不算border+margin
    2 .border-box:css给的height=实际height+padding
    

    2 .clientHeight:无论怎么都是height+padding,还差上下border+上下margin大小,如果有滚动条,需要减去滚动条的大小
    3 .getBoundingClientRect():如果是标准盒子模型,元素的尺寸等于width/height + padding + border-width的总和。如果box-sizing: border-box,元素的的尺寸等于 width/height
    4 .怎么说就是没有margin的值
    5 .offsetHeight:offsetHeight = content + border + padding

    外边距折叠问题

    1 .两个或多个毗邻的普通流中的块元素垂直方向上的 margin 会折叠

    1 .
    

    计算高度

    1 .这都有库。https://github.com/nkbt/react-height 但是这个也只能算出来通常理解的height+padding

    相关文章

      网友评论

          本文标题:useSize

          本文链接:https://www.haomeiwen.com/subject/bpxfsktx.html