Как я могу централизовать 5 разделов, не используя margin-left?

Я пытаюсь получить 5 divs, расположенных внутри div, например:

enter image description here

Есть ли способ сделать это без использования margin-left?

Я имею в виду.. В случае, если я хочу удалить один из этих средних div, и они все еще выровнены? Например. Если я удалю div4, остальные будут центрироваться автоматически. Вот так:

enter image description here

Я нашел решение вроде этого:

#parent {
  width: 615px;
  border: solid 1px #aaa;
  text-align: center;
  font-size: 20px;
  letter-spacing: 35px;
  white-space: nowrap;
  line-height: 12px;
  overflow: hidden;
}
.child {
  width: 100px;
  weight: 100px;
  border: solid 1px #ccc;
  display: inline-block;
  vertical-align: middle;
}

Но проблема в том, что: Первый div и последний должны быть похожими на float left и float right... И это решение сосредотачивает каждую вещь, что-то вроде этого:

enter image description here

Ответы

Ответ 1

flexbox может быть ответом, который вы ищете.

#container {
  display: flex;
  justify-content: space-between;
  border: 1px solid black;
  background: #ccc;
}
#container>div {
  width: 100px;
  border: 1px solid black;
  background: #fff;
  height: 100px;
}
<div id="container">
  <div>box 1</div>
  <div>box 2</div>
  <div>box 3</div>
  <div>box 4</div>
  <div>box 5</div>
</div>

Ответ 2

может быть так

text-align: justify - эта функция работает как с текстом, так и с точками строки (display: inline-block), и это неотъемлемые слова подряд, это поведение вполне естественно.

Кстати, стоит учесть, что унаследованное свойство text-align: justify, поэтому text-align: left у следующих потомков - необходимая мера. Таким образом, мы вернемся как выравнивание содержимого наших блоков в первом состоянии.

Этот алгоритм не применяется к последней строке и работает со всеми строками, кроме нее. Поэтому, используя :after, я добавил к концу другого элемента, пустышку, и растянул его до 100% от ширины, тем самым вынудив его растянуть на последней строке в списке.

*{
    padding: 0;
    margin: 0;
    box-sizing: border-box;
}

div {    
    text-align: justify; 
    font-size: 0;
}
div:after {
    width: 100%;
    height: 0;
    visibility: hidden;
    overflow: hidden;
    content:'';
    display: inline-block;
}
div > div {
    background: #E76D13;
    width: 100px;
    height: 100px;
    display: inline-block;
    text-align: left;
    border: 1px solid #000;    
    line-height: normal;
    font-size: 14px;
    vertical-align: top;    
}
<div>
    <div>1</div>
   <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
</div>

Ответ 3

Если вам нужно только поддерживать современные браузеры, вы можете использовать гибкую компоновку ящиков.

    .parent{
        display:flex;
        justify-content:space-between;
        width: 815px;
        border: solid 1px #aaa;
    }

    .child {
        background-color:yellow;
        width: 100px;
        height: 100px;
        border: solid 1px #ccc;
    }
    <div class="parent">
        <div class="child"></div>
        <div class="child"></div>
        <div class="child"></div>
        <div class="child"></div>
        <div class="child"></div>  
    </div>

Ответ 4

Я знаю, что уже есть ответ, но для будущих пользователей я хочу убедиться, что они видят правильный способ использования flexbox. Префиксы являются обязательными, чтобы использовать их правильно и ответственно. Без них вы не будете поддерживать IE10, ничего до android 4.1 и ничего до iOS7. Поэтому будьте осторожны, потому что flexbox не ухудшается хорошо.

Вот отличная статья о flexbox: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

Вот отличный сайт для проверки совместимости браузера: http://caniuse.com/#feat=flexbox

#container {
  display: flex;
  justify-content: space-between;
  border: 1px solid black;
  background: #ccc;
}
#container>div {
  flex: 0 0 100px;
  border: 1px solid black;
  background: #fff;
  height: 100px;
}

/* The order of these prefixed properties is very important!!!  */

#container {
  display: -webkit-box;                       /* OLD - iOS 6-, Safari 3.1-6 */
  display: -moz-box;                          /* OLD - Firefox 19- (buggy but mostly works) */
  display: -ms-flexbox;                       /* TWEENER - IE 10 */
  display: -webkit-flex;                      /* NEW - Chrome */
  display: flex;                              /* NEW, Spec - Opera 12.1, Firefox 20+ */
  -webkit-justify-content:space-between;      /*Chrome */
  justify-content: space-between;             /* NEW, Spec - Opera 12.1, Firefox 20+ */
  border: 1px solid black;
  background: #ccc;
}
#container>div {
    -webkit-box-flex: 0 0 100px;                /* OLD - iOS 6-, Safari 3.1-6 */
  -moz-box-flex: 0 0 100px;                     /* OLD - Firefox 19- */
  width: 20%;                                   /* For old syntax, otherwise collapses. */
  -webkit-flex: 0 0 100px;                      /* Chrome */
  -ms-flex: 0 0 100px;                          /* IE 10 */
  flex: 0 0 100px;                              /* NEW, Spec - Opera 12.1, Firefox 20+ */
  border: 1px solid black;
  background: #fff;
  height: 100px;
}
<div id="container">
  <div>box 1</div>
  <div>box 2</div>
  <div>box 3</div>
  <div>box 4</div>
  <div>box 5</div>
</div>

Ответ 5

Вы можете использовать марж слева, но первый дочерний элемент имеет нулевой марж с помощью селекторов css.

    div *{
        display:inline-block;
        /*
        * set your child elements to a set width. If you want them to change
        * size you can use % for the width and adjust this using @media
        */
        margin-left:20px;//use % if you want it to scale.
    }

    div:first-child { 
        margin-left:0px;
    }

<div>
   <div>1</div>
   <div>2</div>
   <div>3</div>
   <div>4</div>
<div>

все элементы будут иметь маржу слева от 20px, кроме первой. Это даст вам линию смыва в левом div.

Если вы не хотите, чтобы элементы переполнялись до следующей строки, вы можете установить, чтобы родительский элемент имел overflow-x none. И выберите разные ширины для дочерних элементов. Bootstrap использует поля и встроенный блок, когда он размещает несколько элементов бок о бок. Если вы посмотрите на темы начальной загрузки, когда они помещаются на телефон, элементы переключаются на стек.

см. следующую ссылку для получения дополнительных сведений о css-селекторах. http://www.w3schools.com/cssref/sel_firstchild.asp