遇到的場景:咱們要實現一個配置手機頁面的網站,手機頁面裏的組件有一個能夠吸底的button,也就是固定在手機頁面的最底下,常見的確定是給button添加fixed屬性,可是在這個配置網站裏給定fixed,會讓button脫離咱們虛擬手機模型。css
解決辦法:給父元素添加transfrom:translate(0)樣式,他會讓全部子元素裏面的全部fixed定位變成absolutehtml
開始咱們的結構以下:react
html結構app
<div class="phone_wrap"> <div class="box">123</div> <div class="box">123</div> <div class="box">123</div> <div class="under">under</div> </div>
css結構dom
.phone_wrap { margin: 100px auto; border: 1px solid #000; width: 320px; height: 620px; position: relative; overflow: scroll; transform: translate(0); } .box { box-sizing: border-box; width: 100%; height: 300px; background-color: pink; border: 1px solid #000; margin: 3px 0; } .under { border: 1px solid red; width: 100%; height: 50px; position: fixed; bottom: 0; top: auto; left: 0; }
可是實現效果卻和咱們想的不太同樣,定位以後的位置會隨着內容的滾動而滾動函數
解決途徑:添加一個內部div,讓他實現內容的滾動,也就是將overflow:scroll賦值給內部div,而後給外層容器porsition:relative屬性,讓under相對外部定位網站
html結構spa
<div class="phone_wrap"> <div class="screen"> <div class="box">123</div> <div class="box">123</div> <div class="box">123</div> <div class="under">under</div> </div> </div>
css結構code
.phone_wrap { position: relative; transform: translate(0); } .screen { width: 100%; height: 100%; overflow: scroll; }
實現效果:component
用到咱們實際的項目中,因爲咱們的模擬手機裏面使用react-beautiful-dnd組件,實現拖拽效果,而這個拖拽效果顯示你拖拽元素的位置是經過fixed定位實現的,就致使咱們拖拽時組件位置錯亂。
參考方案:經過react16中提供的protals,使組件能夠脫離父組件層級掛載在DOM樹的任何位置(實際上不可行,拖拽組件掛載在外面,沒有了外層的dragbel的包裹是沒法實現咱們想要的拖拽效果,最終是給fixed定位的元素動態在外層套一個div賦值transfrom:translate(0))
protals
//建立一個protalsDom封裝組件的高階函數 //protals.js import ReactDOM from 'react-dom'; const parent = document.getElementById("root"); const protalsDom = (props) => { return ReactDOM.createPortal( props.children, parent ) } export default protalsDom;
//APP.js裏面使用這個,將123這個div掛載到根節點下面,而不受top這個div樣式的影響 import React from 'react'; import './styles/app.css'; import ProtalsDom from './components/protalsDom' const TestProtals = (props)=> { return ( <div className="top"> <ProtalsDom> <div className="inner">123</div> </ProtalsDom> </div> ) } export default TestProtals;
呈現效果