jQuery DataTables:コントロールテーブルの幅


98

jQuery DataTablesプラグインを使用してテーブルの幅を制御することに問題があります。テーブルはコンテナの幅の100%であると想定されていますが、最終的にはコンテナの幅よりも任意の幅になります。

提案を高く評価

テーブル宣言は次のようになります

<table id="querytableDatasets" class="display" cellspacing="0"
cellpadding="3"     width="100%">

そして、javascript

jQuery('#tab-datasets').load('/cgi-bin/qryDatasets', '', function (){  
    jQuery('#querytableDatasets').dataTable({  
        "bPaginate": false,  
        "bInfo": false,  
        "bFilter": false  
    });  
});  `  

FirebugでHTMLを調べると、これが表示されます(追加されたstyle = "width:0px;"に注意してください)

<table id="querytableDatasets" class="display" cellspacing="0" 
cellpadding="3" width="100%" style="width: 0px;">

Firebugでスタイルを確認すると、table.displayスタイルがオーバーライドされています。これがどこから来ているのかわかりません

element.style {  
  width:0;}    

-- dataTables.css (line 84
table.display { 
  margin:0 auto;  
  width:100%;  
}  

参考までに、IE8で列が正しく調整されない問題が発生しました。原因は、max-widthプロパティが設定された画像でした。見かけ上のIE8は、画像が画面上で適切なサイズに設定されていたとしても、そのプロパティはあまり好きではなく、データテーブルに関しては無視されていました。それを変更してwidth問題を修正しました。
ジョンブブリスキー

回答:


61

この問題は、dataTableが幅を計算する必要があるために発生します。ただし、タブ内で使用すると表示されないため、幅を計算できません。解決策は、タブが表示されたときに「fnAdjustColumnSizing」を呼び出すことです。

前文

この例は、スクロール機能を備えたDataTablesをjQuery UIタブ(または、初期化時にテーブルが非表示(display:none)要素に含まれる他のメソッド)と一緒に使用する方法を示しています。これが特別な考慮を必要とする理由は、DataTablesが初期化され、それが非表示要素内にある場合、ブラウザーにはDataTablesを提供するための測定値がないため、スクロールが有効になっているときに列の不整合が必要になるためです。

これを回避する方法は、fnAdjustColumnSizing API関数を呼び出すことです。この関数は、現在のデータに基づいて必要な列幅を計算してから、テーブルを再描画します。これは、テーブルが初めて表示されるときに正確に必要なものです。これには、jQuery UIテーブルによって提供される「show」メソッドを使用します。DataTableが作成されたかどうかを確認します( 'div.dataTables_scrollBody'の追加セレクターに注意してください。これはDataTableが初期化されるときに追加されます)。テーブルが初期化されている場合は、サイズを変更します。テーブルの最初の表示のみのサイズ変更に最適化を追加できます。

初期化コード

$(document).ready(function() {
    $("#tabs").tabs( {
        "show": function(event, ui) {
            var oTable = $('div.dataTables_scrollBody>table.display', ui.panel).dataTable();
            if ( oTable.length > 0 ) {
                oTable.fnAdjustColumnSizing();
            }
        }
    } );

    $('table.display').dataTable( {
        "sScrollY": "200px",
        "bScrollCollapse": true,
        "bPaginate": false,
        "bJQueryUI": true,
        "aoColumnDefs": [
            { "sWidth": "10%", "aTargets": [ -1 ] }
        ]
    } );
} );

詳しくはこちらをご覧ください。


1
@John McCでも同じ問題がありますが、データテーブルをモーダルに適用しました。ブートストラップを使用していますが、この問題で行き詰まりました。タブの代わりにブートストラップモーダルを使用して実装する方法を知っていますか? .i本当に助けが必要
cfz

私はを使用することをお勧めしますwindow.resize、例を見てくださいlegacy.datatables.net/ref#fnAdjustColumnSizing
KingRider

"aoColumnDefs":[{"sWidth": "10%"、 "aTargets":[-1]}]。これを追加するだけで問題が解決します。ありがとうございます。
Mina chen

55

あなたはDataTableのを初期化するときに、2つの変数を微調整したいと思う:bAutoWidthaoColumns.sWidth

幅が50px、100、120px、30pxの4つの列があるとすると、次のようになります。

jQuery('#querytableDatasets').dataTable({  
        "bPaginate": false,  
        "bInfo": false,  
        "bFilter": false,
        "bAutoWidth": false,
        "aoColumns" : [
            { sWidth: '50px' },
            { sWidth: '100px' },
            { sWidth: '120px' },
            { sWidth: '30px' }
        ]  
    }); 

dataTablesの初期化の詳細については、http: //datatables.net/usageを参照してください。

このwidhtsの設定と適用するCSSの相互作用に注意してください。これを試す前に既存のCSSにコメントして、どれだけ近づいているかを確認することができます。


うーん。これは、bAutoWidth:trueが列幅に対して特にインテリジェントな選択を行わなかった結果であるということです。
ジョンマック

これが私の考えです。データの長さが一貫していない場合、テーブルが跳ね返ります。これが、aoColumnsパラメータとbAutoWidthパラメータを設定した理由です。
artlung 2009年

1
綺麗な。私の問題を完全に修正しました。
ラグナ

素晴らしい@ラグーナ!このような古い答えが役立つものであると聞いて大好きです。
artlung 2012年

1
"bAutoWidth":falseが機能します。しかし、ただの質問です。<th>タグに幅の詳細を配置するのは良い習慣ですか?
finnTheHumin 2013年

52
jQuery('#querytableDatasets').dataTable({  
        "bAutoWidth": false
});

2
これは私にとって正しい答えでした。私はブーストラップ.table-sensitiveを使用しています。データテーブルコードを設定すると、独自の幅になり、邪魔になります。
mac10688 2015年

ここに来て、タブ変更イベントで幅プロパティを削除することを含むこの愚かな問題への私の解決策を投稿しましたが、これで修正されたようです。ありがとう。+1
トファー

最初の2つのタブに3つのタブとデータテーブルがあり、2番目のタブのテーブルは全幅ではありませんでした。これで問題が解決しました。ありがとう
マイクボルマー

47

ええと、私はそのプラグインに精通していませんが、データテーブルを追加した後でスタイルをリセットできますか?何かのようなもの

$("#querydatatablesets").css("width","100%")

.dataTable呼び出しの後?


1
ここを参照してください-任意の列が見えなくなったとき、私の場合には、表には、100pxに幅に設定されていたので、私は、これが最善の解決策であることが判明しているだけでなく:datatables.net/forums/discussion/3417/...を
mydoghasworms

これは私のために働いたソリューションです。oTable.fnAdjustColumnSizing();と比較して、データテーブルのcssをより細かく制御できます。前述のソリューション。
Vijay Rumao 2015

11

データテーブルの列幅に多くの問題がありました。私のための魔法の修正はラインを含んでいました

table-layout: fixed;

このcssは、テーブルの全体的なcssと一致します。たとえば、次のようにデータテーブルを宣言したとします。

LoadTable = $('#LoadTable').dataTable.....

その後、魔法のCSS行はクラスLoadtableに入ります

#Loadtable {
margin: 0 auto;
clear: both;
width: 100%;
table-layout: fixed;

}


2
これは役立ちますが、今私の列はすべて奇妙なサイズです。ほとんどのデータを含む列が最大のパーセンテージ幅になると予想していました。
cjbarth 2013年

7

これはjQdataTableのバグの結果であるため、TokenMacGuysソリューションが最適に機能します。$( '#sometabe')。dataTable()。fnDestroy()を使用すると、テーブルの幅が100%ではなく100pxに設定されます。ここに簡単な修正があります:

$('#credentials-table').dataTable({
        "bJQueryUI": false,
        "bAutoWidth": false,
        "bDestroy": true,
        "bPaginate": false,
        "bFilter": false,
        "bInfo": false,
    "aoColumns": [
           { "sWidth": "140px" },
           { "sWidth": "300px" },
           { "sWidth": "50px" }       
        ],
        "fnInitComplete": function() {

            $("#credentials-table").css("width","100%");
        }

    });

6

このcssクラスをページに追加すると、問題が修正されます。

#<your_table_id> {
    width: inherit !important;
}

1
私は過去30分間戦い続けてきた別の問題がありました-このコード行はそれを修正しました-したがって、私はこのランダムなコメントに感謝したいと思いました。
user1274820

1
これが、私が追加の回答をする理由です
Bahadir Tasdemir

5

sWidth各列に明示的に使用して幅を設定しbAutoWidth: falsedataTable初期化で私の(同様の)問題を解決しました。あふれるスタックが大好きです。


5

固定フィールドなしで少なくとも1つのフィールドを残す必要があります。次に例を示します。

$('.data-table').dataTable ({

 "bAutoWidth": false,
 "aoColumns" : [
    null,
    null,
    null,                    
    null,
    {"sWidth": "20px"},
    { "sWidth": "20px"}]
});

すべてを変更できますが、1つだけをnullのままにしておくと、ストレッチできます。ALLに幅を置くと機能しません。今日誰かを助けたいと思います!


1
これですべての列が1ピクセルになるように設定しました。1つを外すと、魔法のように機能します。ありがとう!
demoncodemonkey 2015年

4
"fnInitComplete": function() {
    $("#datatables4_wrapper").css("width","60%");
 }

これはテーブル全体の幅を調整するのにうまくいきました。@Peter Drinnanに感謝!


テーブルに親コンテナを適切に埋めることができませんでした。テーブルとそのラッパーのcssをwidth:100%に調整しようとしました。目立った違いはありません。上記の方法を試した後、それは不思議に機能しましたが、ラッパーを指すのではなく、自分自身であるテーブルを指す必要がありました。しかし、感謝しますNilani !!
Logic1、2015


3

ここでの解決策はどれも私にとってうまくいきませんでした。データテーブルのホームページの例でもしなかったため、showオプションでデータテーブルを初期化できませんでした。

私は問題の解決策を見つけました。トリックは、タブのアクティブ化オプション使用して、表示されているテーブルでfnAdjustColumnSizing()呼び出すことです

$(function () {

// INIT TABS WITH DATATABLES
$("#TabsId").tabs({
    activate: function (event, ui) {
        var oTable = $('div.dataTables_scrollBody>table:visible', ui.panel).dataTable();
        if (oTable.length > 0) {
            oTable.fnAdjustColumnSizing();
        }
    }
});

// INIT DATATABLES
// options for datatables
var optDataTables = {
    "sScrollY": "200px",
    "bScrollCollapse": true,
    "bPaginate": false,
    "bJQueryUI": true,
    "aoColumnDefs": [
        { "sWidth": "10%", "aTargets": [-1] }
    ]
};
// initialize data table
$('table').dataTable(optDataTables);

});

2

Ajaxのない通常のテーブルにJQueryを適用しただけですが、私はあなたとまったく同じ問題を抱えていたと言います。何らかの理由で、Firefoxは表を公開した後、表を展開しません。テーブルをDIV内に置き、代わりにエフェクトをDIVに適用することで問題を修正しました。


2

準備完了イベントでこれを行っていますか?

$(document).ready(function(){...});

サイズ設定は、ドキュメントが完全に読み込まれていることに依存している可能性が高いです。


上記のコードを見てください-これは、divコンテナー#tab-datasetsのajaxロードからのコールバックで発生しています。テーブル#querytableDatasetsは/ cgi-bin / qryDatasetsによって提供されます
John Mac

そのタイミングはわかりません。プラグインのソースを見ると、0pxの幅を設定できるのは、正しいテーブルoffSetWidthを特定できなかったときだけのようで、早すぎる実行に関連していることがわかりました。
ムファカ2009年

うーん。テーブル#querytableDatasetsが読み込まれた後に、ajaxロードからのコールバックが呼び出されると想定しました。これはそうではないかもしれないと思いますか?
John Mac、

ところで、これがいつ実行されるかについてのあなたの質問に答えると、それはユーザーがボタンをクリックしたことに応答します
John Mac

うーん、それ以上追加できないかわかりません。ボタンクリックの場合、ドキュメントは完全に読み込まれ、readyイベントに配置する必要はありません。テーブルのコンテナの幅をいじったり、現在のレイアウトの外でそれらの(DataTablesプラグイン)を機能させたりすることができます。
ムファカ2009年

1

固定ヘッダープラグインを使用してテーブル/セルの幅を調整できない場合:

データテーブルは、列幅パラメーターのtheadタグに依存しています。これは、テーブルの内部HTMLのほとんどが自動生成されるため、これが実際に唯一のネイティブHTMLであるためです。

ただし、セルの一部がtheadセル内に格納されている幅よりも大きくなる場合があります。

つまり、テーブルに多くの列(ワイドテーブル)があり、行に多くのデータがある場合、「sWidth」を呼び出します。子行はオーバーフローに基づいて自動的にtdのサイズを変更するため、tdセルサイズを変更することは適切に機能しません。コンテンツとこれは後に発生します、テーブルが初期化され、そのinit paramsを渡したにします。

オリジナルのthead "sWidth":データテーブルはテーブルのデフォルトの幅が%100であるとデータテーブルが考えているため、パラメーターが上書き(縮小)されます-一部のセルがオーバーフローしていることが認識されません。

これを修正するために、オーバーフロー幅を把握し、テーブルの初期化にそれに応じてテーブルのサイズを変更することでそれを考慮しました。このとき、固定ヘッダーを同時に初期化できます。

$(document).ready(function() {
  $('table').css('width', '120%');
  new FixedHeader(dTable, {
        "offsetTop": 40,
      });
});

1

ajax呼び出しの「成功」内に固定ヘッダーを作成します。ヘッダーと行の位置合わせの問題は発生しません。

success: function (result) {
              /* Your code goes here */

    var table = $(SampleTablename).DataTable();

        new $.fn.dataTable.FixedHeader(table);
}        

1

これがまだ苦労している人に役立つことを願っています。

テーブルをコンテナの中に入れないでください。テーブルがレンダリングされた後、テーブルのラッパーをコンテナにします。テーブルに何か他のものがある場所ではこれが無効になる可能性があることは知っていますが、その場合はいつでもそのコンテンツを追加して戻すことができます。

私にとって、この問題は、サイドバーと、実際にそのサイドバーへのオフセットであるコンテナーがある場合に発生します。

$(YourTableName+'_wrapper').addClass('mycontainer');

(パネルpanel-defaultを追加しました)
そしてあなたのクラス:

.mycontainer{background-color:white;padding:5px;}

1

この問題に関する別の役立つリンクを見つけて、私の問題を解決しました。

<table width="100%">
<tr>
    <td width="20%"> Left TD <td>
    <td width="80%"> Datatable </td>
</tr>
</table>

データテーブルの力幅表


0

テーブルにdivをラップすると、同様の問題が発生しました。

位置の追加:相対的に修正されました。


#report_container {
 float: right;
 position: relative;
 width: 100%;
}

0

テーブルの内容がテーブルのヘッダーとフッターよりも大きいという同様の問題がありました。テーブルの周りにdivを追加してx-overflowを設定すると、この問題がソートされたようです:


0

bAutoWidthおよびaoColumnsの前にある他のすべてのパラメーターが正しく入力されていることを確認してください。


0

同様の問題があり、列のテキストが壊れないことがわかりました。このcssコードを使用すると問題が解決しました

th,td{
max-width:120px !important;
word-wrap: break-word
}

0

これが私のやり方です。

$('#table_1').DataTable({
    processing: true,
    serverSide: true,
    ajax: 'customer/data',
    columns: [
        { data: 'id', name: 'id' , width: '50px', class: 'text-right' },
        { data: 'name', name: 'name' width: '50px', class: 'text-right' }
    ]
});

0

今日も同じ問題に遭遇します。

私はそれを解決するためにトリッキーな方法を使いました。

以下のように私のコード。

$('#tabs').tabs({
    activate: function (event, ui) {
       //redraw the table when the tab is clicked
       $('#tbl-Name').DataTable().draw();
    }
});

0

このソリューションも確認してください。これは私のDataTableの列幅の問題を簡単に解決しました

jQuery DataTables 1.10.20は、columns.adjust()Bootstrap トグルタブの問題を修正するメソッドを導入します

 $('a[data-toggle="tab"]').on( 'shown.bs.tab', function (e) {
    $.fn.dataTable.tables( {visible: true, api: true} ).columns.adjust();
} );

ドキュメントを参照してください:スクロールタブとブートストラップタブ


-1

これは正常に動作します。

#report_container {
   float: right;
   position: relative;
   width: 100%;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.