Как в CSS получить левый столбец с фиксированной шириной и правую таблицу, которая использует остальную ширину?

Итак, я попытался работать с евангелием чистого CSS, никогда не использовать таблицы для макета, у меня действительно есть. Но после невероятного количества боли и мучений я почти готов сдаться. Я готов приложить некоторые усилия, чтобы добиться чего-то в CSS, не поймите меня неправильно. Но когда кажется, что одними из самых невероятно простых вещей, которые можно сделать с помощью таблиц макета, являются совершенно невозможно в CSS, меня не волнует, действительно ли концептуальная чистота начинает терпеть поражение.

Теперь, наверное, кажется, что я зол, и я злюсь; Я злюсь на потраченное впустую время, я злюсь на людей, которые выходят из фонов QuarkXpress и передают мне бесполезные дизайны фиксированной ширины, я злюсь на невыполненное обещание CSS. Но я не пытаюсь начать спор; Я действительно хочу знать ответ на один простой вопрос, который определит, попробую ли я еще раз воспользоваться чистым CSS, или буду использовать его и использовать макетные таблицы всякий раз, когда мне захочется. Потому что мне не хотелось бы возвращаться к макетным таблицам, думая, что это невозможно, если на самом деле это не так.

Вопрос в следующем: есть ли в любом случае с использованием макета чистого CSS, чтобы слева был столбец с фиксированной шириной, а справа от него помещалась таблица данных, а таблица данных аккуратно занимала остаток чего-либо место доступно? То есть такой же макет, который легко достигается при наличии таблицы макета с двумя ячейками с шириной 100% и фиксированной шириной в левой ячейке?

giveupandusetables.com;)
alxp 22.01.2009 07:26

Подобно моему вопросу: stackoverflow.com/questions/551180/…

finnw 15.04.2009 02:41
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
38
2
40 788
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

это то, что вы ищете?

body {
  margin: 0;
  padding: 0;
  border: 0;
  overflow: hidden;
  height: 100%;
  max-height: 100%;
}
#framecontent {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 200px;
  /*Width of frame div*/
  height: 100%;
  overflow: hidden;
  /*Disable scrollbars. Set to "scroll" to enable*/
  background: navy;
  color: white;
}
#maincontent {
  position: fixed;
  top: 0;
  left: 200px;
  /*Set left value to WidthOfFrameDiv*/
  right: 0;
  bottom: 0;
  overflow: auto;
  background: #fff;
}
.innertube {
  margin: 15px;
  /*Margins for inner DIV inside each DIV (to provide padding)*/
}
* html body {
  /*IE6 hack*/
  padding: 0 0 0 200px;
  /*Set value to (0 0 0 WidthOfFrameDiv)*/
}
* html #maincontent {
  /*IE6 hack*/
  height: 100%;
  width: 100%;
}
<div id = "framecontent">
    <div class = "innertube">

      <h1>CSS Left Frame Layout</h1>
      <h3>Sample text here</h3>

    </div>
  </div>


  <div id = "maincontent">
    <div class = "innertube">

      <h1>Dynamic Drive CSS Library</h1>
      <p style = "text-align: center">Credits: <a href = "http://www.dynamicdrive.com/style/">Dynamic Drive CSS Library</a>
      </p>

    </div>
  </div>

Я чувствую твою боль, но стараюсь не смотреть на нее как на потерянное время. Я уверен, что вы гораздо лучше разбираетесь в CSS, чем раньше. Продолжайте работать с ним, и вы начнете видеть преимущества. Я лично считаю, что CSS - одна из тех вещей, в которых требуется много практики, чтобы овладеть им. Я использую макеты на основе CSS в течение 5 лет и до сих пор каждый день изучаю интересные трюки.

Да, это. Спасибо. :) Не поймите меня неправильно, я не противник CSS, и я был намного раньше, чем многие люди, с которыми я работаю. Я вижу преимущества. Просто нужно привыкнуть к тому, что время от времени приходится делать радикально неинтуитивные вещи, чтобы получить результаты, как в вашей ссылке. :)

chaos 22.01.2009 18:27

И даже в этом есть проблемы. Семантические, если быть точным; он требует, чтобы столбец содержимого располагался перед левым столбцом в разметке, поэтому он не работает для программ чтения с экрана.

chaos 22.01.2009 18:33

Но это является недостаток в CSS. Тот факт, что можно научиться овладевать им, имея достаточно времени, этого не меняет. Сравните с изучением GridBagLayout на Java (вероятно, менее чем за полдня)

finnw 15.04.2009 02:44

Пожалуйста, включите соответствующую информацию в сам ответ. Внешний ресурс может измениться или перейти в автономный режим.

Zeta 25.02.2015 08:46

Это очень вежливый способ сказать CSS ОТСТОЙ!

Rodrigo 05.06.2017 05:52

Что-то вроде этого:

<div style = "position: relative; width: 100%">
    <div style = "position: absolute; left: 0; top: 0; width: 200px">
        left column
    </div>
    <div style = "position: absolute; left: 200px; top: 0">
         other stuff
    </div>
</div>

Конечно, вам, вероятно, следует поместить стили в отдельную таблицу стилей, а не встроенную. И один столбец фиксированной ширины слева довольно прост, но иногда я вижу другие макеты, которые можно легко сделать с помощью таблиц, но, насколько я знаю, с CSS чертовски сложно.

Неа. Правый столбец получает минимально возможную ширину, которую наследует таблица данных. Установка ширины правого столбца на 100% дает ему всю ширину области отображения. Не хорошо.

chaos 22.01.2009 18:29

Также - если что-то следует за этим на странице, тогда высоту внешнего div необходимо будет зафиксировать и иметь переполнение: scroll / auto / hidden

Noel Walters 30.09.2010 14:25

Почти наверняка есть ответ, который включает применение display: table и display: table-cell к рассматриваемым элементам. То есть ... нет.

Мне нравится, как CSS по-прежнему занимает целую страницу кода, чтобы дублировать пару строк использования таблицы.

После борьбы с войной CSS я пришел к выводу, что «чистый» в глазах смотрящего, и перешел к подходу «давайте просто используем то, что работает».

Используйте CSS для того, для чего он хорош: чтобы все выглядело красиво. По возможности используйте DIV и SPAN. Но если вы обнаружите, что тратите день, пытаясь привести все в соответствие с различными вариантами браузеров, тогда вставьте стол и двигайтесь дальше. Не волнуйтесь, вопреки тому, что думает большинство людей, на самом деле щенок не умрет.

Фактически, если бы я потратил день, пытаясь заставить работать CSS, я бы, вероятно, пошел и убил щенка, а затем вернулся бы к столам. Поэтому я бы посоветовал придерживаться того, что вам удобно, и таким образом спасти щенка.

paxdiablo 22.01.2009 09:00

Во-первых, я бы порекомендовал книги Эрика Мейера по CSS, а также ссылку по CSS в в сети: Список отдельно. Я широко использую CSS в своей работе и думаю, что неплохо с ним справился.

При всем при этом: делайте то, что работает. Я пережил именно ту боль, которую вы только что испытали. В конце концов, я решил, что не стоит идти на компромисс со своим дизайном только для того, чтобы сказать, что я не использовал таблицы.

Помните: вам не платят за CSS - вам платят за написание работающего программного обеспечения.

@Mark Brittingham: по поводу "A List Apart". Вы имеете в виду alistapart.com/topics/design/typography или alistapart.com/topics/code/css? Вы можете порекомендовать что-то конкретное?

Peter Mortensen 05.01.2010 01:44

Питер - статьи на A List Apart часто довольно читабельны, поэтому я буду просматривать их в поисках драгоценных камней, где я редко делаю это на других сайтах. Но если вы ищете что-то конкретное, у них есть такая возможность для поиска на сайте. Рекомендации? Что ж, "Fluid Grids" Итана Маркотта была хорошей (и сложной) статьей для гиков CSS (alistapart.com/articles/fluidgrids). Если вы много работаете с веб-дизайном, вы станете гораздо лучшим дизайнером, если прочитаете «Детали, которые имеют значение» (alistapart.com/articles/the-details-that-matter) Кевина Поттса. Как это начать?

Mark Brittingham 05.01.2010 04:26

Я думаю, это то, что вы ищете:

<table style='width: 100%;'>
  <tr>
    <td style='width: 200px;'></td>
    <td></td>
  </tr>
</table>

Отблагодаришь позже. = P

(Я, очевидно, шучу ... вроде ...)

+1 за то, что ты умный * ss - ой, я имею в виду осознание того, что сначала нужно делать то, что работает, а потом думать о чистоте кода. Нет смысла делать свой код CSS-красивым, если вы пропустили сроки сдачи.

paxdiablo 22.01.2009 08:58

Привет с 2015 года! -1 Недостаточно CSS;) Может быть, вы могли бы обновить свой ответ и воспользоваться его высокой позицией?

misterManSam 11.06.2015 09:55
Ответ принят как подходящий
<div style = "width: 200px;background-color: #FFFFCC; float: left;">
Left column
</div>

<div style = "margin-left: 200px; background-color: #CCFFFF">
Right column
</div>

Это должно сработать (очевидно, реализация будет зависеть от того, где она находится на странице, но я думаю, что это именно та концепция, которую вы ищете).

Ах, красиво. Между ссылкой Скотта Мака и этим каждый случай, кажется, покрыт.

chaos 22.01.2009 19:01

Очень интересно - я бы предположил, что левый край второго блока div не понадобится, потому что это следующий блок по порядку. Может быть, это то, чего мне тоже не хватало ... Давай попробуем!

Mark Brittingham 22.01.2009 19:49

Да, левое поле для меня - это недостающее звено. В основном мне нужен был способ сказать «ширина: 100% -200 пикселей». Очевидно, что вы так говорите margin-left. Вроде, как бы, что-то вроде.

chaos 22.01.2009 20:21

Просто помните, что когда страница становится сложной, управлять плавающими объектами может быть сложно. Между прочим, нет ничего плохого в использовании таблиц для макета страницы.

CLaRGe 15.04.2009 02:32

Вместо margin-left: 200px в правом столбце вы можете применить overflow: hidden, и он создаст новый контекст рендеринга, что означает, что он не будет обтекать левый столбец. Преимущество заключается в том, что ширина левого столбца может изменяться без необходимости регулировки поля для правого столбца, чтобы оно соответствовало ему.

Andrew Vit 30.09.2010 00:32

Вы можете попробовать это:

http://www.alistapart.com/stories/practicalcss/

http://www.w3.org/2002/03/csslayout-howto

Вот почему:

http://en.wikipedia.org/wiki/Tableless_web_design

http://davespicks.com/essays/notables.html

Дополнительные инструкции:

    div.row {
      clear: both;
      padding-top: 10px;
    }

    div.row span.label {
      float: left;
      width: 100px;
      text-align: right;
    }

    div.row span.formw {
      float: right;
      width: 335px;
      text-align: left;
    }


    <div style = "width: 350px; background-color: #cc9;
      border: 1px dotted #333; padding: 5px;
      margin: 0px auto";>
      <form>
        <div class = "row">
          <span class = "label">Name:</span><span
            class = "formw"><input type = "text" size = "25" /></span>
        </div>
        <div class = "row">
          <span class = "label">Age:</span><span
            class = "formw"><input type = "text" size = "25" /></span>
        </div>
        <div class = "row">
          <span class = "label">Shoe size:</span><span
            class = "formw"><input type = "text" size = "25" /></span>
        </div>
        <div class = "row">
          <span class = "label">Comments:</span><span
              class = "formw">
            <textarea cols = "25" rows = "8">
            Go ahead - write something...
            </textarea>
          </span>
        </div>
        <div class = "spacer">
          &nbsp;
        </div>
      </form>
    </div>

Чтобы поддерживать этот вопрос в актуальном состоянии, вот 5 способов добиться того же, используя как CSS2, так и CSS3.


Пример 1: Float & Margin

Так делалось годами: просто и эффективно.

#example1 .fixedColumn {
    width: 180px;
    float: left;
    background-color: #FCC;
    padding: 10px;
}
#example1 .flexibleColumn {
    margin-left: 200px;
    background-color: #CFF;
    padding: 10px;
}
<div id = "example1">

    <div class = "fixedColumn">
        Fixed Column
    </div>
    <div class = "flexibleColumn">
        Flexible Column
    </div>
    
</div>

Пример 2: CSS calc ();

calc() работает с IE9 и выше, хотя поддержка в некоторых версиях браузера Android немного нестабильна: http://caniuse.com/#feat=calc

#example2.calc {
    overflow: hidden;
}
#example2.calc .fixedColumn {
    width: 180px;
    float: left;   
    background-color: #FCC;
    padding: 10px; 
}
#example2.calc .flexibleColumn {
    width: calc(100% - 220px); /*200px for the fixed column and 20 for the left and right padding */
    float: left;  
    background-color: #CFF;
    padding: 10px;
}
<div id = "example2" class = "calc">
    
    <div class = "fixedColumn">
        Fixed Column
    </div>
    <div class = "flexibleColumn">
        Flexible Column
    </div>
    
</div>

Пример 3: отображение CSS в виде таблицы

#example3.table {
    display: table;   
    width: 100%;
}
#example3.table .fixedColumn {
    width: 180px;
    display: table-cell;   
    background-color: #FCC;
    padding: 10px;   
}
#example3.table .flexibleColumn {    
    display: table-cell; 
    background-color: #CFF;
    padding: 10px;  
}
<div id = "example3" class = "table">
    
    <div class = "fixedColumn">
        Fixed Column
    </div>
    <div class = "flexibleColumn">
        Flexible Column
    </div>
    
</div>

Пример 4: CSS3 Flexbox

У Flexbox на удивление хорошая поддержка в браузерах: http://caniuse.com/#search=flex

#example4.flex {
    display: flex;
}
#example4.flex .fixedColumn {
    width: 180px;
    background-color: #FCC;
    padding: 10px;  
}
#example4.flex .flexibleColumn {
    flex: 1 100%;
    flex-basis: auto;
    background-color: #CFF;
    padding: 10px; 
}
<div id = "example4" class = "flex">
    
    <div class = "fixedColumn">
        Fixed Column
    </div>
    <div class = "flexibleColumn">
        Flexible Column
    </div>
    
</div>

Пример 5: CSS3 Grid

На данный момент единственными браузерами, поддерживающими реализацию CSS3 grid, являются IE10, IE11 и Edge (отсюда и префиксы браузера -ms-), поэтому убедитесь, что вы просматриваете это в одном из них, иначе он не будет работать правильно.

РЕДАКТИРОВАТЬ Я включил сюда экспериментальную спецификацию Chrome, которую вы можете просмотреть, включив экспериментальные функции в Chrome, которые подробно описаны в здесь.

http://caniuse.com/#search=grid

#example5.grid {
    display: -ms-grid;
    display: grid;
    -ms-grid-columns: 200px 1fr;
    -ms-grid-rows: auto;
    grid-template-columns: 200px 1fr;
    grid-template-rows: auto;
}
#example5.grid .fixedColumn {
    -ms-grid-column: 1;
    background-color: #FCC;
    padding: 10px;
}
#example5.grid .flexibleColumn {
    -ms-grid-column: 2;
    background-color: #CFF;
    padding: 10px;
}
<div id = "example5" class = "grid">
    
    <div class = "fixedColumn">
        Fixed Column
    </div>
    <div class = "flexibleColumn">
        Flexible Column
    </div>
    
</div>

Вот код, в котором представлены все 5 техник:

2 колонны (1 фиксированная, 1 гибкая) 5 разных способов!

Другие вопросы по теме