Firefoxは位置をサポートしていますか:テーブル要素の相対的ですか?


169

私が使用しようとするとposition: relative/ position: absolute<th>または<td>Firefoxでそれが動作するようには思えません。


3
いいえ、私はそれを適切にサポートするブラウザはないと思います。これは、任意のHTML標準の私の知る限りでは、法的ではありません
ペッカ

2
@ペッカ:HTMLは含まれていません。これはCSSです。そして驚くべきことに、それは機能します。:-)
TJクラウダー

15
私の知る限り、WebKitとIEで動作します。テーブルセルで嫌いなのはFirefoxだけです。そして、はい、私はフロートに依存することなく<td>の内部に要素を配置しようとしています。
ベンジョンソン

2
もう一度、ジャスティンの答えを見てください。テーブル要素としてではなくブロックとして扱うことをFirefoxに指示すると、Firefoxで問題なく機能します。
TJクラウダー

1
この質問の問題を示すjsfiddle:jsfiddle.net/M5P93 IE、Safari、Chromeで動作します。Firefoxが失敗します。
Chris Moschini、2012

回答:


167

セルのコンテンツをdivでラップし、そのdivに対してposition:relativeを追加するのが簡単で適切な方法です。

例:

<td>
  <div style="position:relative">
      This will be positioned normally
      <div style="position:absolute; top:5px; left:5px;">
           This will be positioned at 5,5 relative to the cell
      </div>
  </div>
</td>

11
+1これは私にとって有効な唯一のソリューションです。tr {display:block}完全に使用すると、レイアウトが損なわれます。
Wesley Murch、2011

+1これも私にとっての答えです。display: block複雑なテーブルレイアウトの修正だけでは不十分です。追加のdivは、より信頼性の高いソリューションです。
DA。

5
しかし、このソリューションでは、「幅」と「高さ」はまだ使用できません
4esn0k

@ 4esn0k幅と高さを使用できるソリューションを見つけましたか?
Neil

9
残念ながら、他の列よりも多くのコンテンツを含む別の列を追加すると、ソリューションは機能しませ。だから私は「受け入れられた回答」フラグと賛成票によって与えられた多くの感謝を理解していません。ご確認くださいjsfiddle.net/ukR3q

35

それは問題ないはずです。次の設定も忘れないでください。

display: block;

32
表示を設定することの欠点:ブロックは、要素に直接適用される場合、テーブルの書式設定を実際に混乱させる可能性があるようです。テーブルセルから変更しているので...それとも私は狂っていますか?
ベンジョンソン

3
@ベン:そうですね。positionテーブルセルの設定は、定義により、テーブルの書式を大幅に変更します。セルのブロックをフローから外します(ただしposition: relative、フロー内に留まり、フローからオフセットされる場合を除きます)。
TJクラウダー

2
@ベン-いいえ、クレイジーではありません。あなたは間違いなくあなたが望む方法で物事を見てもらうために、さらにいくつかの作業を行う必要があります。ポイントは、それが可能であるということだけです。
Justin Niessner、2011

1
@TJこれは位置を追加するものではありません。相対的なものは視覚的な外観を変更し、th / tdをテーブルセルからブロックに変更します。繰り返しになりますが、機能することを知っておくと便利ですが、多くの場合、ブロックレベルの要素を作成すると、テーブルのフォーマットが非常に複雑になります。ジャスティン、ありがとう!
ベンジョンソン

9
悲しいかな、display: blockFirefoxでも問題が発生する可能性があります。つまり、テーブルのセルが列にまたがっている場合、それをブロックに設定すると、セルが最初の列に折りたたまれます。
DA。

13

Internet Explorer 7、8、9を含むすべてのWebブラウザーがtable-display要素のposition:relativeを正しく処理し、FireFoxのみがこれを正しく処理しないため、最善の策はJavaScriptシムを使用することです。1つの障害のあるブラウザーのためだけにDOMを再配置する必要はありません。IEで問題が発生し、他のすべてのブラウザで問題が発生すると、人々は常にJavaScriptシムを使用します。

これは、HTML、CSS、JavaScriptのすべてが説明された、完全に注釈が付けられたjsfiddleです。

http://jsfiddle.net/mrbinky3000/MfWuV/33/

上記のjsfiddleの例では、レスポンシブレイアウトで機能することを示すために、「レスポンシブWebデザイン」手法を使用しています。ただし、コードがレスポンシブである必要はありません。

以下は、以下のJavaScriptですが、コンテキスト外ではそれほど意味がありません。上記のjsfiddleリンクをチェックしてください。

$(function() {
    // FireFox Shim
    // FireFox is the *only* browser that doesn't support position:relative for
    // block elements with display set to "table-cell." Use javascript to add
    // an inner div to that block and set the width and height via script.
    if ($.browser.mozilla) {

        // wrap the insides of the "table cell"            
        $('#test').wrapInner('<div class="ffpad"></div>');

        function ffpad() {
            var $ffpad = $('.ffpad'),
                $parent = $('.ffpad').parent(),
                w, h;

            // remove any height that we gave ffpad so the browser can adjust size naturally.
            $ffpad.height(0);

            // Only do stuff if the immediate parent has a display of "table-cell".  We do this to
            // play nicely with responsive design.
            if ($parent.css('display') == 'table-cell') {               

                // include any padding, border, margin of the parent
                h = $parent.outerHeight();

                // set the height of our ffpad div
                $ffpad.height(h);

            }

        }


        // be nice to fluid / responsive designs   
        $(window).on('resize', function() {
            ffpad();
        });

        // called only on first page load
        ffpad();

    }

});

$ .browserはjQuery 1.9で削除されました
Matus

うん。したがって、お好みのブラウザ検出方法に置き換えてください。
mrbinky3000 2013年

1
ブラウザに問題はありません。仕様は効果が定義されていないと述べています。
WGH 2013

4
@WGHソリューションの正当性が損なわれることはありません。反対票をありがとう。
mrbinky3000 2013

1
ちょっと私はあなたのコミットからポリフィルを作成しました、それを見てください!:) github.com/Grawl/gecko-table-position-polyfill
ДаниилПронин

11

Firefox 30以降、positionテーブルコンポーネントで使用できるようになります。現在のナイトリービルド(スタンドアロンとして動作)を試してみることができます:http : //ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/

テストケース(http://jsfiddle.net/acbabis/hpWZk/):

<table>
    <tbody>
        <tr>
            <td style="width: 100px; height: 100px; background-color: red; position: relative">
                <div style="width: 10px; height: 10px; background-color: green; position: absolute; top: 10px; right: 10px"></div>
            </td>
        </tr>
    </tbody>
<table>

あなたがここに変更の開発者の議論に従うことを続けることができます(ここでは、13ある古い):https://bugzilla.mozilla.org/show_bug.cgi?id=63895

最近のリリース履歴から判断すると、これは2014年5月に入手可能になる可能性があります。

編集(2014年6月10日): Firefox 30が本日リリースされました。すぐに、主要なデスクトップブラウザではテーブルの配置は問題にならない


7

Firefox 3.6.13以降、position:relative / absoluteはテーブル要素で機能しないようです。これは、長年のFirefoxの動作のようです。次を参照してください:http : //csscreator.com/node/31771

CSS Creatorリンクは、次のW3Cリファレンスを投稿します。

table-row-group、table-header-group、table-footer-group、table-row、table-column-group、table-column、table-cell、およびtable-caption要素に対する「position:relative」の影​​響未定義です。http://www.w3.org/TR/CSS21/visuren.html#positioning-scheme


ジャスティンの答えを見てください。display設定を変更すれば機能します。これは理にかなっています(CSSは理にかなっています)。
TJクラウダー

8
ええ、それはセルに適用するとテーブルが完全に破壊されることを除いて「機能します」...その場合はちょっと無意味です。
Simon East、

3

display:inline-blockテーブルのレイアウトを壊すことなくtd / th内でのポジショニング機能を与えてくれるFirefox 11で機能するそれを使ってみてください。連動しているposition:relativeTD /番目に物事を仕事にするべきです。自分で機能させたところです。


1

私はtable-cell要素を持っていました(実際にはではありDIVませんでしたTD

交換しました

display: table-cell;
position: relative;
left: .5em

(これはChromeで機能しました)

display: table-cell;
padding-left: .5em

もちろん、パディングは通常、ボックスモデルの幅に追加されます-しかし、絶対幅に関しては、テーブルは常に独自の考え方を持っているように見えるので、これは場合によっては機能します。


0

親要素にdisplay:blockを追加すると、これがFirefoxで機能します。また、top:0pxを追加する必要がありました。left:0px; 動作するChromeの親要素に。IE7、IE8、およびIE9も機能しています。

<td style="position:relative; top:0px; left:0px; display:block;">
    <table>        
        // A table of information here. 
        // Next line is the child element I want to overlay on top of this table
    <tr><td style="position:absolute; top:5px; left:100px;">
        //child element info
    </td></tr>
   </table>
</td>

0

受け入れられた解決策は機能しますが、他の列よりも多くのコンテンツを含む別の列を追加する場合はそうではありません。height:100%あなたのtr、td、divに追加すると、うまくいくはずです。

<tr style="height:100%">
  <td style="height:100%">
    <div style="position:relative; height:100%">
        This will be positioned normally
        <div style="position:absolute; top:5px; left:5px;">
             This will be positioned at 5,5 relative to the cell
        </div>
    </div>
  </td>
</tr>

唯一の問題は、FFの列の高さの問題のみが修正され、ChromeとIEでは修正されないことです。したがって、これは一歩近づきますが、完璧ではありません。

Janからのフィドルを更新し、承認された回答で機能していなかったことを示しました。 http://jsfiddle.net/gvcLoz20/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.