A `position:fixed` sidebar whose width is set in percentage?

前端 未结 5 1095
无人及你
无人及你 2021-01-02 09:01

I\'ve successfully used the beautiful Susy grid system to create a responsive layout similiar to the one of WebDesignerWall.com:

What i failed to implement is a

相关标签:
5条回答
  • 2021-01-02 09:36

    position:fixed works like position:absolute so it isn't positioned in relation of its container. It simply floats into your document. A quick fix would be something like this:

    <div id="fixed-element" style="width:30%"> /* 30% of the document width*/
    lorem ipsum dolor sit amet
    </div>
    
    <div id="faux-sidebar" style="width:30%; display:block"> /* 30% of the document, leave it empty, so it acts like a placeholder for the fixed element*/
    &nbsp;
    </div>
    
    <div id="the-rest" style="width:70%"> /* the rest of the website goes here */
    more lorem ipsum than ever before
    </div>
    
    0 讨论(0)
  • 2021-01-02 09:40

    Why don't you just use math? =)

    Example html:

     <div class="container">
        <div class="col">
            <div class="fixed">This is fixed</div>
        </div>
    </div>
    

    CSS

    .container {
        width: 80%;
        margin: 0 auto;
    }
    
    .col {
       float: left;
        width: 33.3333333333%;
    }
    
    .fixed {
        position: fixed;
        width: 26.666666666%; /* .container width x .col width*/
    }
    
    0 讨论(0)
  • 2021-01-02 09:46

    The way to do it is with a second container. I don't know your exact code, but here's an example. Let's assume your structure is something like this:

    <div class="page">
      <header class="banner">
        <h1>header</h1>
      </header>
      <nav class="navigation">
        <ul class="nav-inner">
          <li>navigation link</li>
        </ul>
      </nav>
      <article class="main">
        <h2>main content</h2>
      </article>
      <footer class="contentinfo">
        <p>footer</p>
      </footer>
    </div>
    

    The only important assumption I made there was ensuring an extra wrapper around my navigation sidebar. I have both the <nav> tag and the <ul> tag to work with. You can use any tags you want, as long as the sidebar has two that can be used for structure - the outer for a fixed container, and the inner for the sidebar itself. The CSS looks like this:

    // one container for everything in the standard document flow.
    .page {
      @include container;
      @include susy-grid-background;
    }
    
    // a position-fixed container for the sidebar.
    .navigation {
      @include container;
      @include susy-grid-background;
      position: fixed;
      left: 0;
      right: 0;
      // the sidebar itself only spans 3 columns.
      .nav-inner { @include span-columns(3); }
    }
    
    // the main content just needs to leave that space open.
    .main { @include pre(3); }
    
    // styles to help you see what is happening.
    header, article, .nav-inner, footer {
      padding: 6em 0;
      outline: 1px solid red;
    }
    

    Cheers.

    0 讨论(0)
  • 2021-01-02 09:46

    Maybe it's possible to fix the position of an element with JS?

    Yes, but it will be tedious and isn't the ideal solution .

    Instead, calculate the appropriate width using JavaScript and assign it, instead of using the percentage directly in CSS. Here's a basic outline:

    function updateSize() {
        var outer = document.getElementById("outercontainer"); //get the container that contains your sidebar
        var navcol = document.getElementById("navcol"); //get the sidebar (which is supposed to have position: fixed;)
        navcol.style.width = Math.floor(outer.offsetWidth * 45/100) + "px"; //or whatever your percentage is
    }
    updateSize();
    window.onresize = updateSize; /*make sure to update width when the window is resized*/
    

    Note: the IDs used above are just placeholders -- you will need to modify them to fit your actual page.

    0 讨论(0)
  • 2021-01-02 09:50

    You can't, fixed-position elements are detached from their containers, position: relative or no position: relative. Just set its width to an absolute value - it looks like your content is always 760 pixels wide, right?

    0 讨论(0)
提交回复
热议问题