테이블 행에서 slideDown (또는 show) 함수를 사용하는 방법은 무엇입니까?


215

테이블에 행을 추가하려고하고 해당 행을보기로 슬라이드하려고하지만 슬라이드 다운 기능은 레이아웃을 엉망으로 만드는 테이블 행에 display : block 스타일을 추가하는 것 같습니다.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

코드는 다음과 같습니다.

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

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

테이블이어야합니까? 내가 생각하는 테이블이 없으면 훨씬 쉬워집니다.
MrChrister

fadeInfadeOut테이블 행에 작업하고 좋은 다른 시각 효과를 만들어 (단지 파이어 폭스에서 테스트)
야만인

답변:


296

테이블 행에서는 애니메이션이 지원되지 않습니다.

Chaffer와 Swedberg의 "Learning jQuery"에서


브라우저는 가시적 인 표시 속성에 대해 다른 값 (테이블 행 및 블록)을 사용하기 때문에 테이블 행은 애니메이션에 특별한 장애물이됩니다. 애니메이션이없는 .hide () 및 .show () 메서드는 항상 테이블 행과 함께 사용하는 것이 안전합니다. jQuery 버전 1.1.3부터 ​​.fadeIn () 및 .fadeOut ()도 사용할 수 있습니다.


td 내용을 div로 감싸고 slideDown을 사용할 수 있습니다. 애니메이션에 추가 마크 업이 필요한지 결정해야합니다.


5
잘 작동합니다! 사소한 문제가 있습니다. 셀 패딩이있을 경우 애니메이션을 적용해야합니다. 그러나 그것은 큰 문제도 아닙니다.
Adrian Grigore

11
다음과 같이 패딩에 애니메이션을 적용 할 수 있습니다.$('tr').find('td').animate({padding: '0px'}, {duration: 200});
Andrew

@Emily : jQuery 소스의 특정 라인을 가리킬 수 있습니까? 내 프로젝트의 소스를 해킹하고 싶습니다.
Randomblue

7
직접적인 대답은 아니지만 대부분의 상황에서 fadeIn / fadeOut을 사용하는 것이 거의 좋으며 테이블 행에서 제대로 작동하는 것으로 나타났습니다.
Phil LaNasa

@PhilLaNasa 처음에 나는 "Nah, 좋아 보이지 않을 것"과 같았지만 시도했지만 정말 좋아 보였다! 여행 주셔서 감사합니다!
Kenton de Jong

157

tr을 동적으로 감싸고 slideUp / 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에 대한 찬사를 지불해야합니다.


감사! 어떻게 든 이것은 나를 위해 일했다 : row.find ( 'td'). wrapInner ( '<div style = "display : none;"/>').parent().prependTo('#MainTable> tbody'). find ( ' td> div '). slideDown ('slow ', function () {var $ set = $ (this); $ set.replaceWith ($ set.contents ());});
pauloya

유일한 문제는 셀 사이에 약간의 지연이 있다는 것입니다.
Archimedes Trajano

41

여기에 필자가 작성한 플러그인이 있습니다. 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

이것이 누군가를 돕기를 바랍니다.


행 그룹을 추가 / 제거하려면 어떻게합니까? 마스터 / 세부 기능을 제공해야합니다
Volatil3

콜백 함수가 즉시 실행됩니다.
저스틴

그것은 단지 명백한 과시입니다. 콜백 기능을 테스트하지는 않았지만 훌륭하게 작동합니다. 언젠가 나는 그것을 역 엔지니어링 할 수있는 충분한 jQuery를 알게 될 것이다.
cartbeforehorse

1
참고 : 대상 행의 내용이 다른 테이블 인 경우 중단되는 것 같습니다. 더 이상 갈 시간이 없지만 내가 찾은 것은 자식 테이블을 축소하고 모든 행을 숨김으로 설정하고 이상한 패딩을 추가 한 다음 slideRow를 호출하면 해당 행을 다시 확장하지 않는다는 것입니다. ('하위').
Chris Porter

1
slideRow ( 'up')를 호출 한 다음 slideRow ( 'down')을 호출 할 때 자식 테이블이 웃기는 다른 사람들과 동일한 문제가 발생했습니다. 플러그인에서 find ( 'td') 메소드가 두 번 사용 되었기 때문이라는 것을 알았습니다. 나는 이것을 아이들 ( 'td')으로 바꾸었고 문제는 즉시 사라졌습니다. 셀에 문제가있는 경우 간단히 children ( 'td') 인스턴스를 children ( 'td, th')로 업데이트하십시오.
OregonJeff

4

행의 내용을 a로 감싸고 <span>선택기를 사용하십시오.$('#detailed_edit_row span'); 하여 약간의 해킹을 있지만 방금 테스트하여 작동합니다. 나는 또한 table-row위 의 제안 을 시도했지만 작동하지 않는 것 같습니다.

업데이트 : 나는이 문제로 놀고 있었고 모든 표시에서 jQuery는 slideDown을 수행하는 객체가 블록 요소가되어야합니다. 따라서 주사위는 없습니다. 셀에서 slideDown을 사용하는 테이블을 구성 할 수 있었고 레이아웃에 전혀 영향을 미치지 않았으므로 설정 방법을 잘 모르겠습니다. 귀하의 유일한 해결책은 해당 셀이 블록이거나 괜찮은 방식으로 테이블을 리팩터링하는 .show();것입니다. 행운을 빕니다.


1
tr 및 td 태그에 애니메이션을 적용 할 수 없습니다. 각 td의 내용을 div로 감싸고 div에 애니메이션을 적용한 다음 tr을 숨기거나 표시해야합니다.<td><div style="display:block">contents</div></td>
Andrew

4

다음과 같이 행의 내용을 선택하십시오.

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

.contents () -텍스트 및 주석 노드를 포함하여 일치하는 요소 세트에서 각 요소의 하위를 가져옵니다.


또한 열과 같은 것을 선택해야합니다 $('tr > td').contents().slideDown(). 열 내부의 모든 내용이 태그로 싸여 있는지 확인하십시오 (예 : <td>Some text</td>작동하지 않음). 이것이 가장 간단한 해결책입니다.
user2233706

3

나는 이것에 대답하는 데 시간이 조금 걸렸지 만 그것을 할 수있는 방법을 찾았습니다 :)

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가 확장됨에 따라 전체 행이 내려갑니다. 그런 다음 테이블 행을 다시 숨기 전에 페이드 백 (그런 다음 시간 초과 효과를 볼 수 있음)하도록 명령하십시오. :)

이것이 누군가를 돕기를 바랍니다!


3

행 클릭시 슬라이드가 보이지 않는 숨겨진 행이있는 테이블을 정리했습니다.


3

중첩 테이블이있는 테이블 행이 있습니다.

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

행 을 아래로 슬라이드 하려면 :

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

참고 : 애니메이션이 시작되기 전에 행과 내용 (여기서는 "table")이 숨겨져 있어야 합니다.


행 을 슬라이드 업 하려면 :

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

두 번째 매개 변수 ( function())는 콜백입니다.


단순한!!

슬라이드 업 / 다운 기능의 매개 변수로 추가 할 수있는 몇 가지 옵션 도 있습니다 (가장 일반적인 기간은 'slow''fast').


실제로 행 사이에 내용을 넣었습니까, 아니면 오타입니까?
Vincent

2

행에서 td 요소를 사용 하여이 문제를 해결했습니다.

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

행 자체에 애니메이션을 적용하면 이상한 동작, 주로 비동기 애니메이션 문제가 발생합니다.

위 코드의 경우 업데이트가 성공했음을 강조하기 위해 테이블에서 끌어서 놓는 행을 강조 표시합니다. 이것이 누군가를 돕기를 바랍니다.


나는지고있다effect is not a function
Savage

2

나는 여기에 제공된 아이디어를 사용했고 몇 가지 문제에 직면했습니다. 나는 그것들을 모두 고쳤고 공유하고 싶은 부드러운 원 라이너를 가지고 있습니다.

$('#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 요소에서 CSS를 사용합니다. 높이를 0px로 줄입니다. 그렇게하면 각 td 요소 내부에서 새로 생성 된 div 래퍼의 내용 높이 만 중요합니다.

슬라이드 업이 느립니다. 더 느리게하면 결함이 생길 수 있습니다. 처음에 작은 점프. 이것은 언급 된 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>

이 게시물은 정확히 2 살입니다. jquery 버전 3.2.0으로 작업했습니다. 오늘 Chrome 73.0.3683.75로 코드를 테스트했으며 작동했습니다.
darkwind

1

나는 전체 몸통을 슬라이드하고 싶고 페이드와 슬라이드 효과를 결합 하여이 문제를 관리했습니다.

3 단계로이 작업을 수행했습니다 (아래로 또는 위로 슬라이드하려는 경우 2 단계 및 3 단계가 교체 됨)

  1. tbody에 높이를 지정하면
  2. 모든 td와 th를 페이딩하고,
  3. 슬라이딩 바디.

slideUp 예 :

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

이것은 특정 행 대신 전체 테이블에 영향을 미치지 않습니까?
Savage

1

나는 다른 모든 솔루션에 문제가 있었지만 버터처럼 부드러운이 간단한 일을 마쳤습니다.

다음과 같이 HTML을 설정하십시오.

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

그런 다음 자바 스크립트를 다음과 같이 설정하십시오.

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

기본적으로 div 안에 "보이지 않는"행을 0px 높이로 만듭니다.
div에서 애니메이션을 사용하고 (행이 아님) 행 높이를 1px로 설정하십시오.

행을 다시 숨기려면 div에서 반대 애니메이션을 사용하고 행 높이를 다시 0px로 설정하십시오.


1

Vinny가 작성한 플러그인이 마음에 들었습니다. 그러나 슬라이딩 행 (tr / td) 내부의 테이블의 경우 중첩 된 테이블의 행은 슬라이딩 된 후에도 항상 숨겨집니다. 그래서 플러그인에서 빠르고 간단한 해킹을 수행하여 중첩 테이블의 행을 숨기지 않았습니다. 다음 줄을 변경하십시오.

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

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

중첩되지 않은 즉각적인 td 만 찾습니다. 이것이 플러그인을 사용하고 중첩 테이블을 가지고있는 누군가를 돕기를 바랍니다.


1

#Vinny의 게시물에 의견을 추가하고 싶지만 담당자가 없으므로 답변을 게시해야합니다 ...

플러그인에서 버그를 발견했습니다. 인수가있는 객체를 전달할 때 다른 인수가 전달되지 않으면 덮어 씁니다. 인수가 처리되는 순서를 변경하면 쉽게 해결할 수 있습니다 (아래 코드). 또한 닫은 후 행을 파기하는 옵션을 추가했습니다 (필요한 경우에만!) : $ ( '# 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);

나는 또한 어린이 및 th 수정 프로그램에 추가 한 것을 잊었습니다
Mark Ball

0

테이블 행을 동시에 슬라이드 및 페이드해야하는 경우 다음을 사용하십시오.

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

다음과 같은 방법을 사용할 수 있습니다.

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

행의 높이 애니메이션을 시작하는 동시에 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;
    }
}

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>

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

});


테이블이 포함 된 div를 표시하거나 숨 깁니다. OP가 요청한 테이블 행이 아닙니다.
shazbot

0

Vinny가 제공하는 플러그는 실제로 가깝지만 몇 가지 작은 문제를 발견하고 수정했습니다.

  1. 숨겨져있는 행의 자식을 넘어서서 td 요소를 탐욕스럽게 목표로 삼았습니다. 그것이 행을 보여줄 때 그 아이들을 찾았다면 이것은 좋았을 것입니다. 가까이 다가 가면 모두 "디스플레이 : 없음"으로 표시되어 숨겨집니다.
  2. 자식 요소를 전혀 타겟팅하지 않았습니다.
  3. 내용이 많은 테이블 셀 (많은 행이있는 중첩 테이블)의 경우 제공된 slideSpeed ​​값에 관계없이 slideRow ( 'up')를 호출하면 패딩 애니메이션이 완료되는 즉시 행보기가 축소됩니다. . 래핑의 slideUp () 메서드가 완료 될 때까지 패딩 애니메이션이 트리거되지 않도록 수정했습니다.

    (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, 당신이 제공 할 수있는 특별한 것이 있습니까, 아니면 당신의 비판이 충분합니까?
OregonJeff

@Oregoneff 그냥 정직합니다. 더 간단한 것을 찾고 있습니다. 테이블 행을 슬라이드하는 데 109 줄의 코드가 필요하지 않습니다.
회로

@circuitry, 속도를 제어하고 완화하고 사용자 정의 가능한 콜백을 할 수있는 기능으로 플러그인으로 사용할 수 있고 (사용 관련 코드의 나쁜 습관에 관여하지 않고) 간단하게 만들 수는 없습니다. 기초. 이것이 코드 라이브러리에 포함되어 있고 확장 / 축소 테이블 행이 필요한 모든 구현에 사용할 수 있기 때문에 109 줄의 코드인지는 확실하지 않습니다.
OregonJeff

0

빠른 / 쉬운 수정 :

JQuery .toggle () 을 사용 하여 Row 또는 Anchor를 클릭 할 때 행을 표시하거나 숨길 수 있습니다.

숨길 행을 식별하기 위해 함수를 작성해야하지만 토글은 찾고있는 기능을 작성합니다.


나는이에서 제안 된 생각 ... 이미 대답
DarkCygnus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.