代码之家  ›  专栏  ›  技术社区  ›  CodeF0x

Div在它的兄弟层下面

  •  2
  • CodeF0x  · 技术社区  · 8 年前

    我正在与一个div做斗争,这个div在它的兄弟姐妹的基础上破坏了可用性。

    我想达到的内容 #container 直接从下面开始 header 当点击时内容可以立即滚动 footer 而不是下垫 页脚 . (要复制,只需添加一些任务)


    对于 标题 ,我想申请一些 padding #集装箱 它有点用,但当窗户重新调整时就坏了。对于底部 页脚 ,也不是 margin 衬垫 工作。

    我做错什么了?

    document.addEventListener('DOMContentLoaded', function() {
      window.input = document.getElementById('input');
      window.container = document.getElementById('container');
    
      window.input.addEventListener('keypress', function(event) {
        if (event.keyCode == '13' && window.input.value != '') {
          addTask();
        }
      });
    
      /**for (let i = 0; i < localStorage.length; i++) {
        addTask(i, 'auto');
      }*/
    });
    
    const checkButton = () => {
      if (window.input.value != '') {
        addTask();
      }
    };
    
    const addTask = (index, type) => {
      let task = document.createElement('div');
    
      if (!type) {
        task.textContent = window.input.value;
        //localStorage.setItem(window.input.value, window.input.value);
      } else {
        //task.textContent = localStorage.getItem(localStorage.key(index));
      }
      task.classList.add('task');
    
      let closeButton = document.createElement('div');
      closeButton.textContent = 'X';
      closeButton.classList.add('close');
      closeButton.setAttribute('onclick', 'removeTask(this)');
      task.appendChild(closeButton);
    
      window.container.appendChild(task);
    
      window.input.value = '';
    };
    
    const removeTask = (task) => {
      window.container.removeChild(task.parentNode);
      //localStorage.removeItem(task.parentNode.textContent.substring(0, task.parentNode.textContent.length - 1));
    };
    #input {
      width: 80%;
      color: #E6E6FA;
    }
    
    body {
      background-color: #E9FEF2;
    }
    
    #container {
      padding-top: 6%; /** My try with the padding */
      width: 100%;
    }
    
    h5 {
      margin: 1% 1%;
    }
    
    header {
      position: fixed;
      top: 0;
      width: 100%;
      background-color: #333;
      color: #E6E6FA;
    }
    
    footer {
      overflow: hidden;
      background-color: #333;
      position: fixed;
      bottom: 0;
      width: 100%;
      padding: 10px;
      text-align: center;
    }
    
    .task {
      text-align: left;
      padding: 1% 1% 1% 1%;
      background-color: #acaaaa;
      width: 100%;
    }
    
    .task:nth-child(odd) {
      background-color: #ccc7c7;
    }
    
    .close {
      text-align: center;
      width: 2%;
      color: #FF0000;
      float: right;
      margin-right: 1%;
    }
    
    .close:hover {
      background-color: #FF0000;
      color: #FFFFFF;
      cursor: pointer;
    }
    <!doctype html>
    <html>
    
    <head>
      <title>What's up?</title>
      <meta charset="utf-8">
      <!-- Compiled and minified CSS -->
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/css/materialize.min.css">
    
      <!-- Compiled and minified JavaScript -->
      <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/js/materialize.min.js"></script>
    </head>
    
    <body>
      <header>
        <h5>Your tasks:</h5>
      </header>
      <div id="container"></div>
      <footer>
        <input type="text" placeholder="Enter task here..." id="input" autofocus>
        <a class="waves waves-light btn" onclick="checkButton()">Add</a>
      </footer>
    </body>
    
    </html>

    我还有一个 codepen 玩玩。

    3 回复  |  直到 8 年前
        1
  •  1
  •   Hidden Hobbes    8 年前

    问题

    问题是你正在使用 position: fixed; header footer 但是不知道他们会有多高,这意味着你不能使用 margin padding 可靠地“保留”空间。

    解决方案

    如果 标题 页脚 有一个固定的高度你可以加上顶部和底部 衬垫 #container 去“清除”他们。

    如果 标题 页脚 没有一套 height 当容器占据剩余空间时,确保它们保持在顶部和底部的一种方法是使用 flexbox 相反。

    document.addEventListener('DOMContentLoaded', function() {
      window.input = document.getElementById('input');
      window.container = document.getElementById('container');
    
      window.input.addEventListener('keypress', function(event) {
        if (event.keyCode == '13' && window.input.value != '') {
          addTask();
        }
      });
    
      /**for (let i = 0; i < localStorage.length; i++) {
        addTask(i, 'auto');
      }*/
    });
    
    const checkButton = () => {
      if (window.input.value != '') {
        addTask();
      }
    };
    
    const addTask = (index, type) => {
      let task = document.createElement('div');
    
      if (!type) {
        task.textContent = window.input.value;
        //localStorage.setItem(window.input.value, window.input.value);
      } else {
        //task.textContent = localStorage.getItem(localStorage.key(index));
      }
      task.classList.add('task');
    
      let closeButton = document.createElement('div');
      closeButton.textContent = 'X';
      closeButton.classList.add('close');
      closeButton.setAttribute('onclick', 'removeTask(this)');
      task.appendChild(closeButton);
    
      window.container.appendChild(task);
    
      window.input.value = '';
    };
    
    const removeTask = (task) => {
      window.container.removeChild(task.parentNode);
      //localStorage.removeItem(task.parentNode.textContent.substring(0, task.parentNode.textContent.length - 1));
    };
    #input {
      width: 80%;
      color: #E6E6FA;
    }
    
    body {
      background-color: #E9FEF2;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    height: 100vh;
    }
    
    #container {
      /*padding-top: 6%;*/ /** My try with the padding */
      width: 100%;    
    flex: 1 1 auto;
    overflow-y: auto;
    }
    
    h5 {
      margin: 1% 1%;
    }
    
    header {
      /*position: fixed;
      top: 0;*/
      width: 100%;
      background-color: #333;
      color: #E6E6FA;
    }
    
    footer {
      overflow: hidden;
      background-color: #333;
      /*position: fixed;
      bottom: 0;*/
      width: 100%;
      padding: 10px;
      text-align: center;
    }
    
    .task {
      text-align: left;
      padding: 1% 1% 1% 1%;
      background-color: #acaaaa;
      width: 100%;
    }
    
    .task:nth-child(odd) {
      background-color: #ccc7c7;
    }
    
    .close {
      text-align: center;
      width: 2%;
      color: #FF0000;
      float: right;
      margin-right: 1%;
    }
    
    .close:hover {
      background-color: #FF0000;
      color: #FFFFFF;
      cursor: pointer;
    }
    <!doctype html>
    <html>
    
    <head>
      <title>What's up?</title>
      <meta charset="utf-8">
      <!-- Compiled and minified CSS -->
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/css/materialize.min.css">
    
      <!-- Compiled and minified JavaScript -->
      <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/js/materialize.min.js"></script>
    </head>
    
    <body>
      <header>
        <h5>Your tasks:</h5>
      </header>
      <div id="container"></div>
      <footer>
        <input type="text" placeholder="Enter task here..." id="input" autofocus>
        <a class="waves waves-light btn" onclick="checkButton()">Add</a>
      </footer>
    </body>
    
    </html>
        2
  •  1
  •   Carl Binalla    8 年前

    解决这个问题的一个方法是你需要得到两者的高度 <header> <footer> 运行时 (因为高度是动态的) ,如果您希望尽可能响应,也需要这样做。

    在获得高度后,添加 padding-top: height of header padding-bottom:height of footer 对身体。哦,还有把 padding-top #container

    我使用了JQuery,如果需要的话,可以将其转换为JavaScript。

    它看起来仍然是重叠的,但是到达页脚后可以立即滚动

    /*
      You can convert this to javascript if you want
    */
    
    $(function() {
      var headerHeight = $('header').outerHeight();
      var footerHeight = $('footer').outerHeight();
      $('body').css('padding-top', headerHeight);
      $('body').css('padding-bottom', footerHeight);
    });
    
    
    
    document.addEventListener('DOMContentLoaded', function() {
      window.input = document.getElementById('input');
      window.container = document.getElementById('container');
    
      window.input.addEventListener('keypress', function(event) {
        if (event.keyCode == '13' && window.input.value != '') {
          addTask();
        }
      });
    
      /**for (let i = 0; i < localStorage.length; i++) {
        addTask(i, 'auto');
      }*/
    });
    
    const checkButton = () => {
      if (window.input.value != '') {
        addTask();
      }
    };
    
    const addTask = (index, type) => {
      let task = document.createElement('div');
    
      if (!type) {
        task.textContent = window.input.value;
        //localStorage.setItem(window.input.value, window.input.value);
      } else {
        //task.textContent = localStorage.getItem(localStorage.key(index));
      }
      task.classList.add('task');
    
      let closeButton = document.createElement('div');
      closeButton.textContent = 'X';
      closeButton.classList.add('close');
      closeButton.setAttribute('onclick', 'removeTask(this)');
      task.appendChild(closeButton);
    
      window.container.appendChild(task);
    
      window.input.value = '';
    };
    
    const removeTask = (task) => {
      window.container.removeChild(task.parentNode);
      //localStorage.removeItem(task.parentNode.textContent.substring(0, task.parentNode.textContent.length - 1));
    };
    #input {
      width: 80%;
      color: #E6E6FA;
    }
    
    body {
      background-color: #E9FEF2;
    }
    
    #container {
      width: 100%;
    }
    
    h5 {
      margin: 1% 1%;
    }
    
    header {
      position: fixed;
      top: 0;
      width: 100%;
      background-color: #333;
      color: #E6E6FA;
    }
    
    footer {
      overflow: hidden;
      background-color: #333;
      position: fixed;
      bottom: 0;
      width: 100%;
      padding: 10px;
      text-align: center;
    }
    
    .task {
      text-align: left;
      padding: 1% 1% 1% 1%;
      background-color: #acaaaa;
      width: 100%;
    }
    
    .task:nth-child(odd) {
      background-color: #ccc7c7;
    }
    
    .close {
      text-align: center;
      width: 2%;
      color: #FF0000;
      float: right;
      margin-right: 1%;
    }
    
    .close:hover {
      background-color: #FF0000;
      color: #FFFFFF;
      cursor: pointer;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/css/materialize.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/js/materialize.min.js"></script>
    
    <body>
      <header>
        <h5>Your tasks:</h5>
      </header>
      <div id="container"></div>
      <footer>
        <input type="text" placeholder="Enter task here..." id="input" autofocus>
        <a class="waves waves-light btn" onclick="checkButton()">Add</a>
      </footer>
    </body>
        3
  •  1
  •   Jithin Raj P R    8 年前

    这对你有用:

    我刚加了一个 px 填充到 top bottom 考虑到你的页眉和页脚。

    document.addEventListener('DOMContentLoaded', function() {
      window.input = document.getElementById('input');
      window.container = document.getElementById('container');
    
      window.input.addEventListener('keypress', function(event) {
        if (event.keyCode == '13' && window.input.value != '') {
          addTask();
        }
      });
    
      /**for (let i = 0; i < localStorage.length; i++) {
        addTask(i, 'auto');
      }*/
    });
    
    const checkButton = () => {
      if (window.input.value != '') {
        addTask();
      }
    };
    
    const addTask = (index, type) => {
      let task = document.createElement('div');
    
      if (!type) {
        task.textContent = window.input.value;
        //localStorage.setItem(window.input.value, window.input.value);
      } else {
        //task.textContent = localStorage.getItem(localStorage.key(index));
      }
      task.classList.add('task');
    
      let closeButton = document.createElement('div');
      closeButton.textContent = 'X';
      closeButton.classList.add('close');
      closeButton.setAttribute('onclick', 'removeTask(this)');
      task.appendChild(closeButton);
    
      window.container.appendChild(task);
    
      window.input.value = '';
    };
    
    const removeTask = (task) => {
      window.container.removeChild(task.parentNode);
      //localStorage.removeItem(task.parentNode.textContent.substring(0, task.parentNode.textContent.length - 1));
    };
    #input {
      width: 80%;
      color: #E6E6FA;
    }
    
    body {
      background-color: #E9FEF2;
    }
    
    #container {
      padding: 49px 0 71px;
      /** My try with the padding */
      width: 100%;
    }
    
    h5 {
      margin: 1% 1%;
    }
    
    header {
      position: fixed;
      top: 0;
      width: 100%;
      background-color: #333;
      color: #E6E6FA;
    }
    
    footer {
      overflow: hidden;
      background-color: #333;
      position: fixed;
      bottom: 0;
      width: 100%;
      padding: 10px;
      text-align: center;
    }
    
    .task {
      text-align: left;
      padding: 1% 1% 1% 1%;
      background-color: #acaaaa;
      width: 100%;
    }
    
    .task:nth-child(odd) {
      background-color: #ccc7c7;
    }
    
    .close {
      text-align: center;
      width: 2%;
      color: #FF0000;
      float: right;
      margin-right: 1%;
    }
    
    .close:hover {
      background-color: #FF0000;
      color: #FFFFFF;
      cursor: pointer;
    }
    <!doctype html>
    <html>
    
    <head>
      <title>What's up?</title>
      <meta charset="utf-8">
      <!-- Compiled and minified CSS -->
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/css/materialize.min.css">
    
      <!-- Compiled and minified JavaScript -->
      <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0-rc.2/js/materialize.min.js"></script>
    </head>
    
    <body>
      <header>
        <h5>Your tasks:</h5>
      </header>
      <div id="container"></div>
      <footer>
        <input type="text" placeholder="Enter task here..." id="input" autofocus>
        <a class="waves waves-light btn" onclick="checkButton()">Add</a>
      </footer>
    </body>
    
    </html>

    希望这对你有帮助。