web-dev-qa-db-ja.com

HTMLテーブル行全体のラインスルー/取り消し線

いくつかの調査の後、私はこの質問に対する答えを見つけることができませんでした。 this がありましたが、実際には私の質問には答えませんでした。 CSS内のテキストだけでなく、CSS内の完全なHTMLテーブル行を「取り消し」たいと思います。まったく可能ですか?リンクした例から、trスタイリングはFirefoxでも機能しないようです。 (とにかく、テキスト装飾はテキストafaikにのみ適用されます)

52

そうそう、そうです!

CSS:

table {
    border-collapse: collapse;
}

td {
    position: relative;
    padding: 5px 10px;
}

tr.strikeout td:before {
    content: " ";
    position: absolute;
    top: 50%;
    left: 0;
    border-bottom: 1px solid #111;
    width: 100%;
}

HTML:

<table>
    <tr>
        <td>Stuff</td>
        <td>Stuff</td>
        <td>Stuff</td>
    </tr>
    <tr class="strikeout">
        <td>Stuff</td>
        <td>Stuff</td>
        <td>Stuff</td>
    </tr>
    <tr>
        <td>Stuff</td>
        <td>Stuff</td>
        <td>Stuff</td>
    </tr>
</table>

http://codepen.io/nericksx/pen/CKjbe

90
crinkledMap

私の答え(下記)は不可能だと言った。 @NicoleMorganEricksonが指摘したように、私は間違っていました。その方法については、彼女の答えをご覧ください(そして、賛成してください!)。要するに、:before擬似クラスを使用して、セルの中央のコンテンツの上に境界線を描く要素を作成します。

table           { border-collapse:collapse } /* Ensure no space between cells   */
tr.strikeout td { position:relative        } /* Setup a new coordinate system   */
tr.strikeout td:before {                     /* Create a new element that       */
  content: " ";                              /* …has no text content            */
  position: absolute;                        /* …is absolutely positioned       */
  left: 0; top: 50%; width: 100%;            /* …with the top across the middle */
  border-bottom: 1px solid #000;             /* …and with a border on the top   */
}    

(元の回答)

いいえ、CSSとセマンティックテーブルマークアップのみを使用することはできません。 @JMCCreativeが示唆しているように、visuallyを使用して、行の上に行を配置する方法をいくつでも使用できます。

代わりに、colorbackground-colorfont-style:italic、および/またはtext-decoration:line-throughの組み合わせを使用して、行全体を明らかに異なるものにすることをお勧めします。 (私は個人的に、テキストを通常のテキストよりも背景により近い色に強く「フェードアウト」し、斜体にします。)

37
Phrogz

最も簡単な方法は、background-imagetrおよびその子孫セル(または単に透明なbackground-colorそれらのセルで)。

html:

<table>
    <thead>
        <tr>
            <th>Col One</th>
            <th>Col Two</th>
            <th>Col Three</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>First row, One-One</td>
            <td>First row, One-Two</td>
            <td>First row, One-Three</td>
        </tr>
        <tr class="empty">
            <td></td>
            <td></td>
            <td></td>
        </tr>
    </tbody>
</table>

css:

table {
    empty-cells: show;
}
th, td {
    width: 6em;
    height: 2em;
    line-height: 2em;
    border: 1px solid #ccc;
}
tr.empty,
tr.empty td {
    background: transparent url('http://davidrhysthomas.co.uk/linked/strike.png') 0 50% repeat-x;
}

JS Fiddle demo

11
David Thomas
tr {
    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2NkYGCQBAAAIwAbDJgTxgAAAABJRU5ErkJggg==');
    background-repeat: repeat-x;
    background-position: 50% 50%;
}

http://www.patternify.com/ を使用して、1x1画像のURLを生成しました。

10
Semiaddict

私はNicole Morgan Erickson's answerが好きですが、副作用が発生する彼のソリューションを逐語的に実装するかもしれません。このコーシャを維持するためにいくつかの小さな調整を下に追加しました...そうしないようにこのcssですべてのテーブルまたはすべてのtdをグローバルに変更ではありません。

また、行にボタンを配置して行を消したかったのですが、見やすくするために、ボタンで列を消したくありませんでした。残りの行を削除したかっただけです。このために、取り消し線を表示できるようにしたいすべての列が、クラスでマークされることによってそのように宣言しなければならないようにしました。 この反復では、テーブルをストライク可能としてマークし、各tdをストライク可能としてマークする必要がありますが、ストライク不可能なテーブルに副作用を与えないことで安全性が得られ、どの列を打ち消すかを制御します。

CSS:

table.strike-able {
    border-collapse: collapse;
}

table.strike-able tr td {
    position: relative;
    padding: 3px 2px;
}

table.strike-able tr th {
    position: relative;
    padding: 3px 2px;
}

table.strike-able tr.strikeout td.strike-able:before {
    content: " ";
    position: absolute;
    top: 50%;
    left: 0;
    border-bottom: 2px solid #d9534f;
    width: 100%;
}

使用法:

<table class="strike-able" id="Medications" data-item-count="@Model.Medications.Count">
<tr>
    <th>
        Some Column
    </th>
    <th>
        Command Column
    </th>
</tr>
<tr class="strikeout">
    <td class="strike-able"></td>
    <td>Button that Toggles Striking Goes Here (active)</td>
</tr>
<tr>
    <td class="strike-able"></td>
    <td>Button that Toggles Striking Goes Here</td>
</tr>
</table>

最後に、これをBootstrapで使用しており、削除を行うのは危険なこととして扱っているため、使用に合わせて色を少しフォーマットしました。

8
Greg

@NicoleMorganErickson、私はあなたの答えが好きですが、適用された行だけに影響を与えるストライクアウトを得ることができませんでした。また、複数行を適用する必要があったため、ソリューションを1つのクラスに変更しました。

CSS:

tr.strikeout td:before {  
  content: " ";  
  position: absolute;  
  display: inline-block;  
  padding: 5px 10px;  
  left: 0;  
  border-bottom: 1px solid #111;  
  width: 100%;  
}

http://codepen.io/anon/pen/AaFp

3
Revoman

はい、できます。行の最初のセルで、HRを含むdivを作成します。 divを左にフロートし、その幅を含む要素(この場合はテーブルセル)の%として幅を指定します。必要に応じて、その行のテーブルセル全体で、必要に応じてテーブルの幅を超えて幅を広げます。

これは私のために働く:

<style>
.strikeThrough {
height:3px;
color:#ff0000;
background-color:#ff0000;
}
.strikeThroughDiv {
float:left;
    width:920%;
    position:relative;
    top:18px;
border:none;
}
</style>
<table width="900" border="1" cellspacing="0" cellpadding="4">
   <tr  valign="bottom">
    <td>
    <div class="strikeThroughDiv"><hr  class="strikeThrough"/></div>
    One
    </td>
    <td>    
        <label for="one"></label>
        <input type="text" name="one" id="one" />
    </td>
    <td>
    <label for="list"></label>
      <select name="list" id="list">
        <option value="One">1</option>
        <option value="Two">2</option>
        <option value="Three" selected>3</option>
      </select>
    </td>
    <td>
      Four
    </td>
    <td>
      Five
    </td>
  </tr>
</table>

行の幅を制御するには、HRを含むテーブルセルの幅を指定する必要があります。 HR要素のスタイリングについては、高さを3ピクセル未満にしないでください。

1
Eamonn Gormley

<hr />行の上にある要素。これがどの程度静的または動的である必要があるかに応じて、それは非常に高速/簡単な方法またははるかに困難になる可能性があります。

0
JakeParis