react---大屏项目屏幕自适应组件---ScalePage

import React, { useEffect, useRef } from 'react';

import styles from './index.less';

/**

 *

 * @param {*} props

 * @returns

 */

const ScalePage = (props) => {

  const {

    id = '',

    style,

    className,

    containerWidth,

    containerHeight,

    designDraftWidth = 1920,

    designDraftHeight = 900,

    priorityFill = 'container', //优先填充 container, width ,height

    resize = false,

    children,

  } = props;



  const wrap = useRef();



  useEffect(() => {

    //初始化自适应

    handleScreenAuto();

    //绑定自适应函数

    if (resize) {

      window.onresize = () => handleScreenAuto();

    }

    //退出大屏后自适应消失

    return () => {

      if (resize) {

        window.onresize = null;

      }

    };

  }, [designDraftWidth, designDraftHeight, priorityFill]);



  //数据大屏自适应函数

  const handleScreenAuto = () => {

    // 设备(浏览器)的宽度



    let clientWidth =

      containerWidth || document.documentElement.clientWidth || document.body.clientWidth;

    let clientHeight =

      containerHeight || document.documentElement.clientHeight || document.body.clientHeight;



    if (clientWidth === designDraftWidth && clientHeight === designDraftHeight) {

      wrap.current.style.transform = '';

      return;

    }

    //根据屏幕的变化适配的比例

    if (priorityFill === 'container') {

      const scaleX = clientWidth / designDraftWidth;

      const scaleY = clientHeight / designDraftHeight;

      wrap.current.style.transform = `scale(${scaleX},${scaleY})`;

    } else if (priorityFill === 'width') {

      const scale = clientWidth / designDraftWidth;

      wrap.current.style.transform = `scale(${scale})`;

    } else if (priorityFill === 'height') {

      const scale = clientHeight / designDraftHeight;

      wrap.current.style.transform = `scale(${scale})`;

    }

  };



  return (

    <div

      id={id}

      style={{ ...style, width: `${designDraftWidth}px`, height: `${designDraftHeight}px` }}

      className={`${styles.scalePage} ${className}`}

      ref={wrap}

    >

      {children}

    </div>

  );

};



export default ScalePage;




//.screen {position: absolute;}  ScalePage必须为绝对定位


      <ScalePage

        className={styles.screen}

        designDraftWidth={1920}

        designDraftHeight={1080}

        resize={true}

      >

        <div>

        </div>

      </ScalePage>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值