Firefox pozisyon: tablo öğelerine göre pozisyonu destekliyor mu?


169

position: relative/ position: absoluteÜzerinde <th>veya <td>Firefox'ta / kullanmaya çalıştığımda işe yaramıyor gibi görünüyor.


3
Hayır, sanırım hiçbir tarayıcı bunu düzgün bir şekilde desteklemiyor. Herhangi bir HTML standardında AFAIK yasal değildir
Pekka

2
@Pekka: HTML gelmiyor, bu CSS. Ve şaşırtıcı bir şekilde, işe yarıyor. :-)
TJ Crowder

15
Bildiğim kadarıyla WebKit ve IE'de çalışıyor. Firefox, tablo hücrelerinde hoşlanmayan tek kişi gibi görünüyor. Ve evet, şamandıralara güvenmek zorunda kalmadan öğeleri <td> içine yerleştirmeye çalışıyorum.
Ben Johnson

2
Tekrar, Justin'in cevabına bak. Firefox'a bir tablo öğesi olarak değil de bir blok olarak davrandığınızı söylerseniz Firefox'ta iyi çalışır.
TJ Crowder

1
Bu sorudaki sorunu gösteren bir jsfiddle: jsfiddle.net/M5P93 IE, Safari, Chrome; Firefox başarısız oluyor.
Chris Moschini

Yanıtlar:


167

Kolay ve en uygun yol, hücrenin içeriğini bir div'a sarmak ve bu div'e göre konum eklemek olacaktır.

misal:

<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 Bu benim için çalışan tek çözüm. Kullanmak tr {display:block}düzeni tamamen bozar.
Wesley Murch

+1 Bu benim için de bir yanıt. display: blockkarmaşık tablo düzenlerinde bir düzeltme yeterli değildir. Ek div daha güvenilir çözümdür.
DA.

5
ancak, bu çözüm ile "genişlik" ve "yükseklik" hala kullanılamaz
4esn0k

@ 4esn0k genişlik ve yüksekliği kullanabileceğiniz bir çözüm buldunuz mu?
Neil

9
Ne yazık ki, çözüm yok değil diğer birinde daha o fazla içeriğe sahip başka bir sütun eklerseniz çalışır. Bu yüzden "kabul edilen cevap" bayrağını ve oyların verdiği takdiri anlamıyorum. Kontrol edin jsfiddle.net/ukR3q
Ocak

35

Hiç sorun değil. Ayrıca şunları ayarlamayı unutmayın:

display: block;

32
Display: block ayarının dezavantajı, doğrudan öğeye uygulandığında tablo biçimlendirmesi ile gerçekten karışabileceği gibi görünüyor. Çünkü bunu tablo hücresinden değiştiriyor ... yoksa ben deli miyim?
Ben Johnson

3
@ Ben: Şey, evet. positionBir tablo hücresindeki ayar , tanım gereği, tablo biçimlendirmesini ciddi şekilde değiştirir. Hücrenin bloğunu akıştan çıkarırsınız (akışta position: relativekaldığı, ancak ofsetin olduğu yerler hariç ).
TJ Crowder

2
@ Ben - Hayır, deli değil. İşlerin istediğiniz gibi görünmesi için kesinlikle biraz daha iş yapmanız gerekecek. Mesele sadece mümkün.
Justin Niessner

1
@TJ Konum eklemiyor: görsel görünümü değiştiren göreceli, th / td'yi tablo hücresinden bloğa değiştiriyor. Yine, bunun işe yaradığını bilmek güzel, ancak birçok durumda blok düzeyinde öğeler oluşturmak tablo biçimlendirmesiyle gerçekten karışıklık yaratacaktır. Teşekkürler Justin!
Ben Johnson

9
ne yazık ki, display: blockFirefox'ta da sorunlara neden olabilir - yani tablo hücresi sütunları içeriyorsa, onu bloke edecek şekilde ayarlamak hücreyi ilk sütuna daraltır.
DA.

13

Internet Explorer 7, 8 ve 9 dahil olmak üzere her web tarayıcısı konumu doğru bir şekilde ele aldığından: bir tablo görüntüleme öğesine göre ve yalnızca FireFox bunu yanlış işlediğinden, en iyi seçeneğiniz bir JavaScript şim kullanmaktır. DOM'nizi yalnızca bir hatalı tarayıcı için yeniden düzenlemenize gerek yoktur. İnsanlar IE yanlış bir şey aldığında ve diğer tüm tarayıcılar doğru olsun JavaScript şimler kullanın.

İşte tüm HTML, CSS ve JavaScript açıklamalı tamamen açıklamalı bir jsfiddle.

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

Yukarıdaki benim jsfiddle örnek sadece duyarlı bir düzen ile çalışacağını göstermek için "Duyarlı Web Tasarım" tekniklerini kullanır. Ancak, kodunuzun duyarlı olması gerekmez.

İşte aşağıdaki JavaScript, ancak bağlamdan bu kadar anlamlı gelmeyecek. Lütfen yukarıdaki jsfiddle bağlantısına göz atın.

$(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

Evet. bu yüzden favori tarayıcı algılama yönteminizle değiştirin.
mrbinky3000

1
Tarayıcı hatalı değil. Spesifikasyon, etkinin tanımsız olduğunu söylüyor.
WGH

4
@WGH Çözümü daha az doğru yapmaz. Downvote için teşekkürler.
mrbinky3000

1
Hey, taahhütlerinden bir poli dolgu oluşturdum, bak! :) github.com/Grawl/gecko-table-position-polyfill
Даниил Пронин

11

Firefox 30 ile başlayarak positiontablo bileşenlerinde kullanabilirsiniz . Mevcut gece yapımıyla kendiniz deneyebilirsiniz (bağımsız çalışır): http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/

Test örneği ( 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>

Burada değişikliklerin geliştiricilerin tartışma takip etmeye devam edebilirsiniz (konu 13 olan yaş arası): https://bugzilla.mozilla.org/show_bug.cgi?id=63895

Yakın tarihli yayın geçmişine bakılırsa , bu, Mayıs 2014'te mümkün olabilir. Heyecanımı zar zor içerebiliyorum!

EDIT (6/10/14): Firefox 30 bugün yayınlandı. Yakında, masa üstü konumlandırma büyük masaüstü tarayıcılarında sorun olmayacak


7

Firefox 3.6.13 itibariyle, position: relative / mutute tablo öğeleri üzerinde çalışmıyor gibi görünüyor. Bu uzun süredir devam eden Firefox davranışı gibi görünüyor. Aşağıdakilere bakın: http://csscreator.com/node/31771

CSS Oluşturucu bağlantısı aşağıdaki W3C başvurusunu gönderir:

'Position: relative' öğesinin table-row-group, table-header-group, table-footer-group, table-row, table-column-group, table-column, table-cell ve table-caption elemanları üzerindeki etkisi tanımsız. http://www.w3.org/TR/CSS21/visuren.html#positioning-scheme


Justin'in cevabına bakın. displayAyarı değiştirmeniz koşuluyla çalışır . Bu da mantıklı (CSS derecesine göre mantıklı).
TJ Crowder

8
Evet, bu "çalışır", ancak hücrelere uygulamak tablonuzu tamamen yıkıyor ... Bu durumda anlamsız.
Simon East

3

display:inline-blockFirefox 11'de benim için çalışmayı deneyin , masanın düzenini bozmadan bana td / th içinde konumlandırma yeteneği sağladı. Bu position:relativetd / th ile birlikte bir şeyler yapmak gerekir. Sadece kendim çalışıyordum.


1

Bir table-cellöğem vardı (bu aslında bir DIVdeğil TD)

Ben değiştirdim

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

(Chrome'da çalıştı) ile

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

Tabii ki dolgu genellikle kutu modelinde genişliğe eklenir - ancak mutlak genişlikler söz konusu olduğunda tabloların her zaman kendi fikirleri vardır - bu bazı durumlarda işe yarayacaktır.


0

Üst öğeye display: block eklenmesi, bunu firefox'ta çalıştırdı. Ayrıca top eklemek zorunda kaldı: 0px; left: 0px; Chrome'un çalışması için üst öğeye ekleyin. IE7, IE8 ve IE9 da çalışıyor.

<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

Kabul edilen çözüm türü çalışır, ancak diğerine göre daha fazla içeriğe sahip başka bir sütun eklerseniz değil. Eğer eklerseniz height:100%sizin için tr , td & div sonra çalışması gerekir.

<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>

Tek sorun, bunun Chrome ve IE'de değil, yalnızca FF'deki sütun yüksekliği sorununu çözmesidir. Bu bir adım daha yakın, ama mükemmel değil.

Jan'ın çalıştığını göstermek için kabul edilen cevapla çalışmayan bir kemanı güncelledim. http://jsfiddle.net/gvcLoz20/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.