Làm cách nào để sử dụng chức năng slideDown (hoặc hiển thị) trên một hàng của bảng?


214

Tôi đang cố gắng thêm một hàng vào một bảng và để hàng đó hiển thị, tuy nhiên chức năng trượt dường như đang thêm một màn hình: kiểu khối vào hàng của bảng làm rối bố cục.

Bất kỳ ý tưởng làm thế nào để làm việc xung quanh này?

Đây là mã:

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

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

Nó có phải là một cái bàn không? Tôi nghĩ dễ dàng hơn nhiều nếu không có bảng tôi nghĩ.
MrChrister

fadeInfadeOutlàm việc trên các hàng của bảng và tạo hiệu ứng hình ảnh thay thế đẹp mắt (chỉ được thử nghiệm trên Firefox)
Savage

Câu trả lời:


295

Ảnh động không được hỗ trợ trên các hàng của bảng.

Từ "Học jQuery" của Chaffer và Swedberg


Các hàng trong bảng thể hiện các trở ngại cụ thể đối với hoạt hình, vì các trình duyệt sử dụng các giá trị khác nhau (hàng và bảng) cho thuộc tính hiển thị hiển thị của chúng. Các phương thức. Leather () và .show (), không có hình động, luôn an toàn để sử dụng với các hàng của bảng. Kể từ phiên bản jQuery 1.1.3, .fadeIn () và .fadeOut () cũng có thể được sử dụng.


Bạn có thể bọc nội dung td của mình trong div và sử dụng slideDown trên đó. Bạn cần phải quyết định xem hoạt hình có đáng để đánh dấu thêm hay không.


5
Hoạt động tuyệt vời! Có một vấn đề nhỏ khác: Bạn cũng sẽ phải làm động phần đệm của ô nếu có. Nhưng đó cũng không phải là một vấn đề lớn.
Adrian Grigore

11
Bạn có thể làm động phần đệm như thế này:$('tr').find('td').animate({padding: '0px'}, {duration: 200});
Andrew

@Emily: Bạn có thể vui lòng chỉ đến các dòng cụ thể của nguồn jQuery không? Tôi muốn hack nguồn cho dự án của tôi.
Randomblue

7
Không phải là một câu trả lời trực tiếp, nhưng tôi đã thấy rằng sử dụng fadeIn / fadeOut gần như là tốt trong hầu hết các tình huống và nó dường như hoạt động tốt trên các hàng của bảng.
Phil LaNasa

@PhilLaNasa Lúc đầu, tôi giống như "Nah, điều đó sẽ không tốt" nhưng sau đó tôi đã thử nó và nó trông thực sự tốt! Cảm ơn chuyến đi!
Kenton de Jong

157

Tôi chỉ đơn giản là bọc tr một cách linh hoạt sau đó loại bỏ nó sau khi slideUp / slideDown hoàn thành. Đó là một chi phí khá nhỏ khi thêm và xóa một hoặc một vài thẻ và sau đó xóa chúng sau khi hoạt ảnh hoàn tất, tôi không thấy bất kỳ độ trễ có thể nhìn thấy nào cả.

SlideUp :

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

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

 });

Trượt xuống:

$('#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());

 });

Tôi phải vinh danh fletchzone.com khi tôi lấy plugin của anh ấy và gỡ nó trở lại phần trên, chúc mừng người bạn đời.


Cảm ơn! Bằng cách nào đó, điều này làm việc cho tôi: row.find ('td'). WrapInner ('<div style = "display: none;" />').parent().prependTo('#MainTable> tbody'). Find (' td> div '). slideDown (' chậm ', function () {var $ set = $ (this); $ set.replaceWith ($ set.contents ());});
pauloya

Vấn đề duy nhất là có một chút chậm trễ giữa các ô.
Archimedes Trajano

41

Đây là một plugin mà tôi đã viết cho nó, nó cần một chút từ triển khai của Fletch, nhưng của tôi chỉ được sử dụng để trượt một hàng lên hoặc xuống (không chèn các hàng).

(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);

Cách sử dụng cơ bản:

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

Vượt qua các tùy chọn slide dưới dạng đối số riêng lẻ:

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

Về cơ bản, đối với hoạt hình trượt xuống, trình cắm thêm bao bọc nội dung của các ô trong DIV, tạo hiệu ứng cho các ô đó, sau đó loại bỏ chúng và ngược lại để trượt lên (với một số bước bổ sung để thoát khỏi phần đệm của ô). Nó cũng trả về đối tượng mà bạn đã gọi nó, vì vậy bạn có thể xâu chuỗi các phương thức như vậy:

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

Hy vọng điều này sẽ giúp được ai đó.


Nếu tôi muốn thêm / xóa một nhóm Hàng thì sao? Tôi cần cung cấp chức năng Chính / Chi tiết
Volatil3

Chức năng gọi lại đang kích hoạt ngay lập tức cho tôi.
Justin

Đó chỉ đơn giản là thể hiện. Hoạt động tuyệt vời mặc dù (mặc dù chưa thử nghiệm chức năng gọi lại). Một ngày nào đó tôi sẽ biết đủ jQuery để có thể thiết kế ngược lại.
cartb Beforehorse

1
FYI: Điều này dường như bị phá vỡ nếu nội dung của hàng mục tiêu là một bảng khác. Tôi không có thời gian để đi xa hơn nhưng điều tôi đã tìm thấy là nó thu gọn bảng con, đặt tất cả các hàng thành ẩn, thêm một số phần đệm lạ và sau đó nó sẽ không mở rộng lại các hàng đó khi bạn gọi slideRow ('xuống').
Chris Porter

1
Tôi gặp vấn đề tương tự như các vấn đề khác với các bảng con hoạt động buồn cười khi gọi slideRow ('lên') và sau đó là slideRow ('xuống'). Tôi phát hiện ra rằng đó là do phương thức find ('td') được sử dụng hai lần trong plugin. Tôi đã thay đổi điều này thành trẻ em ('td') và các vấn đề ngay lập tức biến mất. Đối với các sự cố với các ô thứ, chỉ cần cập nhật cả hai trường hợp của trẻ em ('td') cho trẻ em ('td, th').
OregonJeff

4

Bạn có thể thử gói nội dung của hàng trong một <span>và có bộ chọn của bạn $('#detailed_edit_row span');- một chút hackish, nhưng tôi chỉ thử nó và nó hoạt động. Tôi cũng đã thử table-rowgợi ý ở trên và nó dường như không hoạt động.

cập nhật : Tôi đã giải quyết vấn đề này và từ tất cả các chỉ dẫn jQuery cần đối tượng mà nó thực hiện slideDown trở thành một phần tử khối. Vì vậy, không có xúc xắc. Tôi đã có thể tạo ra một bảng nơi tôi đã sử dụng slideDown trên một ô và nó hoàn toàn không ảnh hưởng đến bố cục, vì vậy tôi không chắc cách thức của bạn được thiết lập. Tôi nghĩ giải pháp duy nhất của bạn là cấu trúc lại bảng theo cách sao cho tế bào đó là một khối, hoặc chỉ .show();là thứ chết tiệt. Chúc may mắn.


1
Bạn không thể làm động các thẻ tr và td. Bạn phải bọc nội dung của mỗi td bằng một div, sau đó làm động các div, sau đó ẩn / hiển thị tr:<td><div style="display:block">contents</div></td>
Andrew

4

Chọn nội dung của hàng như thế này:

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

.contents () - Nhận phần tử con của từng phần tử trong tập hợp các phần tử khớp, bao gồm các nút văn bản và nút nhận xét.


Bạn cũng phải chọn cột là tốt, vì vậy một cái gì đó như thế $('tr > td').contents().slideDown(). Đảm bảo rằng tất cả nội dung bên trong cột được bọc trong một thẻ, nghĩa là <td>Some text</td>không hoạt động. Đây là giải pháp đơn giản nhất.
dùng2233706

3

Tôi hơi chậm trễ trong việc trả lời điều này, nhưng tôi đã tìm ra cách để làm điều đó :)

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);
    }
}

Tôi chỉ đặt một phần tử div bên trong các thẻ dữ liệu bảng. khi nó được đặt hiển thị, khi div mở rộng, toàn bộ hàng đi xuống. sau đó bảo nó mờ dần lên (sau đó hết thời gian để bạn thấy hiệu ứng) trước khi ẩn hàng bảng một lần nữa :)

Hy vọng điều này sẽ giúp được ai đó!


3

Tôi đã chọn một bảng có các hàng ẩn trượt vào và ra khỏi chế độ xem khi nhấp vào hàng.


3

Có một hàng bàn với bảng lồng nhau:

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

Để trượtDown hàng:

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

Lưu ý: hàng và nội dung của nó (đây là "table") cả hai nên được ẩn trước khi bắt đầu hoạt hình.


Để trượt Cập nhật hàng:

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

Tham số thứ hai ( function()) là một cuộc gọi lại.


Đơn giản!!

Lưu ý rằng cũng có một số tùy chọn có thể được thêm dưới dạng tham số của các chức năng trượt lên / xuống (phổ biến nhất là thời lượng 'slow''fast').


Bạn đã thực sự đặt nội dung của bạn giữa các hàng của bạn, hoặc đó là một lỗi đánh máy?
Vincent

2

Tôi đã khắc phục điều này bằng cách sử dụng các yếu tố td trong hàng:

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

Hoạt hình hàng tự nó gây ra hành vi lạ, chủ yếu là các vấn đề hoạt hình không đồng bộ.

Đối với đoạn mã trên, tôi nhấn mạnh một hàng được kéo và thả xung quanh trong bảng để làm nổi bật rằng bản cập nhật đã thành công. Hy vọng điều này sẽ giúp được ai đó.


Tôi đang nhận đượceffect is not a function
Savage

2

Tôi đã sử dụng những ý tưởng được cung cấp ở đây và phải đối mặt với một số vấn đề. Tôi đã sửa tất cả chúng và có một lớp lót trơn tru mà tôi muốn chia sẻ.

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

Nó sử dụng css trên phần tử td. Nó giảm chiều cao xuống 0px. Bằng cách đó, chỉ có chiều cao của nội dung của trình bao bọc div mới được tạo bên trong mỗi phần tử td mới là vấn đề.

SlideUp chậm. Nếu bạn làm cho nó chậm hơn nữa, bạn có thể nhận ra một số trục trặc. Một bước nhảy nhỏ khi bắt đầu. Điều này là do các thiết lập css đã đề cập. Nhưng không có các cài đặt đó, hàng sẽ không giảm chiều cao. Chỉ nội dung của nó sẽ.

Cuối cùng, phần tử tr được loại bỏ.

Toàn bộ dòng chỉ chứa JQuery và không có Javascript gốc.

Hy vọng nó giúp.

Đây là một mã ví dụ:

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

Bài này chính xác là hai tuổi. Tôi đã làm việc với phiên bản jquery 3.2.0. Tôi đã kiểm tra mã ngày hôm nay với Chrome 73.0.3683.75 và nó đã hoạt động.
bóng tối

1

Tôi muốn trượt toàn bộ tbody và tôi đã quản lý vấn đề này bằng cách kết hợp các hiệu ứng mờ dần và trượt.

Tôi đã thực hiện việc này trong 3 giai đoạn (bước thứ 2 và 3 được thay thế trong trường hợp bạn muốn trượt xuống hoặc lên)

  1. Gán chiều cao cho tbody,
  2. Làm mờ tất cả td và th,
  3. Trượt tbody.

Ví dụ về slideUp:

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

Điều này không ảnh hưởng đến toàn bộ bảng, thay vì chỉ một hàng cụ thể?
Savage

1

Tôi gặp vấn đề với tất cả các giải pháp khác được đưa ra nhưng cuối cùng lại làm điều đơn giản mà trơn tru như bơ.

Thiết lập HTML của bạn như vậy:

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

Sau đó, thiết lập javascript của bạn như vậy:

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";   
  } 
}

Về cơ bản, làm cho hàng "vô hình" cao 0px, bên trong có div.
Sử dụng hình ảnh động trên div (không phải hàng) và sau đó đặt chiều cao của hàng thành 1px.

Để ẩn hàng một lần nữa, sử dụng hình động ngược lại trên div và đặt chiều cao của hàng trở về 0px.


1

Tôi thích plugin mà Vinny đã viết và đang sử dụng. Nhưng trong trường hợp các bảng bên trong hàng trượt (tr / td), các hàng của bảng lồng nhau luôn bị ẩn ngay cả sau khi trượt lên. Vì vậy, tôi đã thực hiện một cách nhanh chóng và đơn giản trong plugin để không ẩn các hàng của bảng lồng nhau. Chỉ cần thay đổi dòng sau

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

đến

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

trong đó chỉ tìm thấy tds ngay lập tức không lồng nhau. Hy vọng điều này sẽ giúp ai đó sử dụng plugin và có các bảng lồng nhau.


1

Tôi muốn thêm nhận xét vào bài đăng của # Vinny nhưng không có đại diện nên phải đăng câu trả lời ...

Đã tìm thấy một lỗi với plugin của bạn - khi bạn chỉ truyền một đối tượng bằng các đối số mà chúng bị ghi đè nếu không có đối số nào khác được truyền vào. Dễ dàng giải quyết bằng cách thay đổi thứ tự các đối số được xử lý, mã bên dưới. Tôi cũng đã thêm một tùy chọn để hủy hàng sau khi đóng (chỉ khi tôi có nhu cầu về nó!): $ ('# Row_id'). SlideRow ('up', true); // phá hủy hàng

(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);

Quên đề cập đến Tôi cũng đã thêm vào các bản sửa lỗi dành cho trẻ em
Mark Ball

0

Nếu bạn cần trượt và làm mờ một hàng của bảng cùng một lúc, hãy thử sử dụng các cách sau:

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());
  });
}

bạn có thể sử dụng các phương pháp này như:

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

Tôi có thể hoàn thành nếu bạn đặt td's trong hàng để hiển thị không cùng lúc bạn bắt đầu tạo hiệu ứng chiều cao trên hàng

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

Mã này hoạt động!

<!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();
    }
});

});


Điều này cho thấy & ẩn một div chứa một bảng. Không phải là một hàng bàn như OP yêu cầu.
shazbot

0

Ổ cắm được cung cấp bởi Vinny thực sự rất gần, nhưng tôi đã tìm thấy và khắc phục một số vấn đề nhỏ.

  1. Nó tham lam nhắm mục tiêu các yếu tố td vượt ra ngoài những đứa trẻ của hàng bị ẩn. Điều này sẽ khá ổn nếu sau đó họ đã tìm ra những đứa trẻ đó khi hiển thị hàng. Trong khi nó đã gần, tất cả họ đã kết thúc với "display: none" trên chúng, khiến chúng bị ẩn đi.
  2. Nó hoàn toàn không nhắm mục tiêu vào các yếu tố con.
  3. Đối với các ô của bảng có nhiều nội dung (như bảng được lồng với nhiều hàng), gọi slideRow ('lên'), bất kể giá trị slideSpeed ​​được cung cấp, nó sẽ thu gọn chế độ xem của hàng ngay khi hoạt ảnh đệm được thực hiện . Tôi đã sửa nó để hoạt ảnh đệm không kích hoạt cho đến khi phương thức slideUp () trên gói được thực hiện.

    (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, bạn đã có một cái gì đó cụ thể để cung cấp hoặc chỉ trích của bạn là đủ?
OregonJeff

@Oregoneff Chỉ cần trung thực. Tôi đang tìm kiếm một cái gì đó đơn giản hơn. Không nên lấy 109 dòng mã để trượt một hàng của bảng.
mạch

@circuitry, sẽ không đơn giản hơn nếu bạn muốn có thể sử dụng như một plugin (và không chỉ tham gia vào thực tiễn xấu của mã sử dụng cụ thể) với khả năng kiểm soát tốc độ, giảm bớt và có các cuộc gọi lại tùy chỉnh nền tảng. Vì đây là thứ bạn đưa vào thư viện mã của mình và có thể được sử dụng cho bất kỳ triển khai nào yêu cầu mở rộng / thu gọn các hàng của bảng, tôi không chắc tại sao vấn đề đó lại là 109 dòng mã.
OregonJeff

0

Khắc phục nhanh / dễ dàng:

Sử dụng JQuery .toggle () để hiển thị / ẩn các hàng onclick của Row hoặc Anchor.

Một hàm sẽ cần phải được viết để xác định các hàng bạn muốn ẩn, nhưng việc chuyển đổi sẽ tạo ra chức năng bạn đang tìm kiếm.


Tôi nghĩ rằng điều này đã được đề xuất trong câu trả lời này rồi ...
DarkCygnus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.