React 显示全屏

2018-06-21  本文已影响51人  bo_bo_bo_la

利用React显示全屏,实现F11的效果。
是不是听上去很傻,明明可以按F11解决的事,非要求添加一个按钮控制。
话不多说,代码走起!
首先利用React生命周期,在页面渲染前监控屏幕大小。当document.body.scrollHeight === window.screen.height 或者 document.body.scrollWidth === window.screen.width 的时候表示页面处于全屏状态,此时图标变为退回全屏,反之则是全屏图标。
因为有的浏览器不支持全屏模式,所以在此之前设置一个函数 检测当前浏览器是否支持全屏,如果支持则显示全屏按钮。反之,不显示。

import React, { Component } from "react";
import { Button } from "antd";
import { judgeIsSupportFull, fullScreen, fullExit } from "../FullScreen/index";
export default class FullScree extends Component {
  state = {
    isSupportFull: false,
    isFull: false
  };
  componentDidMount() {
    window.addEventListener("resize", this.changeFullStatus);
    this.judgeIsSupportFull();
  }
  componentWillUnmount() {
    window.removeEventListener("resize", this.changeFullStatus);
  }
  // 判断当前浏览器是否支持全屏API
  judgeIsSupportFull = () => {
    let isSupportFull = judgeIsSupportFull();
    this.setState({ isSupportFull });
  };
  // 计算当前是否处于全屏
  changeFullStatus = () => {
    // 判断网页的高度或者宽度是否等于屏幕对应大小
    // true: 当前处于全屏状态
    // false: 当前不处于全屏状态
    if (
      document.body.scrollHeight === window.screen.height ||
      document.body.scrollWidth === window.screen.width
    ) {
      this.setState({ isFull: true });
    } else {
      this.setState({ isFull: false });
    }
  };
  // click button
  handClick = () => {
    this.state.isFull ? fullExit() : fullScreen();
  };
  // ============================================================
  render() {
    let { isSupportFull } = this.state;

    if (!isSupportFull) {
      return null;
    }

    return (
      <Button
        style={{ border: "none", color: "#696969" }}
        onClick={this.handClick}
        shape="circle"
        icon={this.state.isFull ? "shrink" : "arrows-alt"}
      />
    );
  }
}

export const judgeIsSupportFull = () => {
  let result = false;
  let element = document.documentElement;
  //IE 10及以下ActiveXObject
  if (window.ActiveXObject) {
    result = true;
  }
  //HTML W3C 提议
  else if (element.requestFullScreen) {
    result = true;
  }
  //IE11
  else if (element.msRequestFullscreen) {
    result = true;
  }
  // Webkit (works in Safari5.1 and Chrome 15)
  else if (element.webkitRequestFullScreen) {
    result = true;
  }
  // Firefox (works in nightly)
  else if (element.mozRequestFullScreen) {
    result = true;
  }

  return result;
};
//显示全屏
export const fullScreen = () => {
  let element = document.documentElement;
  //IE 10及以下ActiveXObject
  if (window.ActiveXObject) {
    console.log("IE 10及以下ActiveXObject");
    let WsShell = new ActiveXObject("WScript.Shell");
    WsShell.SendKeys("{F11}");
  }
  //HTML W3C 提议
  else if (element.requestFullScreen) {
    console.log("HTML W3C 提议");
    element.requestFullScreen();
  }
  //IE11
  else if (element.msRequestFullscreen) {
    console.log("IE11");
    element.msRequestFullscreen();
  }
  // Webkit (works in Safari5.1 and Chrome 15)
  else if (element.webkitRequestFullScreen) {
    console.log("Webkit");
    element.webkitRequestFullScreen();
  }
  // Firefox (works in nightly)
  else if (element.mozRequestFullScreen) {
    console.log("Firefox");
    element.mozRequestFullScreen();
  }
};
//退出全屏
export const fullExit = () => {
  var element = document.documentElement;
  //IE ActiveXObject
  if (window.ActiveXObject) {
    var WsShell = new ActiveXObject("WScript.Shell");
    WsShell.SendKeys("{F11}");
  }
  //HTML5 W3C 提议
  else if (element.requestFullScreen) {
    document.exitFullscreen();
  }
  //IE 11
  else if (element.msRequestFullscreen) {
    document.msExitFullscreen();
  }
  // Webkit (works in Safari5.1 and Chrome 15)
  else if (element.webkitRequestFullScreen) {
    document.webkitCancelFullScreen();
  }
  // Firefox (works in nightly)
  else if (element.mozRequestFullScreen) {
    document.mozCancelFullScreen();
  }
};

上一篇下一篇

猜你喜欢

热点阅读