zoukankan      html  css  js  c++  java
  • react中div的全屏与退出全屏

    基础版:

    import React, { useState, useRef } from 'react'
    import { Tabs, List, Input, Image } from 'antd'
    import Api from '../../../../../api'
    import moment from 'moment'
    import { deepClone } from '../../../../../utils/tools'
    import { Icon } from '../../../../../components/light'
    
    const { Search } = Input
    
    const { TabPane } = Tabs
    let historyFriends = []
    export default function useChatList() {
    
      const [isFullScreen, setIsFullScreen] = useState(false)
      const chatContent = useRef(null)
    
      //全屏
      const handleFullScreen = () => {
        if (isFullScreen) {
          document.exitFullscreen()
        } else {
          chatContent.current.requestFullscreen()
        }
        
        setIsFullScreen(!isFullScreen)
      }
    
    
      const getChatDom = () => {
        return (
          <div className="m-chat-list-wrap">
            <div className="m-chat-list-info" ref={chatContent}>
              <div className="m-chat-list-header">
                <span className="m-chat-list-header-title">聊天内容</span>
                <span className="m-chat-list-header-content"></span>
                <span className="m-chat-list-header-tool" onClick={handleFullScreen}>
                  <Icon
                    name={isFullScreen ? 'fullscreen-exit' : 'fullscreen'}
                  ></Icon>
                  {isFullScreen ? '退出全屏' : '全屏查看'}
                </span>
              </div>
            </div>
          </div>
        )
      }
    
      return {
        handleReset,
        getChatDom,
      }
    }
    

        if (isFullScreen) {
          document.exitFullscreen()
        } else {
          chatContent.current.requestFullscreen()
        }

    加强版:

    full.js:

    //全屏
    // 打开浏览器全屏模式
    /**
     * screenChange <Function> 为窗口变化的 的回调函数  参数为当前是否为全屏状态
     */
    const initFullScreen = (screenChange) => {
      // 取值17是为了处理页面内容出现滚动条的情况
      let isFull =
        window.screen.height - window.document.documentElement.clientHeight <= 17
    
      // 阻止F11键默认事件,用HTML5全屏API代替
      window.addEventListener('keydown', function (e) {
        e = e || window.event
        if (e.keyCode === 122 && !isFull) {
          e.preventDefault()
          enterFullScreen()
        }
      })
      //监听窗口变化
      window.onresize = function () {
        isFull =
          window.screen.height - window.document.documentElement.clientHeight <= 17
        screenChange(isFull)
      }
    }
    
    //进入全屏
    const enterFullScreen = (el = document.documentElement) => {
      let rfs =
        el.requestFullScreen ||
        el.webkitRequestFullScreen ||
        el.mozRequestFullScreen ||
        el.msRequestFullscreen
      if (rfs) {
        // typeof rfs != "undefined" && rfs
        rfs.call(el)
      } else if (typeof window.ActiveXObject !== 'undefined') {
        // for IE,这里其实就是模拟了按下键盘的F11,使浏览器全屏
        let wscript = new ActiveXObject('WScript.Shell') //eslint-disable-line
        if (wscript != null) {
          wscript.SendKeys('{F11}')
        }
      }
    }
    
    // 退出全屏
    const exitFullScreen = () => {
      let el = document
      let cfs =
        el.cancelFullScreen ||
        el.mozCancelFullScreen ||
        el.msExitFullscreen ||
        el.webkitExitFullscreen ||
        el.exitFullscreen
      if (cfs) {
        // typeof cfs != "undefined" && cfs
        cfs.call(el)
      } else if (typeof window.ActiveXObject !== 'undefined') {
        // for IE,这里和fullScreen相同,模拟按下F11键退出全屏
        let wscript = new ActiveXObject('WScript.Shell') //eslint-disable-line
        if (wscript != null) {
          wscript.SendKeys('{F11}')
        }
      }
    }
    
    export {
      initFullScreen,
      enterFullScreen,
      exitFullScreen,
    }
    
    import React, { useState, useRef, useEffect } from 'react'
    import { Tabs, List, Input, Image } from 'antd'
    import Api from '../../../../../api'
    import moment from 'moment'
    import { deepClone } from '../../../../../utils/tools'
    import { Icon } from '../../../../../components/light'
    import {
      initFullScreen,
      enterFullScreen,
      exitFullScreen,
    } from '../../../../../utils/full'
    
    const { Search } = Input
    
    const { TabPane } = Tabs
    let historyFriends = []
    export default function useChatList() {
      const [activeKey, setActiveKey] = useState('1')
      const [friends, setFriends] = useState([])
      const [searchValue, setSearchValue] = useState()
      const [friendActiveId, setFriendActiveId] = useState()
      const [isFullScreen, setIsFullScreen] = useState(false)
      const chatContent = useRef(null)
    
      //获取好友或群列表
      const handleSearchFriendsList = ({ type }) => {
        Api.light.testInsightFriends({ type }).then((res) => {
          if (res.state === 1) {
            const friends = Array.isArray(res.data) ? res.data : []
            setFriends(friends)
            historyFriends = deepClone(res.data)
            if (friends.length > 0) {
              setFriendActiveId(friends[0].id)
            }
          }
        })
      }
    
      //切换tab
      const handleTabsChange = (key) => {
        setActiveKey(key)
        handleSearchFriendsList({ type: key })
      }
    
      //重置
      const handleReset = () => {
        setActiveKey('1')
        handleSearchFriendsList({ type: '1' })
      }
    
      //搜索
      const onSearch = (value) => {
        console.log(value)
        value = value.trim()
        if (value) {
          const newFriends = historyFriends.filter((item) => {
            if (item.name.includes(value)) {
              return true
            } else {
              return false
            }
          })
          setFriends(newFriends)
        } else {
          setFriends(historyFriends)
        }
      }
    
      //全屏
      const handleFullScreen = () => {
        if (isFullScreen) {
          exitFullScreen()
        } else {
          enterFullScreen(chatContent.current)
        }
    
        setIsFullScreen(!isFullScreen)
      }
    
      const screenChange = (isFull) => {
        console.log('是否全屏', isFull)
        setIsFullScreen(isFull)
      }
    
      useEffect(() => {
        //初始化
        initFullScreen(screenChange)
      }, [])
    
      const renderFriends = ({ type }) => {
        const friendsDom = (
          <List
            dataSource={friends}
            renderItem={(item) => (
              <div
                className={`m-friends-item ${
                  item.id === friendActiveId ? 'active' : ''
                }`}
                onClick={() => setFriendActiveId(item.id)}
              >
                <Image
                  className="m-friends-item-img"
                  src={item.img}
                  alt={'图片'}
                  preview={{
                    mask: '',
                  }}
                ></Image>
                <div className="m-friends-item-info">
                  <div className="m-friends-item-title">
                    <div className="m-friends-item-title-nickname">{item.name}</div>
                    <div className="m-friends-item-title-time">
                      {moment(item.date).format('YYYY-MM-DD')}
                    </div>
                  </div>
                  <div className="m-friends-item-msg">{item.msg}</div>
                </div>
              </div>
            )}
          />
        )
    
        return (
          <div className="m-friends-wrap">
            <div className="m-friends-search">
              <Search
                value={searchValue}
                onChange={(e) => setSearchValue(e.target.value)}
                placeholder="搜索好友昵称/备注"
                onSearch={onSearch}
                style={{  '100%' }}
              />
            </div>
            <div className="m-friends-info">{friendsDom}</div>
            <div className="m-friends-footer">
              共有数据: <span className="m-total-text">{friends.length}</span> 条
            </div>
          </div>
        )
      }
    
      const getChatDom = () => {
        return (
          <div className="m-chat-list-wrap">
            <div className="m-chat-list-sidebar">
              <Tabs
                activeKey={activeKey}
                onChange={handleTabsChange}
                centered
                className="m-friends-tabs"
              >
                <TabPane tab="外部好友" key="1">
                  {renderFriends({ type: '1' })}
                </TabPane>
                <TabPane tab="内部好友" key="2">
                  {renderFriends({ type: '2' })}
                </TabPane>
                <TabPane tab="外部群" key="3">
                  {renderFriends({ type: '3' })}
                </TabPane>
                <TabPane tab="内部群" key="4">
                  {renderFriends({ type: '4' })}
                </TabPane>
              </Tabs>
            </div>
            <div className="m-chat-list-info" ref={chatContent}>
              <div className="m-chat-list-header">
                <span className="m-chat-list-header-title">聊天内容</span>
                <span className="m-chat-list-header-content"></span>
                <span
                  className="m-chat-list-header-tool"
                  onClick={handleFullScreen}
                >
                  <Icon
                    name={isFullScreen ? 'fullscreen-exit' : 'fullscreen'}
                  ></Icon>
                  {isFullScreen ? '退出全屏' : '全屏查看'}
                </span>
              </div>
            </div>
          </div>
        )
      }
    
      return {
        handleReset,
        getChatDom,
      }
    }
    

    参考链接:

    https://developer.mozilla.org/zh-CN/docs/Web/API/Element/requestFullScreen

    https://developer.mozilla.org/zh-CN/docs/Web/API/Document/exitFullscreen

  • 相关阅读:
    ListView Fragment 设置 setLayoutAnimation() 无效 Binary
    android dialog activity touch outside Binary
    Android EditText 监听软键盘删除键 Binary
    Log4net简介
    Js Cookies
    软件版本定义
    NHibernate配置文件和映射文件的详解
    MS SQLSERVER 一次性删除所有表以及视图等等
    SQL Server 2005调整兼容级别,存储过程:sp_dbcmptlevel
    jquery 屏蔽右击 复制
  • 原文地址:https://www.cnblogs.com/xutongbao/p/15264313.html
Copyright © 2011-2022 走看看