2016-08-29 2 views
0

Ich habe ein Problem mit Flex-Layout Ich fand here. Sein von this guy. Das Problem ist, dass die Fußzeile zusammen mit der Seite nach unten scrollt, anstatt am Ende des Inhalts oder am unteren Rand der Seite zu bleiben, wenn nicht genug Inhalt vorhanden ist. Was ich damit meine ist,Flexbox 3 Spaltenlayout mit Sticky Footer

enter image description here

Der Code ist für die Komponenten reagieren, aber es ist leicht zu verstehen.

Jede Hilfe sehr geschätzt.

//// All styles are in Layout component. 
 

 
/////////// LAYOUT START //////////////// 
 

 
class Layout extends React.Component { 
 
    constructor() { 
 
    super(); 
 
    } 
 

 
    render() { 
 
    
 
    // STYLES START HERE 
 
    
 
    const styleLayout = { 
 
     siteWrapper: { 
 
       display: 'flex', 
 
       flexDirection: "column", 
 
       height: '100vh' 
 
     },  
 
     site: {   
 
       display: 'flex', 
 
       flexGrow: '1', 
 
       background: 'pink' 
 
     }, 
 
     siteContent: {   
 
       flexGrow: '1', 
 
       paddingTop: '80px', 
 
       background: 'lightgreen', 
 
     }, 
 
     rightColumn : {    
 
      width: '200px', 
 
      paddingTop: '80px', 
 
      background: 'lightblue' 
 
     }, 
 
     leftColumn : { 
 
      order: '-1', 
 
      width: '200px', 
 
      paddingTop: '80px', 
 
      background: 'honeydew' 
 
     } 
 
    } 
 
    
 

 
    return (
 
     
 
     <div style={styleLayout.siteWrapper}>    
 
      <Header /> 
 
     
 
      <div style={styleLayout.site}> 
 
       
 
       <div style={styleLayout.siteContent}> 
 
        dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
       </div> 
 
       
 
       <div style={styleLayout.leftColumn}> 
 
        <LeftColumn /> 
 
       </div> 
 
       
 
       <div style={styleLayout.rightColumn}> 
 
        <RightColumn /> 
 
       </div> 
 

 
      </div> 
 
      <Footer /> 
 
     </div>  
 
    ); 
 
    } 
 
} 
 

 
//////////// COMPONENTS START 
 

 
class RightColumn extends React.Component { 
 
    render() { 
 
    
 
    return (
 
     <div >Right Column</div> 
 
    ); 
 
    } 
 
} 
 

 

 
class LeftColumn extends React.Component { 
 
    render() { 
 

 
    return (
 
     <div >Left dsargsrtdgfeadcsfdsColumn</div> 
 
    ); 
 
    } 
 
} 
 

 
class Header extends React.Component { 
 

 
    constructor(props) { 
 
    super(props) 
 
    } 
 

 
    render() { 
 
    const styleHeader = { 
 
     background: 'olivedrab' 
 
    } 
 
    return (
 
     <div style={styleHeader}> 
 
     <h2> Header</h2> 
 
     </div> 
 
     
 
    ); 
 
    } 
 
} 
 

 

 
class Footer extends React.Component { 
 
    render() { 
 
    \t const styleFooter = { 
 
    \t \t backgroundColor: 'grey', 
 
    \t \t height: '100px', 
 
    } 
 
    return (
 
     <footer style={styleFooter}>footer</footer> 
 
    ); 
 
    } 
 
} 
 

 
/////////// COMPONENTS END //////////////// 
 

 

 
ReactDOM.render(
 
<Layout /> 
 
    \t 
 
,document.getElementById('app') 
 
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id='app'></div>

Antwort

1

Sie haben min-height zu verwenden, anstatt height

diese

siteWrapper: { 
      display: 'flex', 
      flexDirection: "column", 
      height: '100vh' 
} 

sollte

siteWrapper: { 
      display: 'flex', 
      flexDirection: "column", 
      minHeight: '100vh' 
} 

//// All styles are in Layout component. 
 

 
/////////// LAYOUT START //////////////// 
 

 
class Layout extends React.Component { 
 
    constructor() { 
 
    super(); 
 
    } 
 

 
    render() { 
 
    
 
    // STYLES START HERE 
 
    
 
    const styleLayout = { 
 
     siteWrapper: { 
 
       display: 'flex', 
 
       flexDirection: "column", 
 
       minHeight: '100vh' 
 
     },  
 
     site: {   
 
       display: 'flex', 
 
       flexGrow: '1', 
 
       background: 'pink' 
 
     }, 
 
     siteContent: {   
 
       flexGrow: '1', 
 
       paddingTop: '80px', 
 
       background: 'lightgreen', 
 
     }, 
 
     rightColumn : {    
 
      width: '200px', 
 
      paddingTop: '80px', 
 
      background: 'lightblue' 
 
     }, 
 
     leftColumn : { 
 
      order: '-1', 
 
      width: '200px', 
 
      paddingTop: '80px', 
 
      background: 'honeydew' 
 
     } 
 
    } 
 
    
 

 
    return (
 
     
 
     <div style={styleLayout.siteWrapper}>    
 
      <Header /> 
 
     
 
      <div style={styleLayout.site}> 
 
       
 
       <div style={styleLayout.siteContent}> 
 
        dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
       </div> 
 
       
 
       <div style={styleLayout.leftColumn}> 
 
        <LeftColumn /> 
 
       </div> 
 
       
 
       <div style={styleLayout.rightColumn}> 
 
        <RightColumn /> 
 
       </div> 
 

 
      </div> 
 
      <Footer /> 
 
     </div>  
 
    ); 
 
    } 
 
} 
 

 
//////////// COMPONENTS START 
 

 
class RightColumn extends React.Component { 
 
    render() { 
 
    
 
    return (
 
     <div >Right Column</div> 
 
    ); 
 
    } 
 
} 
 

 

 
class LeftColumn extends React.Component { 
 
    render() { 
 

 
    return (
 
     <div >Left dsargsrtdgfeadcsfdsColumn</div> 
 
    ); 
 
    } 
 
} 
 

 
class Header extends React.Component { 
 

 
    constructor(props) { 
 
    super(props) 
 
    } 
 

 
    render() { 
 
    const styleHeader = { 
 
     background: 'olivedrab' 
 
    } 
 
    return (
 
     <div style={styleHeader}> 
 
     <h2> Header</h2> 
 
     </div> 
 
     
 
    ); 
 
    } 
 
} 
 

 

 
class Footer extends React.Component { 
 
    render() { 
 
    \t const styleFooter = { 
 
    \t \t backgroundColor: 'grey', 
 
    \t \t height: '100px', 
 
    } 
 
    return (
 
     <footer style={styleFooter}>footer</footer> 
 
    ); 
 
    } 
 
} 
 

 
/////////// COMPONENTS END //////////////// 
 

 

 
ReactDOM.render(
 
<Layout /> 
 
    \t 
 
,document.getElementById('app') 
 
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id='app'></div>

+0

Gott verdammt noch mal. Ich spiele mit der Höhe auf der Verpackung und dem Körper. Schade, dass ich es selbst nicht herausgefunden habe. Danke vielmals. Du hast mich gerettet. – yoK0

0

, wenn Sie Ihre Fußzeile Stick unten auf der Seite verwenden mögen diese

//// All styles are in Layout component. 
 

 
/////////// LAYOUT START //////////////// 
 

 
class Layout extends React.Component { 
 
    constructor() { 
 
    super(); 
 
    } 
 

 
    render() { 
 
    
 
    // STYLES START HERE 
 
    
 
    const styleLayout = { 
 
     siteWrapper: { 
 
       display: 'flex', 
 
       flexDirection: "column", 
 
       height: '100vh' 
 
     },  
 
     site: {   
 
       display: 'flex', 
 
       flexGrow: '1', 
 
       background: 'pink' 
 
     }, 
 
     siteContent: {   
 
       flexGrow: '1', 
 
       paddingTop: '80px', 
 
       background: 'lightgreen', 
 
     }, 
 
     rightColumn : {    
 
      width: '200px', 
 
      paddingTop: '80px', 
 
      background: 'lightblue' 
 
     }, 
 
     leftColumn : { 
 
      order: '-1', 
 
      width: '200px', 
 
      paddingTop: '80px', 
 
      background: 'honeydew' 
 
     } 
 
    } 
 
    
 

 
    return (
 
     
 
     <div style={styleLayout.siteWrapper}>    
 
      <Header /> 
 
     
 
      <div style={styleLayout.site}> 
 
       
 
       <div style={styleLayout.siteContent}> 
 
        dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
     dummy content dummy content dummy content dummy content dummy content 
 
       </div> 
 
       
 
       <div style={styleLayout.leftColumn}> 
 
        <LeftColumn /> 
 
       </div> 
 
       
 
       <div style={styleLayout.rightColumn}> 
 
        <RightColumn /> 
 
       </div> 
 

 
      </div> 
 
      <Footer /> 
 
     </div>  
 
    ); 
 
    } 
 
} 
 

 
//////////// COMPONENTS START 
 

 
class RightColumn extends React.Component { 
 
    render() { 
 
    
 
    return (
 
     <div >Right Column</div> 
 
    ); 
 
    } 
 
} 
 

 

 
class LeftColumn extends React.Component { 
 
    render() { 
 

 
    return (
 
     <div >Left dsargsrtdgfeadcsfdsColumn</div> 
 
    ); 
 
    } 
 
} 
 

 
class Header extends React.Component { 
 

 
    constructor(props) { 
 
    super(props) 
 
    } 
 

 
    render() { 
 
    const styleHeader = { 
 
     background: 'olivedrab' 
 
    } 
 
    return (
 
     <div style={styleHeader}> 
 
     <h2> Header</h2> 
 
     </div> 
 
     
 
    ); 
 
    } 
 
} 
 

 

 
class Footer extends React.Component { 
 
    render() { 
 
    \t const styleFooter = { 
 
    \t \t backgroundColor: 'grey', 
 
    \t \t height: '30px', 
 
    \t \t position: 'fixed', 
 
    \t \t bottom: 0, 
 
    \t \t left: 0, 
 
    \t \t width: '100%' 
 
    } 
 
    return (
 
     <footer style={styleFooter}>footer</footer> 
 
    ); 
 
    } 
 
} 
 

 
/////////// COMPONENTS END //////////////// 
 

 

 
ReactDOM.render(
 
<Layout /> 
 
    \t 
 
,document.getElementById('app') 
 
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id='app'></div>

+0

Danke, dass du dir Zeit genommen hast. Ich war eigentlich auf der Suche nach einer Fußzeile, die am Ende der Seite/Inhalt bleibt, es sei denn, es gibt nur ein wenig Inhalt der es am unteren Rand des Bildschirms bleibt. Übrigens, wenn du genau hinsiehst, funktioniert dein Sticky Footer, aber das Layout ist immer noch kaputt. – yoK0

0

ich mein eigenes React layout library "Re-Flex" zunächst verschachteltes resizable Scheiben und komplex zu handhaben geschrieben Layouts. Dies ist vielleicht ein Overkill für das, was Sie erreichen möchten, aber es könnte nützlich sein, wenn Sie eines Tages einen Bereich in der Größe Ihrer Seite hinzufügen möchten.

Ein Beispiel der doc ist ein komplettes Layout mit klebrigen Kopf- und Fußzeile:

class ReflexAdvancedDemo extends React.Component { 

    constructor() { 

    super() 

    this.resizeProps = { 
     onStopResize: this.onStopResize.bind(this), 
     onResize: this.onResize.bind(this) 
    } 
    } 

    onResize (e) { 

    if (e.domElement) { 

     e.domElement.classList.add('resizing') 
    } 
    } 

    onStopResize (e) { 

    if (e.domElement) { 

     e.domElement.classList.remove('resizing') 
    } 
    } 

    render() { 

    return (
     <ReflexContainer orientation="horizontal"> 
     <ReflexElement className="header" flex={0.1}> 
      <div className="pane-content"> 
      <label> 
       Header (fixed) 
      </label> 
      </div> 
     </ReflexElement> 
     <ReflexElement> 
      <ReflexContainer orientation="vertical"> 
      <ReflexElement {...this.resizeProps}> 
       <ReflexContainer orientation="horizontal"> 
       <ReflexElement {...this.resizeProps}> 
        <div className="pane-content"> 
        <div style={{height: '30%'}}/> 
        <label style={{height: '0%'}}> 
         Left Pane <br/> Top 
         <br/> 
         (splitter propagation) 
        </label> 
        </div> 
       </ReflexElement> 
       <ReflexSplitter propagate={true} {...this.resizeProps}/> 
       <ReflexElement {...this.resizeProps}> 
        <div className="pane-content"> 
        <div style={{height: '30%'}}/> 
        <label style={{height: '0%'}}> 
         Left Pane <br/> Middle 
         <br/> 
         (splitter propagation) 
        </label> 
        </div> 
       </ReflexElement> 
       <ReflexSplitter propagate={true} {...this.resizeProps}/> 
       <ReflexElement {...this.resizeProps}> 
        <div className="pane-content"> 
        <div style={{height: '30%'}}/> 
        <label style={{height: '0%'}}> 
         Left Pane <br/> Bottom 
         <br/> 
         (splitter propagation) 
        </label> 
        </div> 
       </ReflexElement> 
       </ReflexContainer> 
      </ReflexElement> 
      <ReflexSplitter {...this.resizeProps}/> 
      <ReflexElement flex={0.5} {...this.resizeProps}> 
       <div className="pane-content"> 
       <label> 
        Middle Pane 
       </label> 
       </div> 
      </ReflexElement> 
      <ReflexSplitter{...this.resizeProps}/> 
      <ReflexElement {...this.resizeProps}> 
       <ReflexContainer orientation="horizontal"> 
       <ReflexElement {...this.resizeProps}> 
        <div> 
        <ReflexContainer orientation="vertical"> 
         <ReflexElement {...this.resizeProps}> 
         <div className="pane-content"> 
          <label> 
          Right Pane <br/> Upper-Left 
          </label> 
         </div> 
         </ReflexElement> 
         <ReflexSplitter/> 
         <ReflexElement {...this.resizeProps}> 
         <div className="pane-content"> 
          <label> 
          Right Pane <br/> Upper-Right 
          </label> 
         </div> 
         </ReflexElement> 
        </ReflexContainer> 
        </div> 
       </ReflexElement> 
       <ReflexSplitter {...this.resizeProps}/> 
       <ReflexElement {...this.resizeProps}> 
        <div className="pane-content"> 
        <label> 
         Right Pane <br/> Bottom 
        </label> 
        </div> 
       </ReflexElement> 
       </ReflexContainer> 
      </ReflexElement> 
      </ReflexContainer> 
     </ReflexElement> 
     <ReflexElement className="footer" flex={0.1}> 
      <div className="pane-content"> 
      <label> 
       Footer (fixed) 
      </label> 
      </div> 
     </ReflexElement> 
     </ReflexContainer> 
    ) 
    } 
} 

enter image description here