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

在浏览器中垂直旋转、居中到底对齐的表格标题

  •  0
  • Phrogz  · 技术社区  · 3 年前

    我有一个带有旋转标题的表,在Chrome中看起来很像,但在Firefox中不是。

    Chrome v108(垂直底部,水平中间)

    headers are rotated vertically, vertically bottom-aligned and horizontally centered

    Firefox v107(垂直居中,水平向右)

    headers are rotated vertically, but vertically middle-aligned and horizontally right aligned

    如何使它们跨浏览器工作,以便它们垂直旋转,垂直位于单元格底部,水平居中,并占用最小的宽度?

    我使用的代码从 this answer 让它在Chrome中运行:

    table { border-collapse:collapse; font-family:sans-serif }
    thead th {
        /* Rotate vertical: https://stackoverflow.com/a/47245068 */
        -ms-writing-mode:tb-rl;
        -webkit-writing-mode:vertical-lr;
        writing-mode:vertical-rl;
        transform:rotate(180deg);
        vertical-align:middle;
        text-align:left;
        padding:0.5em 0 0 0;
        opacity:0.5;
        font-size:90%;
    }
    tbody th { text-align:right; padding-right:0.5em }
    tbody td { text-align:center; padding:0 0.2em }
    .yes { font-weight:bold; color:#060 }
    .maybe { color:#440 }
    .no  { color:#500 }
    <table><thead><tr>
        <th></th>
        <th class="yes">yes</th>
        <th class="maybe">maybe</th>
        <th class="no">no</th>
        <th>who?</th>
    </tr></thead><tbody><tr>
        <th>Fri, Dec 9, 12pm</th>
        <td class="yes">2</td><td class="maybe">1</td><td class="no">1</td>
        <td><button>≡</button></td>
    </tr><tr>
        <th>Wed, Dec 14, 12pm</th>
        <td class="yes">4</td><td class="maybe">0</td><td class="no">0</td>
        <td><button>≡</button></td>
    </tr><tr>
        <th>Fri, Dec 16, 12pm</th>
        <td class="yes">0</td><td class="maybe">0</td><td class="no">1</td>
        <td><button>≡</button></td>
    </tr></tbody></table>
    0 回复  |  直到 3 年前
        1
  •  0
  •   Phrogz    3 年前

    这似乎对我有效,在Chrome、Firefox和iOS Safari上进行了测试:

    thead th {
      vertical-align: bottom;
      text-align:     center;
      width:          0.5em;
      min-width:      0.5em;
      padding:        0;
    }
    thead th span {
      writing-mode: vertical-lr;
      transform:    rotate(180deg);
    
      /* slight horizontal offset to suit tastes */
      position:relative; left:-2px;
    }
    
    /* need following (or explicit width) or else the */
    /* cells in the rows will force wrap every word   */
    tbody th { white-space:nowrap }
    
    /*************** unrelated formatting ***************/
    table { border-collapse:collapse; margin:1em auto }
    thead th { font-size:90% }
    thead th span { opacity:0.5 }
    th, td { vertical-align:middle; padding:0 0.5em }
    th { text-align:right; font-weight:normal }
    
    .yes { color:#090; font-weight:bold }
    .maybe { color:#660 }
    .no  { color:#600 }
    
    tr > * { border-bottom:1px solid rgba(0,0,0,0.2)}
    tr:last-child > * { border-bottom: 0 }
    <table><thead><tr>
        <th></th>
        <th class="yes"><span>yes</span></th>
        <th class="maybe"><span>maybe</span></th>
        <th class="no"><span>no</span></th>
        <th><span>who?</span></th>
    </tr></thead><tbody><tr>
        <th>Fri, Dec 9, 12pm</th>
        <td class="yes">2</td><td class="maybe">1</td><td class="no">1</td>
        <td><button>≡</button></td>
    </tr><tr>
        <th>Wed, Dec 14, 12pm</th>
        <td class="yes">4</td><td class="maybe">0</td><td class="no">0</td>
        <td><button>≡</button></td>
    </tr><tr>
        <th>Fri, Dec 16, 12pm</th>
        <td class="yes">0</td><td class="maybe">0</td><td class="no">1</td>
        <td><button>≡</button></td>
    </tr></tbody></table>