React實現元件全屏化的操作方法
介紹
本文基於React
+antd
,給大家演示一個完整的全屏demo
。
起因是開發今天給我提了一個sql編輯器輸入框
比較小,不支援放大,不太方便。希望能夠全屏顯示,聯想到自己以後可能也會需要,便研究並記錄之。
其實我覺得也沒有很小(orz)
全屏
大家應該都在web頁面裡面見過全屏
按鈕,點選它以後頁面就成了全屏,經常會在程式碼編輯器
中出現。
上圖就是leetcode全屏後的效果了,省略了選單等內容
。
看起來全屏展示分為很多種
,我說說我的看法。
- leetcode這種 它只是頁面全屏
- F11 我們可以按F11進入全屏模式,是chrome自帶的,不需要修改程式碼
- 改變dom,其實和第一種一樣,只不過會隱藏瀏覽器部分內容
如上圖一樣,瀏覽器
的軀殼已經不見了。
全屏的用處
全屏的話,似乎當你希望全身心投入
閱讀的時候比較需要,就好像大家看電影
也喜歡全屏一樣。主要還是放大
元件,讓大量輸入/閱讀操作能夠更愉快♀地進行。
安裝react-full-screen
// yarn add react-full-screen npm install react-full-screen --save
使用yarn或者npm安裝這個庫。官網提供了一些demo,連結在此。
編寫一個最簡單的元件
這裡就直接上程式碼了,程式碼
不多,很好懂。
import React,{ useState } from "react"; import ReactDOM from "react-dom"; import "antd/dist/antd."; 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變數,為的是相容全屏和非全屏的樣式,比如fulwxMJpRkl的時候高度為200,非full高度為100 const [full,setFull] = useState(false); // 建立一個fullScreen的handle const handle = useFullScreenHandle(); return ( <div style={{ background: "#ececec",height: 500 }}> <Row gutter={[8,8]}> <Col span={8}> <Card style={{ height: 500 }}>左側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={() => { // 點選設定full為true,接著呼叫handle的enter方法,進入全屏模式 setFull(true); handle.enter(); }} /> </Tooltip> <Tooltip title="退出全屏"> <FullscreenExitOutlined style={{ fontSize: 16,marginLeft: 16 }} // 退出全屏模式並把full設定為false onClick={() => { setFull(false); handle.exit(); }} /> </Tooltip> </div> <div>假設這是一個編輯器</div> </Card> </FullScreen> </Col> </Row> </div> ); }; ReactDOM.render(<App />,document.getElementById("container"));
展示出來是這個樣子,程式碼裡面加入了註釋
,大家對著看即可。由於codesandbox
裡面不太支援,所以我放到了一個antd pro的專案裡面,給大家看看效果。
這樣,我們做到了只放大編輯器
的效果,隱藏掉了其他不重要的部分(左側部分)。
存在的問題
這樣還遠遠不夠,裡面還有一些細節要優化
。
- 預設背景為黑色,不友好,我們需要設定樣式
- 我們應該在全屏模式把編輯器高度變大
- 還有暗坑,待會再說
各個擊破
背景色
我們使用的這個庫,會預設包裹一個全域性的div
,當全屏的時候,class為.fullscreen.fullscreen-enabled
,而非全屏的時候則為fullscreen
。
所以我們在全域性/元件的樣式裡面寫如下的css即可:
.fullscreen.fullscreen-enabled { background: #fff; padding: 24px; }
可以看到這個樣式已經生效
了,而且我們加入了padding,這樣看起來Card就不會被擠到邊上
。
高度
我們之前設定了full變數,所以我們修改一下程式碼,根據full來判斷高度。
可以看到盒子的高度
已經發生了變化。
擴充套件部分
如果你以為這就結束了,那就大錯特錯
了。接下來我們說一說暗坑。
在antd元件裡面,modal/drawer/message等等都是在body中生成的dom元素,所以我們會遇到什麼問題呢
?
在全屏模式
根本就看不到對話方塊/訊息提示等。
但好在antd
提供了對應的引數,控制dom的掛載元素。
Modal
modal可以這麼解決,我們首先設定一個full_screen
的id:
注意,這個id一定要在FullScreen元件裡面。
接著我們在Modal.infhttp://www.cppcns.como,Modal元件裡面都加入如下引數:
注意: 這裡的modal我的demo裡面並沒有寫,這個屬於擴充套件部分。寫一個modal元件也不復雜,大家可以自己嘗試下。
Modal.info這樣的api
Modal.info({ title: 'cud請求引數',width: 800,// 注意加上這個 getContainer: document.getElementById('full_screen') })
message
通過message.config傳入getContainer方法:
這裡我沒找到很好的辦法,每次message.info的時候都需要config一下,還是比較麻煩的。如果作為全域性配置
則又可能出問題,大家有更好的辦法可以留言哈。
到此這篇關於React實現元件全屏化的文章就介紹到這了,更多相關React元件全屏化內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!