Tablo satırında slideDown (veya show) işlevi nasıl kullanılır?


215

Bir tabloya bir satır eklemek çalışıyorum ve görünümünde bu satır slayt var, ancak slidedown işlevi düzeni karmaşa tablo satırına bir görüntü: blok tarzı eklenmesi gibi görünüyor.

Bu sorunu çözmek için herhangi bir fikir?

İşte kod:

$.get('/some_url', 
  { 'val1': id },

  function (data) {
    var row = $('#detailed_edit_row');
    row.hide();
    row.html(data);
    row.slideDown(1000);
  }
);

Bir masa olmalı mı? Sanırım tablo olmadan çok daha kolay ol.
MrChrister

fadeInve fadeOuttablo satırlarında çalışın ve hoş bir alternatif görsel efekt yapın (yalnızca Firefox'ta test edildi)
Savage

Yanıtlar:


296

Animasyonlar tablo satırlarında desteklenmez.

Chaffer ve Swedberg tarafından yapılan "Öğrenme jQuery"


Tablo satırları, animasyonlar için görünen engelleri gösterir, çünkü tarayıcılar görünür görüntüleme özellikleri için farklı değerler (tablo satırı ve blok) kullanır. Animasyon olmadan .hide () ve .show () yöntemleri tablo satırlarıyla her zaman güvenlidir. JQuery 1.1.3 sürümünden itibaren .fadeIn () ve .fadeOut () da kullanılabilir.


TD içeriğinizi bir div içinde sarabilir ve bunun üzerindeki slideDown'ı kullanabilirsiniz. Animasyonun ekstra işaretlemeye değip değmeyeceğine karar vermeniz gerekir.


5
Harika çalışıyor! Küçük bir başka şey daha var: Varsa hücre dolgusunu da canlandırmanız gerekecek. Ama bu da önemli değil.
Adrian Grigore

11
Dolguyu şu şekilde canlandırabilirsiniz:$('tr').find('td').animate({padding: '0px'}, {duration: 200});
Andrew

@Emily: Lütfen jQuery kaynağının belirli satırlarına işaret edebilir misiniz? Projemin kaynağını kesmek için cazipim.
Randomblue

7
Doğrudan bir cevap değil, ama fadeIn / fadeOut kullanmanın çoğu durumda neredeyse iyi olduğunu ve tablo satırlarında iyi çalıştığını gördüm.
Phil LaNasa

@PhilLaNasa İlk başta "Hayır, bu iyi görünmeyecek" gibiydim ama sonra denedim ve gerçekten iyi görünüyordu! Seyahat için teşekkürler!
Kenton de Jong

157

Ben sadece tr dinamik olarak sarın sonra slideUp / slideDown tamamlandığında kaldırın. Bu, bir veya birkaç etiket ekleyip kaldırarak ve animasyon tamamlandıktan sonra bunları kaldırarak oldukça küçük bir ek yüktür, bunu yaparken görünür bir gecikme görmüyorum.

Slayt :

$('#my_table > tbody > tr.my_row')
 .find('td')
 .wrapInner('<div style="display: block;" />')
 .parent()
 .find('td > div')
 .slideUp(700, function(){

  $(this).parent().parent().remove();

 });

Kayıp düşmek:

$('#my_table > tbody > tr.my_row')
 .find('td')
 .wrapInner('<div style="display: none;" />')
 .parent()
 .find('td > div')
 .slideDown(700, function(){

  var $set = $(this);
  $set.replaceWith($set.contents());

 });

Onun eklentisi aldı ve yukarı geri soyulmuş gibi, fletchzone.com haraç ödemek zorunda dostum.


Teşekkürler! Her nasılsa bu benim için çalıştı: row.find ('td'). WrapInner ('<div style = "display: none;" />').parent().prependTo('#MainTable> tbody'). Find (' td> div '). slideDown (' yavaş ', işlev () {var $ set = $ (this); $ set.replaceWith ($ set.contents ());});
pauloya

Tek sorun, hücreler arasında hafif bir gecikme olması.
Archimedes Trajano

41

İşte bunun için yazdığım bir eklenti, Fletch'un uygulamasından biraz zaman alıyor, ancak benimki yalnızca bir satırı yukarı veya aşağı kaydırmak için kullanılıyor (satır ekleme yok).

(function($) {
var sR = {
    defaults: {
        slideSpeed: 400,
        easing: false,
        callback: false     
    },
    thisCallArgs: {
        slideSpeed: 400,
        easing: false,
        callback: false
    },
    methods: {
        up: function (arg1,arg2,arg3) {
            if(typeof arg1 == 'object') {
                for(p in arg1) {
                    sR.thisCallArgs.eval(p) = arg1[p];
                }
            }else if(typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')) {
                sR.thisCallArgs.slideSpeed = arg1;
            }else{
                sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
            }

            if(typeof arg2 == 'string'){
                sR.thisCallArgs.easing = arg2;
            }else if(typeof arg2 == 'function'){
                sR.thisCallArgs.callback = arg2;
            }else if(typeof arg2 == 'undefined') {
                sR.thisCallArgs.easing = sR.defaults.easing;    
            }
            if(typeof arg3 == 'function') {
                sR.thisCallArgs.callback = arg3;
            }else if(typeof arg3 == 'undefined' && typeof arg2 != 'function'){
                sR.thisCallArgs.callback = sR.defaults.callback;    
            }
            var $cells = $(this).find('td');
            $cells.wrapInner('<div class="slideRowUp" />');
            var currentPadding = $cells.css('padding');
            $cellContentWrappers = $(this).find('.slideRowUp');
            $cellContentWrappers.slideUp(sR.thisCallArgs.slideSpeed,sR.thisCallArgs.easing).parent().animate({
                                                                                                                paddingTop: '0px',
                                                                                                                paddingBottom: '0px'},{
                                                                                                                complete: function () {
                                                                                                                    $(this).children('.slideRowUp').replaceWith($(this).children('.slideRowUp').contents());
                                                                                                                    $(this).parent().css({'display':'none'});
                                                                                                                    $(this).css({'padding': currentPadding});
                                                                                                                }});
            var wait = setInterval(function () {
                if($cellContentWrappers.is(':animated') === false) {
                    clearInterval(wait);
                    if(typeof sR.thisCallArgs.callback == 'function') {
                        sR.thisCallArgs.callback.call(this);
                    }
                }
            }, 100);                                                                                                    
            return $(this);
        },
        down: function (arg1,arg2,arg3) {
            if(typeof arg1 == 'object') {
                for(p in arg1) {
                    sR.thisCallArgs.eval(p) = arg1[p];
                }
            }else if(typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')) {
                sR.thisCallArgs.slideSpeed = arg1;
            }else{
                sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
            }

            if(typeof arg2 == 'string'){
                sR.thisCallArgs.easing = arg2;
            }else if(typeof arg2 == 'function'){
                sR.thisCallArgs.callback = arg2;
            }else if(typeof arg2 == 'undefined') {
                sR.thisCallArgs.easing = sR.defaults.easing;    
            }
            if(typeof arg3 == 'function') {
                sR.thisCallArgs.callback = arg3;
            }else if(typeof arg3 == 'undefined' && typeof arg2 != 'function'){
                sR.thisCallArgs.callback = sR.defaults.callback;    
            }
            var $cells = $(this).find('td');
            $cells.wrapInner('<div class="slideRowDown" style="display:none;" />');
            $cellContentWrappers = $cells.find('.slideRowDown');
            $(this).show();
            $cellContentWrappers.slideDown(sR.thisCallArgs.slideSpeed, sR.thisCallArgs.easing, function() { $(this).replaceWith( $(this).contents()); });

            var wait = setInterval(function () {
                if($cellContentWrappers.is(':animated') === false) {
                    clearInterval(wait);
                    if(typeof sR.thisCallArgs.callback == 'function') {
                        sR.thisCallArgs.callback.call(this);
                    }
                }
            }, 100);
            return $(this);
        }
    }
};

$.fn.slideRow = function(method,arg1,arg2,arg3) {
    if(typeof method != 'undefined') {
        if(sR.methods[method]) {
            return sR.methods[method].apply(this, Array.prototype.slice.call(arguments,1));
        }
    }
};
})(jQuery);

Temel Kullanım:

$('#row_id').slideRow('down');
$('#row_id').slideRow('up');

Slayt seçeneklerini bağımsız değişkenler olarak iletin:

$('#row_id').slideRow('down', 500); //slide speed
$('#row_id').slideRow('down', 500, function() { alert('Row available'); }); // slide speed and callback function
$('#row_id').slideRow('down', 500, 'linear', function() { alert('Row available'); }); slide speed, easing option and callback function
$('#row_id').slideRow('down', {slideSpeed: 500, easing: 'linear', callback: function() { alert('Row available');} }); //options passed as object

Temel olarak, aşağı kaydırma animasyonu için eklenti, hücrelerin içeriğini DIV'lerde sarar, bunları canlandırır, sonra bunları kaldırır ve yukarı kaydırmak için tersi olur (hücre dolgusundan kurtulmak için bazı ekstra adımlarla). Ayrıca, çağırdığınız nesneyi döndürür, böylece aşağıdaki gibi yöntemleri zincirleyebilirsiniz:

$('#row_id').slideRow('down').css({'font-color':'#F00'}); //make the text in the row red

Umarım bu birine yardımcı olur.


Bir grup Satır eklemek / kaldırmak isterseniz ne olur? Bir Master / Detay işlevselliği
vermeliyim

Geri arama işlevi benim için hemen tetikleniyor.
Justin

Bu sadece gösterişsiz. Gerçi harika çalışır (gerçi geri arama işlevselliğini test etmediyseniz). Bir gün bunu tersine çevirebilecek kadar jQuery bileceğim.
cartbeforehorse

1
Bilginize: Hedef satırın içeriği başka bir tablo ise bu kırılıyor gibi görünüyor. Daha ileri gidecek zamanım yok ama bulduğum şey, çocuk tablosunu daraltması, tüm satırları gizli olarak ayarlaması, garip bir dolgu eklemesi ve sonra slideRow'ı çağırdığınızda bu satırları yeniden genişletmeyecek olması. ('aşağı').
Chris Porter

1
SlideRow ('yukarı') ve sonra slideRow ('aşağı') çağırırken komik davranan çocuk tabloları ile diğerleriyle aynı sorunlarla karşılaştım. Ben eklentide iki kez kullanılan find ('td') yöntemi nedeniyle anladım. Bunu çocuklara ('td') değiştirdim ve sorunlar derhal ortadan kayboldu. Bu hücrelerle ilgili sorunlar için, her iki çocuk örneğini ('td') çocuklara ('td, th') güncelleyin.
OregonJeff

4

Satır içeriğini bir satırda silmeyi <span>ve seçicinizin olmasını $('#detailed_edit_row span');biraz deneyebilirsiniz - ama biraz test ettim ve işe yaradı. Ayrıca table-rowyukarıdaki öneriyi denedim ve işe yaramadı.

update : Bu sorunla uğraşıyorum ve tüm göstergelerden jQuery, bir block öğesi olarak slideDown gerçekleştirdiği nesneye ihtiyaç duyuyor. Yani, zar yok. Ben bir hücrede slideDown kullandığım bir tablo sihirbaz ve düzeni hiç etkilemedi, bu yüzden senin nasıl kurulduğundan emin değilim. Tek çözümünüz, tabloyu o hücrenin bir blok olması ya da sadece .show();lanet bir şey olması iyi olacak şekilde yeniden düzenlemektir. İyi şanslar.


1
Tr ve td etiketlerini canlandıramazsınız. Her bir td'nin içeriğini bir div ile sarmalı, sonra div'ı canlandırmalı, sonra tr'i gizlemeli / göstermelisiniz:<td><div style="display:block">contents</div></td>
Andrew

4

Satırın içeriğini şu şekilde seçin:

$(row).contents().slideDown();

.contents () - Metin ve yorum düğümleri de dahil olmak üzere eşleşen öğelerin kümesindeki her öğenin alt öğelerini alın.


Ayrıca, sütunu da seçmelisiniz, öyle bir şey $('tr > td').contents().slideDown(). Sütunun içindeki tüm içeriğin bir etikete sarıldığından, yani <td>Some text</td>çalışmadığından emin olun. Bu en basit çözüm.
user2233706

3

Bunu cevaplarken zamanın biraz gerisindeyim ama bunu yapmanın bir yolunu buldum :)

function eventinfo(id) {
    tr = document.getElementById("ei"+id);
    div = document.getElementById("d"+id);
    if (tr.style.display == "none") {
        tr.style.display="table-row";
        $(div).slideDown('fast');
    } else {
        $(div).slideUp('fast');
        setTimeout(function(){tr.style.display="none";}, 200);
    }
}

Sadece tablo veri etiketlerinin içine bir div öğesi koydum. görünür olduğunda, div genişledikçe, tüm satır aşağı iner. sonra tablo satırını tekrar gizlemeden önce geri kaymasını (sonra etkiyi görmeniz için zaman aşımı) söyleyin :)

Umarım bu birine yardımcı olur!


3

Satır tıklamasında görünüme giren ve görünmeyen gizli satırları olan bir tablo oluşturdum.


3

İç içe tablo içeren bir tablo satırınız var:

<tr class='dummyRow' style='display: none;'>
    <td>
        <table style='display: none;'>All row content inside here</table>
    </td>
</tr>

To slideDown sıra:

$('.dummyRow').show().find("table").slideDown();

Not: satır ve içeriği (işte burada "table") , animasyon başlamadan önce her ikisinin de gizlenmesi gerekir .


To slideUp sıra:

$('.dummyRow').find("table").slideUp('normal', function(){$('.dummyRow').hide();});

İkinci parametre ( function()) bir geri aramadır.


Basit!!

Ayrıca , yukarı / aşağı kaydırma işlevlerinin parametreleri olarak eklenebilecek birkaç seçeneğin bulunduğunu unutmayın (en yaygın olanı 'slow've 'fast'.


İçeriğinizi satırlarınızın arasına mı koydunuz, yoksa bu bir yazım hatası mıydı?
Vincent

2

Arka arkadaki td öğelerini kullanarak bu sorunu çözdüm:

$(ui.item).children("td").effect("highlight", { color: "#4ca456" }, 1000);

Satırın kendisini canlandırmak garip davranışlara, çoğunlukla asenkron animasyon sorunlarına neden olur.

Yukarıdaki kod için, güncellemenin başarılı olduğunu vurgulamak için tabloda sürüklenen ve bırakılan bir satırı vurgularım. Umarım bu birine yardımcı olur.


Ben alıyorumeffect is not a function
Savage

2

Burada sunulan fikirleri kullandım ve bazı sorunlarla karşılaştım. Hepsini düzelttim ve paylaşmak istediğim pürüzsüz bir astarım var.

$('#row_to_slideup').find('> td').css({'height':'0px'}).wrapInner('<div style=\"display:block;\" />').parent().find('td > div').slideUp('slow', function() {$(this).parent().parent().remove();});

Td öğesinde css kullanır. Yüksekliği 0 piksele düşürür. Bu şekilde, yalnızca her bir td öğesinin içindeki yeni oluşturulan div-wrapper içeriğinin yüksekliği önemlidir.

SlideUp yavaş. Daha da yavaşlatırsanız, bir aksaklık fark edebilirsiniz. Başlangıçta küçük bir sıçrama. Bunun nedeni belirtilen css ayarıdır. Ancak bu ayarlar olmadan satır yüksekliği azalmaz. Sadece içeriği olurdu.

Sonunda tr elemanı kaldırılır.

Tüm satır sadece JQuery içerir ve yerel Javascript içermez.

Umarım yardımcı olur.

İşte bir örnek kod:

    <html>
            <head>
                    <script src="https://code.jquery.com/jquery-3.2.0.min.js">               </script>
            </head>
            <body>
                    <table>
                            <thead>
                                    <tr>
                                            <th>header_column 1</th>
                                            <th>header column 2</th>
                                    </tr>
                            </thead>
                            <tbody>
                                    <tr id="row1"><td>row 1 left</td><td>row 1 right</td></tr>
                                    <tr id="row2"><td>row 2 left</td><td>row 2 right</td></tr>
                                    <tr id="row3"><td>row 3 left</td><td>row 3 right</td></tr>
                                    <tr id="row4"><td>row 4 left</td><td>row 4 right</td></tr>
                            </tbody>
                    </table>
                    <script>
    setTimeout(function() {
    $('#row2').find('> td').css({'height':'0px'}).wrapInner('<div style=\"display:block;\" />').parent().find('td > div').slideUp('slow',         function() {$(this).parent().parent().remove();});
    }, 2000);
                    </script>
            </body>
    </html>

Bu yazı tam iki yaşında. Jquery 3.2.0 sürümü ile çalıştım. Kodu bugün Chrome 73.0.3683.75 ile test ettim ve işe yaradı.
19'da Darkwind

1

Tüm insanı kaydırmak istiyorum ve solma ve slayt efektlerini birleştirerek bu sorunu başardım.

Bunu 3 aşamada yaptım (aşağı veya yukarı kaydırmak istediğinizde 2. ve 3. adımlar değiştirilir)

  1. Tbody'e yükseklik atamak,
  2. Tüm td ve th solma,
  3. Kayan tbody.

SlideUp örneği:

tbody.css('height', tbody.css('height'));
tbody.find('td, th').fadeOut(200, function(){
    tbody.slideUp(300)
});

Bu, belirli bir satır yerine tüm tabloyu etkilemez mi?
Savage

1

Sunulan diğer tüm çözümlerle ilgili sorunlar yaşadım ama tereyağı kadar pürüzsüz olan bu basit şeyi yaptım.

HTML'nizi şu şekilde ayarlayın:

<tr id=row1 style='height:0px'><td>
  <div id=div1 style='display:none'>
    Hidden row content goes here
  </div>
</td></tr>

Ardından javascriptinizi şu şekilde ayarlayın:

function toggleRow(rowid){
  var row = document.getElementById("row" + rowid)

  if(row.style.height == "0px"){
      $('#div' + rowid).slideDown('fast');
      row.style.height = "1px";   
  }else{
      $('#div' + rowid).slideUp('fast');
      row.style.height = "0px";   
  } 
}

Temel olarak, "görünmez" satırı 0px yüksekliğinde, içinde bir div olacak şekilde yapın.
Div'de (satırda değil) animasyonu kullanın ve ardından satır yüksekliğini 1 piksel olarak ayarlayın.

Satırı tekrar gizlemek için div'deki karşı animasyonu kullanın ve satır yüksekliğini tekrar 0 piksele ayarlayın.


1

Vinny'nin yazdığı ve kullandığı eklentiyi beğendim. Ancak kayan satır (tr / td) içindeki tablolarda, iç içe tablo satırları kaydırıldıktan sonra bile her zaman gizlenir. Bu yüzden iç içe tablonun satırlarını gizlemek için eklentide hızlı ve basit bir hack yaptım. Sadece aşağıdaki satırı değiştirin

var $cells = $(this).find('td');

için

var $cells = $(this).find('> td');

bu sadece iç içe olmayanları değil, hemen tds bulur. Bu eklentiyi kullanan ve iç içe tabloları olan birine yardımcı olacağını umuyoruz.


1

# Vinny'nin yazısına bir yorum eklemek istiyorum ama temsilcisi yok yani bir cevap göndermek zorunda ...

Eklentinizle ilgili bir hata bulundu - sadece bir nesneyi argümanlarla ilettiğinizde, başka bir argüman geçirilmezse üzerine yazılırlar. Bağımsız değişkenlerin işlenme sırasını değiştirerek kolayca çözülür, aşağıdaki kodu. Ayrıca kapattıktan sonra satırı yok etmek için bir seçenek ekledim (sadece bir ihtiyaç vardı gibi!): $ ('# Row_id'). SlideRow ('yukarı', doğru); // satırı yok eder

(function ($) {
    var sR = {
        defaults: {
            slideSpeed: 400,
            easing: false,
            callback: false
        },
        thisCallArgs: {
            slideSpeed: 400,
            easing: false,
            callback: false,
            destroyAfterUp: false
        },
        methods: {
            up: function (arg1, arg2, arg3) {
                if (typeof arg2 == 'string') {
                    sR.thisCallArgs.easing = arg2;
                } else if (typeof arg2 == 'function') {
                    sR.thisCallArgs.callback = arg2;
                } else if (typeof arg2 == 'undefined') {
                    sR.thisCallArgs.easing = sR.defaults.easing;
                }
                if (typeof arg3 == 'function') {
                    sR.thisCallArgs.callback = arg3;
                } else if (typeof arg3 == 'undefined' && typeof arg2 != 'function') {
                    sR.thisCallArgs.callback = sR.defaults.callback;
                }
                if (typeof arg1 == 'object') {
                    for (p in arg1) {
                        sR.thisCallArgs[p] = arg1[p];
                    }
                } else if (typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')) {
                    sR.thisCallArgs.slideSpeed = arg1;
                } else if (typeof arg1 != 'undefined' && (typeof arg1 == 'boolean')) {
                    sR.thisCallArgs.destroyAfterUp = arg1;
                } else {
                    sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
                }

                var $row = $(this);
                var $cells = $row.children('th, td');
                $cells.wrapInner('<div class="slideRowUp" />');
                var currentPadding = $cells.css('padding');
                $cellContentWrappers = $(this).find('.slideRowUp');
                $cellContentWrappers.slideUp(sR.thisCallArgs.slideSpeed, sR.thisCallArgs.easing).parent().animate({
                    paddingTop: '0px',
                    paddingBottom: '0px'
                }, {
                    complete: function () {
                        $(this).children('.slideRowUp').replaceWith($(this).children('.slideRowUp').contents());
                        $(this).parent().css({ 'display': 'none' });
                        $(this).css({ 'padding': currentPadding });
                    }
                });
                var wait = setInterval(function () {
                    if ($cellContentWrappers.is(':animated') === false) {
                        clearInterval(wait);
                        if (sR.thisCallArgs.destroyAfterUp)
                        {
                            $row.replaceWith('');
                        }
                        if (typeof sR.thisCallArgs.callback == 'function') {
                            sR.thisCallArgs.callback.call(this);
                        }
                    }
                }, 100);
                return $(this);
            },
            down: function (arg1, arg2, arg3) {

                if (typeof arg2 == 'string') {
                    sR.thisCallArgs.easing = arg2;
                } else if (typeof arg2 == 'function') {
                    sR.thisCallArgs.callback = arg2;
                } else if (typeof arg2 == 'undefined') {
                    sR.thisCallArgs.easing = sR.defaults.easing;
                }
                if (typeof arg3 == 'function') {
                    sR.thisCallArgs.callback = arg3;
                } else if (typeof arg3 == 'undefined' && typeof arg2 != 'function') {
                    sR.thisCallArgs.callback = sR.defaults.callback;
                }
                if (typeof arg1 == 'object') {
                    for (p in arg1) {
                        sR.thisCallArgs.eval(p) = arg1[p];
                    }
                } else if (typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')) {
                    sR.thisCallArgs.slideSpeed = arg1;
                } else {
                    sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
                }

                var $cells = $(this).children('th, td');
                $cells.wrapInner('<div class="slideRowDown" style="display:none;" />');
                $cellContentWrappers = $cells.find('.slideRowDown');
                $(this).show();
                $cellContentWrappers.slideDown(sR.thisCallArgs.slideSpeed, sR.thisCallArgs.easing, function () { $(this).replaceWith($(this).contents()); });

                var wait = setInterval(function () {
                    if ($cellContentWrappers.is(':animated') === false) {
                        clearInterval(wait);
                        if (typeof sR.thisCallArgs.callback == 'function') {
                            sR.thisCallArgs.callback.call(this);
                        }
                    }
                }, 100);
                return $(this);
            }
        }
    };

    $.fn.slideRow = function (method, arg1, arg2, arg3) {
        if (typeof method != 'undefined') {
            if (sR.methods[method]) {
                return sR.methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
            }
        }
    };
})(jQuery);

Çocuklarda ve inci düzeltmelerinde de eklediğimi belirtmeyi unuttum
Mark Ball

0

Bir tablo satırını aynı anda kaydırmanız ve soldurmanız gerekirse, bunları kullanmayı deneyin:

jQuery.fn.prepareTableRowForSliding = function() {
    $tr = this;
    $tr.children('td').wrapInner('<div style="display: none;" />');
    return $tr;
};

jQuery.fn.slideFadeTableRow = function(speed, easing, callback) {
    $tr = this;
    if ($tr.is(':hidden')) {
        $tr.show().find('td > div').animate({opacity: 'toggle', height: 'toggle'}, speed, easing, callback);
    } else {
        $tr.find('td > div').animate({opacity: 'toggle', height: 'toggle'}, speed, easing, function(){
            $tr.hide();
            callback();
        });
    }
    return $tr;
};

$(document).ready(function(){
    $('tr.special').hide().prepareTableRowForSliding();
    $('a.toggle').toggle(function(){
        $button = $(this);
        $tr = $button.closest('tr.special'); //this will be specific to your situation
        $tr.slideFadeTableRow(300, 'swing', function(){
            $button.text('Hide table row');
        });
    }, function(){
        $button = $(this);
        $tr = $button.closest('tr.special'); //this will be specific to your situation
        $tr.slideFadeTableRow(300, 'swing', function(){
            $button.text('Display table row');
        });
});
});

0
function hideTr(tr) {
  tr.find('td').wrapInner('<div style="display: block;" />').parent().find('td > div').slideUp(50, function () {
    tr.hide();
    var $set = jQuery(this);
    $set.replaceWith($set.contents());
  });
}

function showTr(tr) {
  tr.show()
  tr.find('td').wrapInner('<div style="display: none;" />').parent().find('td > div').slideDown(50, function() {
    var $set = jQuery(this);
    $set.replaceWith($set.contents());
  });
}

aşağıdaki yöntemleri kullanabilirsiniz:

jQuery("[data-toggle-tr-trigger]").click(function() {
  var $tr = jQuery(this).parents(trClass).nextUntil(trClass);
  if($tr.is(':hidden')) {
    showTr($tr);
  } else {
    hideTr($tr);
  }
});

0

Satırdaki td'leri, satırdaki yüksekliği animasyon yapmaya başladığınızda hiçbiri göstermeyecek şekilde ayarladıysanız yapılabilir

tbody tr{
    min-height: 50px;
}
tbody tr.ng-hide td{
    display: none;
}
tr.hide-line{
    -moz-transition: .4s linear all;
    -o-transition: .4s linear all;
    -webkit-transition: .4s linear all;
    transition: .4s linear all;
    height: 50px;
    overflow: hidden;

    &.ng-hide { //angularJs specific
        height: 0;
        min-height: 0;
    }
}

0

Bu kod çalışıyor!

<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
        <title></title>
        <script>
            function addRow() {
                $('.displaynone').show();
                $('.displaynone td')
                .wrapInner('<div class="innerDiv" style="height:0" />');
                $('div').animate({"height":"20px"});
            }
        </script>
        <style>
            .mycolumn{border: 1px solid black;}
            .displaynone{display: none;}
        </style>
    </head>
    <body>
        <table align="center" width="50%">
            <tr>
                <td class="mycolumn">Row 1</td>
            </tr>
            <tr>
                <td class="mycolumn">Row 2</td>
            </tr>
            <tr class="displaynone">
                <td class="mycolumn">Row 3</td>
            </tr>
            <tr>
                <td class="mycolumn">Row 4</td>
            </tr>
        </table>
        <br>
        <button onclick="addRow();">add</button>    
    </body>
</html>

0

http://jsfiddle.net/PvwfK/136/

<table cellspacing='0' cellpadding='0' class='table01' id='form_table' style='width:100%;'>
<tr>
    <td style='cursor:pointer; width:20%; text-align:left;' id='header'>
        <label style='cursor:pointer;'> <b id='header01'>▲ Customer Details</b>

        </label>
    </td>
</tr>
<tr>
    <td style='widtd:20%; text-align:left;'>
        <div id='content' class='content01'>
            <table cellspacing='0' cellpadding='0' id='form_table'>
                <tr>
                    <td>A/C ID</td>
                    <td>:</td>
                    <td>3000/A01</td>
                </tr>
                <tr>
                    <td>A/C ID</td>
                    <td>:</td>
                    <td>3000/A01</td>
                </tr>
                <tr>
                    <td>A/C ID</td>
                    <td>:</td>
                    <td>3000/A01</td>
                </tr>
            </table>
        </div>
    </td>
</tr>

$(function () {
$(".table01 td").on("click", function () {
    var $rows = $('.content01');
    if ($(".content01:first").is(":hidden")) {
        $("#header01").text("▲ Customer Details");
        $(".content01:first").slideDown();
    } else {
        $("#header01").text("▼ Customer Details");
        $(".content01:first").slideUp();
    }
});

});


Bu, tablo içeren bir div öğesini gösterir ve gizler. OP'nin sorduğu gibi bir tablo satırı değil.
shazbot

0

Vinny tarafından sunulan fiş gerçekten yakın, ama buldum ve birkaç küçük sorunları düzeltildi.

  1. Açgözlülükle td öğelerini gizlenen satırın çocuklarının ötesine hedefledi. Daha sonra bu çocukları gösterirken bu çocukları aramış olsaydı, bu iyi olurdu. Yakınlaştıklarında, hepsi "display: none" ile sonuçlandı ve onları gizli hale getirdi.
  2. Çocuk elementlerini hiç hedef almadı.
  3. Çok fazla içeriğe sahip tablo hücreleri için (çok sayıda satır içeren iç içe geçmiş bir tablo gibi), sağlanan slideSpeed ​​değerine bakılmaksızın slideRow ('yukarı') çağrıldığında, dolgu animasyonu yapılır yapılmaz satırın görünümünü daraltır . Dolgu üzerindeki slideUp () yöntemi tamamlanıncaya kadar dolgu animasyonu tetiklemeyecek şekilde düzelttim.

    (function($){
        var sR = {
            defaults: {
                slideSpeed: 400
              , easing: false
              , callback: false
            }
          , thisCallArgs:{
                slideSpeed: 400
              , easing: false
              , callback: false
            }
          , methods:{
                up: function(arg1, arg2, arg3){
                    if(typeof arg1 == 'object'){
                        for(p in arg1){
                            sR.thisCallArgs.eval(p) = arg1[p];
                        }
                    }else if(typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')){
                        sR.thisCallArgs.slideSpeed = arg1;
                    }else{
                        sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
                    }
    
                    if(typeof arg2 == 'string'){
                        sR.thisCallArgs.easing = arg2;
                    }else if(typeof arg2 == 'function'){
                        sR.thisCallArgs.callback = arg2;
                    }else if(typeof arg2 == 'undefined'){
                        sR.thisCallArgs.easing = sR.defaults.easing;    
                    }
                    if(typeof arg3 == 'function'){
                        sR.thisCallArgs.callback = arg3;
                    }else if(typeof arg3 == 'undefined' && typeof arg2 != 'function'){
                        sR.thisCallArgs.callback = sR.defaults.callback;    
                    }
                    var $cells = $(this).children('td, th');
                    $cells.wrapInner('<div class="slideRowUp" />');
                    var currentPadding = $cells.css('padding');
                    $cellContentWrappers = $(this).find('.slideRowUp');
                    $cellContentWrappers.slideUp(sR.thisCallArgs.slideSpeed, sR.thisCallArgs.easing, function(){
                        $(this).parent().animate({ paddingTop: '0px', paddingBottom: '0px' }, {
                            complete: function(){
                                $(this).children('.slideRowUp').replaceWith($(this).children('.slideRowUp').contents());
                                $(this).parent().css({ 'display': 'none' });
                                $(this).css({ 'padding': currentPadding });
                            }
                        });
                    });
                    var wait = setInterval(function(){
                        if($cellContentWrappers.is(':animated') === false){
                            clearInterval(wait);
                            if(typeof sR.thisCallArgs.callback == 'function'){
                                sR.thisCallArgs.callback.call(this);
                            }
                        }
                    }, 100);                                                                                                    
                    return $(this);
                }
              , down: function (arg1, arg2, arg3){
                    if(typeof arg1 == 'object'){
                        for(p in arg1){
                            sR.thisCallArgs.eval(p) = arg1[p];
                        }
                    }else if(typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')){
                        sR.thisCallArgs.slideSpeed = arg1;
                    }else{
                        sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
                    }
    
                    if(typeof arg2 == 'string'){
                        sR.thisCallArgs.easing = arg2;
                    }else if(typeof arg2 == 'function'){
                        sR.thisCallArgs.callback = arg2;
                    }else if(typeof arg2 == 'undefined'){
                        sR.thisCallArgs.easing = sR.defaults.easing;    
                    }
                    if(typeof arg3 == 'function'){
                        sR.thisCallArgs.callback = arg3;
                    }else if(typeof arg3 == 'undefined' && typeof arg2 != 'function'){
                        sR.thisCallArgs.callback = sR.defaults.callback;    
                    }
                    var $cells = $(this).children('td, th');
                    $cells.wrapInner('<div class="slideRowDown" style="display:none;" />');
                    $cellContentWrappers = $cells.find('.slideRowDown');
                    $(this).show();
                    $cellContentWrappers.slideDown(sR.thisCallArgs.slideSpeed, sR.thisCallArgs.easing, function() { $(this).replaceWith( $(this).contents()); });
    
                    var wait = setInterval(function(){
                        if($cellContentWrappers.is(':animated') === false){
                            clearInterval(wait);
                            if(typeof sR.thisCallArgs.callback == 'function'){
                                sR.thisCallArgs.callback.call(this);
                            }
                        }
                    }, 100);
                    return $(this);
                }
            }
        };
    
        $.fn.slideRow = function(method, arg1, arg2, arg3){
            if(typeof method != 'undefined'){
                if(sR.methods[method]){
                    return sR.methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
                }
            }
        };
    })(jQuery);

@circuitry, sunabileceğiniz belirli bir şey var mı veya eleştiriniz yeterli mi?
OregonJeff

@Oregoneff Dürüst olmak gerekirse. Daha basit bir şey arıyorum. Bir tablo satırını kaydırmak için 109 satır kod gerekmemelidir.
devre

@circuitry, hızı, kolaylaştırma ve geri çağrıları özelleştirilebilir bir şekilde kontrol etme yeteneği ile bir eklenti olarak kullanmak (ve sadece kullanıma özel kodun kötü uygulamalarına dahil olmak istemiyorsanız) daha kolay olmaz temeli. Bu, kod kitaplığınıza ekleyeceğiniz ve tablo satırlarını genişletme / daraltma gerektiren herhangi bir uygulama için kullanılabileceğinden , bunun neden 109 kod satırı olduğu konusunda emin değilim.
OregonJeff

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.