Как использовать функцию слайд-вниз (или показ) в строке таблицы?

StackOverflow https://stackoverflow.com/questions/467336

Вопрос

Я пытаюсь добавить строку в таблицу и отобразить эту строку в поле зрения, однако функция слайдинга, похоже, добавляет стиль отображения: блок к строке таблицы, что портит макет.

Есть идеи, как обойти это?

Вот код:

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

  function (data) {
    var row = $('#detailed_edit_row');
    row.hide();
    row.html(data);
    row.slideDown(1000);
  }
);
Это было полезно?

Решение

Анимации не поддерживаются в строках таблицы.

Из " Изучение jQuery " Чеффером и Сведбергом

<Ч>
  

Строки таблицы представляют конкретные   препятствия для анимации, так как браузеры   использовать разные значения (таблица-строка и   блок) для их видимого отображения   имущество. .Hide () и .show ()   методы без анимации всегда   безопасно использовать со строками таблицы. По состоянию на   jQuery версии 1.1.3, .fadeIn () и   Также можно использовать .fadeOut ().

<Ч>

Вы можете обернуть свое содержимое td в div и использовать слайддон на этом. Вам нужно решить, стоит ли анимация дополнительной разметки.

Другие советы

Я просто динамически оборачиваю tr, а затем удаляю его после завершения слайда Up/slideDown.Это довольно небольшие накладные расходы: добавление и удаление одного или нескольких тегов, а затем их удаление после завершения анимации, я вообще не вижу видимой задержки при этом.

Скользить вверх:

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

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

 });

Скользить вниз:

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

 });

Я должен отдать должное fletchzone.com, поскольку я взял его плагин и вернул его к вышеуказанному, ура, приятель.

Вот плагин, который я написал для этого, он берет немного от реализации Fletch, но мой используется исключительно для перемещения строки вверх или вниз (без вставки строк).

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

Основное использование:

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

Передайте параметры слайда в качестве отдельных аргументов.

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

По сути, для анимации скольжения плагин оборачивает содержимое ячеек в DIV, анимирует их, затем удаляет их, и наоборот для слайда вверх (с некоторыми дополнительными шагами, чтобы избавиться от заполнения ячеек ). Он также возвращает объект, с которым вы его вызвали, поэтому вы можете связать методы следующим образом:

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

Надеюсь, это кому-нибудь поможет.

Вы можете попробовать обернуть содержимое строки в <span> и сделать так, чтобы ваш селектор был $('#detailed_edit_row span'); - немного хакерским, но я только что проверил его, и он работает. Я также попробовал приведенное выше предложение table-row, но оно не сработало.

update : я поиграл с этой проблемой, и, судя по всему, jQuery нужен объект, для которого он выполняет slideDown, чтобы быть элементом блока. Так что, без игры в кости. Мне удалось создать таблицу, в которой я использовал slideDown для ячейки, и это никак не повлияло на макет, поэтому я не уверен, как настроена ваша. Я думаю, что ваше единственное решение состоит в том, чтобы реорганизовать таблицу таким образом, чтобы все было в порядке, когда эта ячейка является блоком или просто .show(); проклятой вещью. Удачи.

Выберите содержимое строки следующим образом:

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

.contents () - Получите дочерние элементы каждого элемента в наборе соответствующих элементов, включая узлы текста и комментариев.

Я немного отстал от ответа на этот вопрос, но я нашел способ сделать это:)

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

Я просто поместил элемент div в теги данных таблицы. когда он становится видимым, когда div расширяется, весь ряд опускается. затем скажите ему, чтобы он постепенно уменьшался (затем тайм-аут, чтобы вы увидели эффект), прежде чем снова скрывать строку таблицы:)

Надеюсь, это кому-нибудь поможет!

Я новичок в этом сообществе.Пожалуйста, оцените мой ответ.:)

Вы можете обнаружить, что этот работает нормально.

У меня есть стол(<table style='display: none;'></table>)

внутри <tr class='dummyRow' style='display: none;'><td></td></tr> содержание.

Чтобы спуститься вниз по строке...

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

Примечание:строка и содержимое внутри строки (вот оно table) оба должны быть скрыты до начала анимации.

Чтобы сдвинуть строку вверх.

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

второй параметр (функция) — обратный вызов.

Простой!!

Я справился с этим, используя элементы td в строке:

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

Анимация самой строки вызывает странное поведение, в основном проблемы с асинхронной анимацией.

В приведенном выше коде я выделил строку, которая перетаскивается в таблицу, чтобы подчеркнуть, что обновление прошло успешно. Надеюсь, это кому-нибудь поможет.

Мне нужна была таблица со скрытыми строками, которые появлялись и исчезали из поля зрения при щелчке по строке.

$('.tr-show-sub').click(function(e) {  
    var elOne = $(this);
    $('.tr-show-sub').each(function(key, value) {
        var elTwoe = $(this);
        
        if(elOne.get(0) !== elTwoe.get(0)) {
            if($(this).next('.tr-sub').hasClass('tr-sub-shown')) {
                elTwoe.next('.tr-sub').removeClass('tr-sub-shown');
                elTwoe.next('tr').find('td').find('div').slideUp();
                elTwoe.next('tr').find('td').slideUp();
            }
        }
        
        if(elOne.get(0) === elTwoe.get(0)) {
            if(elOne.next('.tr-sub').hasClass('tr-sub-shown')) {
                elOne.next('.tr-sub').removeClass('tr-sub-shown');
                elOne.next('tr').find('td').find('div').slideUp();
                elOne.next('tr').find('td').slideUp();
            } else {
                elOne.next('.tr-sub').addClass('tr-sub-shown');
                elOne.next('tr').find('td').slideDown();
                elOne.next('tr').find('td').find('div').slideDown();
            }
        }
    })
});
body {
        background: #eee;
    }
    
    .wrapper {
        margin: auto;
        width: 50%;
        padding: 10px;
        margin-top: 10%;
    }
    
    table {
        background: white;
        width: 100%;
    }
    
    table th {
        background: gray;
        text-align: left;
    }
    
    table th, td {
        border-bottom: 1px solid lightgray;
        padding: 5px;
    }
    
    table .tr-show-sub {
        background: #EAEAEA;
        cursor: pointer;
    }

    table .tr-sub td {
        display: none;
    }
    
    table .tr-sub td .div-sub {
        display: none;
    }
<script src="https://code.jquery.com/jquery-3.2.1.js"></script>
<div class="wrapper">
    <table cellspacing="0" cellpadding="3">
        <thead>
            <tr class="table">
                <th>col 1</th>
                <th>col 2</th>
                <th>col 3</th>
            </tr>
        </thead>
        <tbody>
            <tr class="tr-show-sub">
                <td>col 1</td>
                <td>col 2</td>
                <td>col 3</td>
            </tr>
            <tr class="tr-sub">
                <td colspan="5"><div class="div-sub">
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor tortor sit amet sem tempus rhoncus. Etiam scelerisque ligula id ligula congue semper interdum in neque. Vestibulum condimentum id nibh ac pretium. Proin a dapibus nibh. Suspendisse quis elit volutpat, aliquet nisi et, rhoncus quam. Quisque nec ex quis diam tristique hendrerit. Nullam sagittis metus sem, placerat scelerisque dolor congue eu. Pellentesque ultricies purus turpis, convallis congue felis iaculis sed. Cras semper elementum nibh at semper. Suspendisse libero augue, auctor facilisis tincidunt eget, suscipit eu ligula. Nam in diam at ex facilisis tincidunt. Fusce erat enim, placerat ac massa facilisis, tempus aliquet metus. Fusce placerat nulla sed tristique tincidunt. Duis vulputate vestibulum libero, nec lobortis elit ornare vel. Mauris imperdiet nulla non suscipit cursus. Sed sed dui ac elit rutrum mollis sed sit amet lorem. 
                </div></td>
            </tr>
            <tr class="tr-show-sub">
                <td>col 1</td>
                <td>col 2</td>
                <td>col 3</td>
            </tr>
            <tr class="tr-sub">
                <td colspan="5"><div class="div-sub">
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor tortor sit amet sem tempus rhoncus. Etiam scelerisque ligula id ligula congue semper interdum in neque. Vestibulum condimentum id nibh ac pretium. Proin a dapibus nibh. Suspendisse quis elit volutpat, aliquet nisi et, rhoncus quam. Quisque nec ex quis diam tristique hendrerit. Nullam sagittis metus sem, placerat scelerisque dolor congue eu. Pellentesque ultricies purus turpis, convallis congue felis iaculis sed. Cras semper elementum nibh at semper. Suspendisse libero augue, auctor facilisis tincidunt eget, suscipit eu ligula. Nam in diam at ex facilisis tincidunt. Fusce erat enim, placerat ac massa facilisis, tempus aliquet metus. Fusce placerat nulla sed tristique tincidunt. Duis vulputate vestibulum libero, nec lobortis elit ornare vel. Mauris imperdiet nulla non suscipit cursus. Sed sed dui ac elit rutrum mollis sed sit amet lorem. 
                </div></td>
            </tr>
            <tr>
                <td>col 1</td>
                <td>col 2</td>
                <td>col 3</td>
            </tr>
        </tbody>
    </table>
</div>

Я использовал представленные здесь идеи и столкнулся с некоторыми проблемами. Я исправил их все и получил плавную однострочку, которой хотел бы поделиться.

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

Использует CSS для элемента td. Уменьшает высоту до 0px. Таким образом, имеет значение только высота содержимого вновь созданной div-оболочки внутри каждого элемента td.

слайд медленно включается. Если вы сделаете это еще медленнее, вы можете заметить некоторый сбой. Небольшой прыжок в начале. Это из-за упомянутой настройки CSS. Но без этих настроек высота строки не уменьшится. Только его содержание.

В конце элемент tr удаляется.

Вся строка содержит только JQuery и не содержит собственного Javascript.

Надеюсь, это поможет.

Вот пример кода:

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

Я хочу скользить по всему телу, и я справился с этой проблемой, комбинируя эффекты затухания и скольжения.

Я сделал это в 3 этапа (2-й и 3-й этапы заменяются на случай, если вы захотите скользить вниз или вверх)

<Ол>
  • Назначение высоты для тела,
  • Исчезают все тд и т,
  • Скользящее тело.
  • Пример slideUp:

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

    У меня были проблемы со всеми другими предлагаемыми решениями, но в итоге я выполнил эту простую вещь, гладкую, как масло.

    Настройте свой HTML следующим образом:

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

    Затем настройте свой JavaScript следующим образом:

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

    По сути, сделайте & невидимым " высота строки 0px, внутри div.
    Используйте анимацию в div (не в строке), а затем установите высоту строки в 1px.

    Чтобы снова скрыть строку, используйте противоположную анимацию на элементе div и установите для высоты строки значение 0px.

    Мне понравился плагин, который написал и использовал Винни.Но в случае таблиц внутри скользящей строки (tr/td) строки вложенной таблицы всегда скрыты даже после сдвига вверх.Поэтому я быстро и просто взломал плагин, чтобы не скрывать строки вложенной таблицы.Просто измените следующую строку

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

    к

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

    который находит только непосредственные td, а не вложенные.Надеюсь, это поможет кому-то использовать плагин и иметь вложенные таблицы.

    Я хотел бы добавить комментарий к сообщению # Винни, но у меня нет представителя, поэтому нужно публиковать ответ ...

    Обнаружена ошибка в вашем плагине - когда вы просто передаете объект с аргументами, они перезаписываются, если никакие другие аргументы не передаются. Легко решаются путем изменения порядка обработки аргументов, код приведен ниже. Я также добавил опцию для уничтожения строки после закрытия (только потому, что мне это было нужно!): $ ('# Row_id'). SlideRow ('up', true); // уничтожаем строку

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

    Если вам нужно одновременно скользить и исчезать в строке таблицы, попробуйте использовать это:

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

    вы можете использовать эти методы как:

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

    Я могу это сделать, если вы установите в строке td, чтобы они не отображались ни в одно и то же время, когда вы начинаете анимировать высоту в строке

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

    Этот код работает!

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

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

    });

    Вилка, предлагаемая Винни, Действительно близко, но я нашел и исправил пару небольших проблем.

    1. Он жадно нацеливался на элементы td, помимо дочерних элементов скрытой строки.Это было бы нормально, если бы затем при показе ряда он находил этих детей.Пока это было близко, все они закончили с «display:none» на них, делая их скрытыми.
    2. Он вообще не нацелен на дочерние элементы.
    3. Для ячеек таблицы с большим количеством содержимого (например, вложенной таблицы с большим количеством строк) вызов слайдаRow('up'), независимо от предоставленного значения слайдаSpeed, приведет к сворачиванию представления строки, как только будет выполнена анимация заполнения. .Я исправил это, чтобы анимация заполнения не запускалась до тех пор, пока не будет выполнен метод слайдUp() в обертке.

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

    Быстрое / простое исправление:

    Используйте JQuery .toggle () , чтобы показать / скрыть строки по щелчку строки или строки. Якорь.

    Необходимо будет написать функцию, чтобы определить строки, которые вы хотели бы скрыть, но переключение создает нужную вам функцию.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top