2016-05-06 4 views
2

Я опытный разработчик .net, но у всех нас есть области, где мы можем извлечь выгоду из улучшений. Я чувствую, что мне не хватает навыков HTML/CSS, и я пытаюсь научить себя в этой области.Как заполнить оставшуюся высоту и ширину?

Я пытаюсь создать макет HTML для приложения, которое контролирует потребление полосы пропускания в локальной сети. Я предполагаю, макет как состоящие из 4-х элементов:

+--------------------------+ 
+ Controls     + 
+--------+-----------------+ 
+ Legend + Graph   + 
+  +     + 
+  +     + 
+  +     + 
+  +     + 
+--------+-----------------+ 
+ Log      + 
+--------------------------+ 
  • управление - это узкая область, которая позволит ясно, сделать паузу и иным образом контролировать график. Это также позволит отображать и скрывать область журнала. Это означает, что в макете необходимо скрыть область журнала.
  • Legend - есть table, в котором будут перечислены все серии на графике. Он будет показывать цвет серии, а также некоторые числовые данные, связанные с серией. Если в легенде есть больше строк, которые соответствуют экрану, должна быть возможность вертикальной области легенды прокрутки. Горизонтальная прокрутка никогда не требуется для области, где предполагается, что она всегда достаточно узкая. height Легенды (и графика) должны занимать все оставшееся пространство, которое не используется в области управления и области журнала. Обозначение width легенды будет равно натуральному tablewidth.
  • График - там будет график, нарисованный над HTML canvas. Это должно занимать все свободное пространство как по горизонтали, так и по вертикали.
  • Журнал - здесь будут отображаться две или три строки журнала. Если отображается более трех строк, в этой области должна быть вертикальная полоса прокрутки. Эта область должна быть способна скрываться. height этой области можно зафиксировать. (в районе 100px - 200px).

Макет должен адаптироваться к изменению размера окна и продолжать искать спуск, когда окна становятся маленькими (конечно, конечно). Если окно слишком маленькое, оно не должно иметь внешних горизонтальных и вертикальных полос прокрутки.

К сожалению, я не могу понять это в нескольких местах.

Это мой код:

<html> 
    <head> 
    <style> 
     * {margin:0;padding:0;height:100%;} 
     html, button, input, select, textarea { 
      font-family: sans-serif; 
      font-weight: 100; 
      letter-spacing: 0.01em; 
     } 
     .container { 
     min-height:100%; 
     position:relative; 
     } 
     .control { 
      background:green; 
      width:100%; 
      height:auto; 
      margin-top: 0; 
     } 
     .content { 
     width:100%; 
     margin:0; 
     margin-top:0; 
     margin-bottom:0; 
     } 
     .legend { 
     position:relative; 
     background:blue; 
     float:left 
     } 
     .graph { 
     background:red; 

     } 
     .log { 
     background:yellow; 
     width:100%; 
     height:auto; 
     position:absolute; 
     margin-top: 0; 
     margin-bottom: 0; 
     bottom:0; 
     left:0; 
     } 
     .table { 
      border-collapse: collapse; 
      border-spacing: 0; 
      empty-cells: show; 
      border: 1px solid #cbcbcb; 
     } 
     .table td, 
     .table th { 
      border-left: 1px solid #cbcbcb; 
      border-width: 0 0 0 1px; 
      font-size: inherit; 
      margin: 0; 
      overflow: visible; 
      padding: 0.5em 1em; 
     } 
     .table thead { 
      background-color: #e0e0e0; 
      color: #000; 
      text-align: left; 
      vertical-align: bottom; 
     } 
     .table td { 
      background-color: transparent; 
     } 
     .table-odd td { 
      background-color: #f2f2f2; 
     } 
    </style> 
    </head> 
    <body> 
    <div class="container"> 
     <div class="control">header1<br/>header2</div> 
     <div class="content"> 
     <div class="legend"> 
      <table class="table"> 
       <thead> 
        <tr> 
         <th>#</th> 
         <th>Make</th> 
         <th>Model</th> 
         <th>Year</th> 
        </tr> 
       </thead> 
       <tbody> 
        <tr class="table-odd"> 
         <td style="background-color: #FFB300">1</td> 
         <td>Honda</td> 
         <td>Accord</td> 
         <td>2009</td> 
        </tr> 

        <tr> 
         <td style="background-color: #803E75">2</td> 
         <td>Toyota</td> 
         <td>Camry</td> 
         <td>2012</td> 
        </tr> 

        <tr class="table-odd"> 
         <td style="background-color: #FF6800">3</td> 
         <td>Hyundai</td> 
         <td>Elantra</td> 
         <td>2010</td> 
        </tr> 

        <tr> 
         <td style="background-color: #A6BDD7">4</td> 
         <td>Ford</td> 
         <td>Focus</td> 
         <td>2008</td> 
        </tr> 

        <tr class="table-odd"> 
         <td style="background-color: #C10020">5</td> 
         <td>Nissan</td> 
         <td>Sentra</td> 
         <td>2011</td> 
        </tr> 

        <tr> 
         <td style="background-color: #CEA262">6</td> 
         <td>BMW</td> 
         <td>M3</td> 
         <td>2009</td> 
        </tr> 

        <tr class="table-odd"> 
         <td style="background-color: #817066">7</td> 
         <td>Honda</td> 
         <td>Civic</td> 
         <td>2010</td> 
        </tr> 

        <tr> 
         <td style="background-color: #007D34">8</td> 
         <td>Kia</td> 
         <td>Soul</td> 
         <td>2010</td> 
        </tr> 
       </tbody> 
      </table> 
     </div> 
     <div class="graph"><canvas></canvas></div> 
     </div> 
     <div class="log">log1<br/>log2</div> 
    </div> 
    <script> 
     function resize() { 
     var canvas = document.querySelector('canvas'); 
     canvas.style.width = '100%'; 
     canvas.style.height = '100%'; 
     canvas.width = canvas.offsetWidth; 
     canvas.height = canvas.offsetHeight; 
     ctx = canvas.getContext('2d'); 
     ctx.strokeStyle='yellow'; 
     ctx.beginPath(); 
     ctx.moveTo(0,0); 
     ctx.lineTo(canvas.width,canvas.height); 
     ctx.stroke(); 
     } 
     resize(); 
     window.addEventListener('resize', resize, false); 
    </script> 
    </body> 
</html> 

Это соответствующие JSFiddle

Конкретные проблемы, с которыми я столкнулся:

  • Почему canvas визуализируется вне вмещающего div? Это очень удивительно для меня, и я не могу понять, почему.
  • Как сделать вывод table естественным путем? В частности:
    • Почему первая линия такая высокая?
    • Как сделать table не взять все height? Это подводное погружение, которое имеет height:100%, а не стол, так почему он так высок?
    • Как сделать его прокруткой, если он не подходит в height?
  • Область «Легенда/График», по-видимому, простирается под зоной журнала. Зачем? Как я могу это предотвратить?
  • Наконец, как я могу сделать область журнала фиксированной высоты и прокрутки?

Мои извинения, я знаю, что этот вопрос - это высокий порядок, я с благодарностью принимаю любую помощь и/или указатели. Я понимаю, что мне не хватает базового понимания, но с этим я пытаюсь работать. Сегодня я провел большую часть вечера, исследуя эту тему и искал источник, который позволил мне собрать хотя бы этот нерабочий пример. Мне нравится JavaScript, это HTML/CSS, в котором мне в основном нужна помощь. Я изучил документацию о свойствах различных объектов DOM, но сложно определить , что свойства для использования и как.

+0

вы смотрели в Flexbox для макетов страниц? –

+0

Есть ли причина, по которой вы не используете flexbox? Похоже, вы сильно переделываете свой макет. Я бы посоветовал вообще не использовать HTML-таблицы, они непредсказуемы, и довольно сложно изменить поведение по умолчанию. Когда вы сомневаетесь, придерживайтесь divs. – Senthe

+0

@ Senthe Согласно [this] (http://caniuse.com/#feat=flexbox), у flexbox много ошибок в IE11 и вообще не работает на предыдущих IE. Хотя я не собираюсь поддерживать все браузеры с самого начала, исключая IE, совершенно определенно то, чего я бы хотел избежать. Спасибо за отзыв о flexbox, хотя, никогда не слышал об этом раньше, поэтому я кое-что узнал - я прочитаю об этом. –

ответ

1

Вы усложнять ваш CSS много для того, что вы хотите,

вы можете использовать CSS Flexbox вместе с CSS calc() для этого

body { 
 
    margin: 0 
 
} 
 
section { 
 
    background: red; 
 
    height: 50px; 
 
} 
 
article { 
 
    display: flex; 
 
    height: calc(100vh - 100px) 
 
} 
 
aside, 
 
div { 
 
    background: lightblue; 
 
} 
 
aside { 
 
    overflow-y: auto; 
 
    max-width: 45% 
 
} 
 
aside ~ div { 
 
    flex: 1 
 
} 
 
canvas { 
 
    width: 100%; 
 
    height: 100%; 
 
    background: green 
 
} 
 
.table { 
 
    display: table; 
 
    table-layout:fixed; 
 
    width:100% 
 
} 
 
.row { 
 
    display: table-row; 
 
    background-color: #fff; 
 
} 
 
.column { 
 
    display: table-cell; 
 
    vertical-align: top; 
 
    border-left: 1px solid #cbcbcb; 
 
    border-width: 0 0 0 1px; 
 
    font-size: inherit; 
 
    margin: 0; 
 
    padding: 0.5em 1em; 
 
    background-color: inherit; 
 
} 
 
.cell-header { 
 
    font-weight: bold; 
 
} 
 
.row-odd { 
 
    background-color: #f2f2f2; 
 
}
<main> 
 
    <section>Controls</section> 
 
    <article> 
 
    <aside> 
 
     <div class="table"> 
 
     <div class="row row-odd"> 
 
      <div class="column cell-header">#</div> 
 
      <div class="column cell-header">Make</div> 
 
      <div class="column cell-header">Model</div> 
 
      <div class="column cell-header">Year</div> 
 
     </div> 
 
     <div class="row"> 
 
      <div class="column" style="background-color: #FFB300">1</div> 
 
      <div class="column">Honda</div> 
 
      <div class="column">Accord</div> 
 
      <div class="column">2009</div> 
 
     </div> 
 
     <div class="row row-odd"> 
 
      <div class="column" style="background-color: #803E75">2</div> 
 
      <div class="column">Toyota</div> 
 
      <div class="column">Camry</div> 
 
      <div class="column">2012</div> 
 
     </div> 
 
     <div class="row"> 
 
      <div class="column" style="background-color: #FF6800">3</div> 
 
      <div class="column">Hyundai</div> 
 
      <div class="column">Elantra</div> 
 
      <div class="column">2010</div> 
 
     </div> 
 
     <div class="row row-odd"> 
 
      <div class="column" style="background-color: #A6BDD7">4</div> 
 
      <div class="column">Ford</div> 
 
      <div class="column">Focus</div> 
 
      <div class="column">2008</div> 
 
     </div> 
 
     <div class="row"> 
 
      <div class="column" style="background-color: #C10020">5</div> 
 
      <div class="column">Nissan</div> 
 
      <div class="column">Sentra</div> 
 
      <div class="column">2011</div> 
 
     </div> 
 
     <div class="row row-odd"> 
 
      <div class="column" style="background-color: #CEA262">6</div> 
 
      <div class="column">BMW</div> 
 
      <div class="column">M3</div> 
 
      <div class="column">2009</div> 
 
     </div> 
 
     <div class="row"> 
 
      <div class="column" style="background-color: #817066">7</div> 
 
      <div class="column">Honda</div> 
 
      <div class="column">Civic</div> 
 
      <div class="column">2010</div> 
 
     </div> 
 
     <div class="row row-odd"> 
 
      <div class="column" style="background-color: #007D34">8</div> 
 
      <div class="column">Kia</div> 
 
      <div class="column">Soul</div> 
 
      <div class="column">2010</div> 
 
     </div> 
 
     </div> 
 
    </aside> 
 
    <div> 
 
     <canvas width="985" height="223"></canvas> 
 
    </div> 
 
    </article> 
 
    <section>Log</section> 
 
</main>

+0

Большое вам спасибо! Это ближе всего к тому, что мне нужно; также он корректно выглядит на IE/Firefox/Chrome. У меня все еще есть вопрос, как вставить в него холст, но я попрошу об этом отдельно. Позвольте мне переварить ваш ответ немного дольше, мне может потребоваться несколько разъяснений. –

+0

JSFiddle ответа: https: // jsfiddle.net/e65gepzq/ –

+0

@AndrewSavinykh вы приветствуете, На самом деле, я взглянул на свой ответ и заметил, что у меня было правило, которое ничего не делало, поэтому я обновил свой ответ. делая его более чистым. И я добавил 'canvas' – dippas

0

Ну, ваш код беспорядок. Вот моя попытка немного почистить его и добиться того, что вы описали: https://jsfiddle.net/dckex2g7/

Я предположил, что верхняя и нижняя полосы имеют фиксированную высоту, что делает это немного проще. Если это не так, вы должны использовать display: flex; flex-direction: column на элементе кузова и flex-grow: 1 на .content.

Обратите внимание, что я не использовал JS для компоновки. Чтобы сделать его отзывчивым, вы должны использовать такие вещи, как запросы min-width и media. Вы почти никогда не нуждаетесь в JS для компоновки, если только в очень немногих особых случаях, которые каким-то образом не покрываются flexbox.

Существует очень много, чтобы описать это решение, поэтому, если у вас есть какой-либо конкретный вопрос, попросите уйти.

+0

Это намного лучше, чем моя попытка, спасибо !. Тем не менее в Chrome и IE есть нежелательные вертикальные и горизонтальные полосы прокрутки. График div выходит из видимой области справа. Также холст, такой же, как в моем примере, частично расположенный вне оболочки div и масштабирования (который вы бы видели, если бы вы не удаляли javascript, который на нем нарисован) выключен. В firefox стол накрахмален вертикально, поэтому требуется много экранов. –

Смежные вопросы