What is the difference between inline-block and inline-table?

后端 未结 3 1005
深忆病人
深忆病人 2020-12-12 22:13

As far as I can tell, these display selectors seem to be identical.

From the Mozilla CSS documentation:

inline-table: The inline-

相关标签:
3条回答
  • 2020-12-12 22:13

    Here are relevant differences in practice. Run the code snippet to see it at first glance.

    • Vertical alignment of surrounding text:
      inline-table elements align with its top cell or top baseline (if content is only multiple lines of text).
      Text around inline-box aligns with its bottom.
    • height works different, e.g. heightis probably not as you expect on
      <table style=display:inline-block> (see test5 and 6)
    • width and overflow works different,
      e.g. setting width smaller than content, see test7, 8, 9, 10

    <style> table, span { background:orange } th, td { background:beige } </style>
    test1
         <span style=display:inline-block> 
           display <br> inline <br> block
         </span>
    test2
         <span style=display:inline-table>
           display <br> inline <br> table
         </span>
    test3
         <table style=display:inline-block>
           <tr><th> inline
           <tr><td> block
         </table>
    test4
         <table style=display:inline-table>
           <tr><th> inline
           <tr><td> table
         </table>
    test5
         <table style=display:inline-block;height:6em>
           <tr><th> inline
           <tr><td> block
         </table>
    test6
         <table style=display:inline-table;height:6em>
           <tr><th> inline
           <tr><td> table
         </table>-
    <br>
    test7
         <span style=display:inline-block;width:1.4em>
           block
         </span>
    test8
         <span style=display:inline-table;width:1.4em>
           table
         </span>
    test9
         <table style=display:inline-block;width:1.4em>
           <tr><th> inline
           <tr><td> block
         </table>
    test10
         <table style=display:inline-table;width:1.4em>
           <tr><th> inline
           <tr><td> table
         </table>
    test11
         <table style=display:inline-block;width:5em>
           <tr><th> inline
           <tr><td> block
         </table>
    test12
         <table style=display:inline-table;width:5em>
           <tr><th> inline
           <tr><td> table
         </table>
    -

    0 讨论(0)
  • 2020-12-12 22:15

    Both inline-block and inline-table have an inline outer display role. That means

    The element generates an inline-level box.

    The difference is that

    • inline-block has a flow-root inner display model, that is

      The element generates a block container box, and lays out its contents using flow layout. It always establishes a new block formatting context for its contents.

    • inline-table has a table inner display model, that is

      The element generates a principal table wrapper box containing an additionally-generated table box, and establishes a table formatting context.

    However, in most cases, inline-table will behave like inline-block because of anonymous table objects:

    Generate missing child wrappers:

    • If a child C of a 'table' or 'inline-table' box is not a proper table child, then generate an anonymous 'table-row' box around C and all consecutive siblings of C that are not proper table children.
    • If a child C of a 'table-row' box is not a 'table-cell', then generate an anonymous 'table-cell' box around C and all consecutive siblings of C that are not 'table-cell' boxes.

    Therefore, if your inline-table element has non-tabular content, that content will be wrapped in an anonymous table-cell.

    And table-cell has a flow-root inner display model, just like inline-block.

    But if the inline-table has tabular content, it will behave differently than inline-block.

    Some examples:

    • Inside an inline-block, cells with non-tabular separator will generate different table anonymous parents, so they will appear at different lines. Inside an inline-table, it will be the separator who will generate a table-cell parent, so they all will appear at the same row.

      .itable {
        display: inline-table;
      }
      .iblock {
        display: inline-block;
      }
      .cell {
        display: table-cell;
      }
      .wrapper > span {
        border: 1px solid #000;
        padding: 5px;
      }
      <fieldset>
        <legend>inline-table</legend>
        <div class="itable wrapper">
          <span class="cell">table-cell</span>
          <span class="iblock">inline-block</span>
          <span class="cell">table-cell</span>
        </div>
      </fieldset>
      <fieldset>
        <legend>inline-block</legend>
        <div class="iblock wrapper">
          <span class="cell">table-cell</span>
          <span class="iblock">inline-block</span>
          <span class="cell">table-cell</span>
        </div>
      </fieldset>

    • Inner cells won't grow to fill a wide inline-block:

      .itable {
        display: inline-table;
      }
      .iblock {
        display: inline-block;
      }
      .wrapper {
        width: 100%;
      }
      .cell {
        display: table-cell;
        border: 1px solid #000;
      }
      <fieldset>
        <legend>inline-table</legend>
        <div class="itable wrapper">
          <span class="cell">table-cell</span>
        </div>
      </fieldset>
      <fieldset>
        <legend>inline-block</legend>
        <div class="iblock wrapper">
          <span class="cell">table-cell</span>
        </div>
      </fieldset>

    • The border of the inline-block won't collapse with the border of the inner cells:

      .wrapper, .cell {
        border-collapse: collapse;
        border: 5px solid #000;
      }
      .itable {
        display: inline-table;
      }
      .iblock {
        display: inline-block;
      }
      .cell {
        display: table-cell;
      }
      <fieldset>
        <legend>inline-table</legend>
        <div class="itable wrapper">
          <span class="cell">table-cell</span>
          <span class="cell">table-cell</span>
        </div>
      </fieldset>
      <fieldset>
        <legend>inline-block</legend>
        <div class="iblock wrapper">
          <span class="cell">table-cell</span>
          <span class="cell">table-cell</span>
        </div>
      </fieldset>

    0 讨论(0)
  • 2020-12-12 22:36

    display:table will make your tag behave like a table. inline-table just means that the element is displayed as an inline-level table. You can then do table-cell to let your element behave like a <td> element.

    display:inline - displays your element as an inline element (like <span>), and inline-block will just group them together in a block container.

    As the other answer suggested you can replace between the two as long as you follow the display convention in the rest of your code. (i.e. use table-cell with inline-table and not with inline-block).
    Check this link for more info on display.

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