React實(shí)現(xiàn)組件全屏化的操作方法
介紹
本文基于React
+antd
,給大家演示一個(gè)完整的全屏demo
。
起因是開(kāi)發(fā)今天給我提了一個(gè)sql編輯器輸入框
比較小,不支持放大,不太方便。希望能夠全屏顯示,聯(lián)想到自己以后可能也會(huì)需要,便研究并記錄之。
其實(shí)我覺(jué)得也沒(méi)有很小(orz)
全屏
大家應(yīng)該都在web頁(yè)面里面見(jiàn)過(guò)全屏
按鈕,點(diǎn)擊它以后頁(yè)面就成了全屏,經(jīng)常會(huì)在代碼編輯器
中出現(xiàn)。
上圖就是leetcode全屏后的效果了,省略了菜單等內(nèi)容
。
看起來(lái)全屏展示分為很多種
,我說(shuō)說(shuō)我的看法。
- leetcode這種 它只是頁(yè)面全屏
- F11 我們可以按F11進(jìn)入全屏模式,是chrome自帶的,不需要修改代碼
- 改變dom,其實(shí)和第一種一樣,只不過(guò)會(huì)隱藏瀏覽器部分內(nèi)容
如上圖一樣,瀏覽器
的軀殼已經(jīng)不見(jiàn)了。
全屏的用處
全屏的話,似乎當(dāng)你希望全身心投入
閱讀的時(shí)候比較需要,就好像大家看電影
也喜歡全屏一樣。主要還是放大
組件,讓大量輸入/閱讀操作能夠更愉快♀地進(jìn)行。
安裝react-full-screen
// yarn add react-full-screen npm install react-full-screen --save
使用yarn或者npm安裝這個(gè)庫(kù)。官網(wǎng)提供了一些demo,鏈接在此。
編寫一個(gè)最簡(jiǎn)單的組件
這里就直接上代碼了,代碼
不多,很好懂。
import React, { useState } from "react"; import ReactDOM from "react-dom"; import "antd/dist/antd.css"; import "./index.css"; import { FullscreenOutlined, FullscreenExitOutlined } from "@ant-design/icons"; import { Tooltip, Card, Col, Row } from "antd"; import { FullScreen, useFullScreenHandle } from "react-full-screen"; const App = () => { // 定義full變量,為的是兼容全屏和非全屏的樣式,比如full的時(shí)候高度為200,非full高度為100 const [full, setFull] = useState(false); // 創(chuàng)建一個(gè)fullScreen的handle const handle = useFullScreenHandle(); return ( <div style={{ background: "#ececec", height: 500 }}> <Row gutter={[8, 8]}> <Col span={8}> <Card style={{ height: 500 }}>左側(cè)card</Card> </Col> <Col span={16}> <FullScreen handle={handle} onChange={setFull} style={{ background: "#ffffff" }} > <Card style={{ height: 500 }}> <div> <Tooltip title="全屏"> <FullscreenOutlined style={{ fontSize: 16 }} onClick={() => { // 點(diǎn)擊設(shè)置full為true,接著調(diào)用handle的enter方法,進(jìn)入全屏模式 setFull(true); handle.enter(); }} /> </Tooltip> <Tooltip title="退出全屏"> <FullscreenExitOutlined style={{ fontSize: 16, marginLeft: 16 }} // 退出全屏模式并把full設(shè)置為false onClick={() => { setFull(false); handle.exit(); }} /> </Tooltip> </div> <div>假設(shè)這是一個(gè)編輯器</div> </Card> </FullScreen> </Col> </Row> </div> ); }; ReactDOM.render(<App />, document.getElementById("container"));
展示出來(lái)是這個(gè)樣子,代碼里面加入了注釋
,大家對(duì)著看即可。由于codesandbox
里面不太支持,所以我放到了一個(gè)antd pro的項(xiàng)目里面,給大家看看效果。
這樣,我們做到了只放大編輯器
的效果,隱藏掉了其他不重要的部分(左側(cè)部分)。
存在的問(wèn)題
這樣還遠(yuǎn)遠(yuǎn)不夠,里面還有一些細(xì)節(jié)要優(yōu)化
。
- 默認(rèn)背景為黑色,不友好,我們需要設(shè)置樣式
- 我們應(yīng)該在全屏模式把編輯器高度變大
- 還有暗坑,待會(huì)再說(shuō)
各個(gè)擊破
背景色
我們使用的這個(gè)庫(kù),會(huì)默認(rèn)包裹一個(gè)全局的div
,當(dāng)全屏的時(shí)候,class為.fullscreen.fullscreen-enabled
,而非全屏的時(shí)候則為fullscreen
。
所以我們?cè)谌?組件的樣式里面寫如下的css即可:
.fullscreen.fullscreen-enabled { background: #fff; padding: 24px; }
可以看到這個(gè)樣式已經(jīng)生效
了,而且我們加入了padding,這樣看起來(lái)Card就不會(huì)被擠到邊上
。
高度
我們之前設(shè)置了full變量,所以我們修改一下代碼,根據(jù)full來(lái)判斷高度。
可以看到盒子的高度
已經(jīng)發(fā)生了變化。
擴(kuò)展部分
如果你以為這就結(jié)束了,那就大錯(cuò)特錯(cuò)
了。接下來(lái)我們說(shuō)一說(shuō)暗坑。
在antd組件里面,modal/drawer/message等等都是在body中生成的dom元素,所以我們會(huì)遇到什么問(wèn)題呢
?
在全屏模式
根本就看不到對(duì)話框/消息提示等。
但好在antd
提供了對(duì)應(yīng)的參數(shù),控制dom的掛載元素。
Modal
modal可以這么解決,我們首先設(shè)置一個(gè)full_screen
的id:
注意,這個(gè)id一定要在FullScreen組件里面。
接著我們?cè)贛odal.info,Modal組件里面都加入如下參數(shù):
注意: 這里的modal我的demo里面并沒(méi)有寫,這個(gè)屬于擴(kuò)展部分。寫一個(gè)modal組件也不復(fù)雜,大家可以自己嘗試下。
Modal.info這樣的api
Modal.info({ title: 'cud請(qǐng)求參數(shù)', width: 800, // 注意加上這個(gè) getContainer: document.getElementById('full_screen') })
message
通過(guò)message.config傳入getContainer方法:
這里我沒(méi)找到很好的辦法,每次message.info的時(shí)候都需要config一下,還是比較麻煩的。如果作為全局配置
則又可能出問(wèn)題,大家有更好的辦法可以留言哈。
到此這篇關(guān)于React實(shí)現(xiàn)組件全屏化的文章就介紹到這了,更多相關(guān)React組件全屏化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React動(dòng)畫實(shí)現(xiàn)方案Framer Motion讓頁(yè)面自己動(dòng)起來(lái)
這篇文章主要為大家介紹了React動(dòng)畫實(shí)現(xiàn)方案Framer Motion讓頁(yè)面自己動(dòng)起來(lái),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10react-router實(shí)現(xiàn)跳轉(zhuǎn)傳值的方法示例
這篇文章主要給大家介紹了關(guān)于react-router實(shí)現(xiàn)跳轉(zhuǎn)傳值的相關(guān)資料,文中給出了詳細(xì)的示例代碼,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-05-05React事件處理過(guò)程中傳參的實(shí)現(xiàn)方法
這篇文章主要介紹了React事件處理過(guò)程中傳參的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10在react-antd中彈出層form內(nèi)容傳遞給父組件的操作
這篇文章主要介紹了在react-antd中彈出層form內(nèi)容傳遞給父組件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10詳解使用create-react-app快速構(gòu)建React開(kāi)發(fā)環(huán)境
這篇文章主要介紹了詳解使用create-react-app快速構(gòu)建React開(kāi)發(fā)環(huán)境,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05React父子組件傳值(組件通信)的實(shí)現(xiàn)方法
本文主要介紹了React父子組件傳值(組件通信)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05