使用 div 动态显示列,第一列固定,其余全部带有水平滚动条

贾纳克·普拉贾帕蒂

我需要你的帮助。

我正在创建一个带有动态列的 N 级嵌套表

所以我想要做的是,我想根据用户的选择创建一个列数可变的表,为此我创建了一个简单的下拉框,根据下拉选择,那些选定的列将出现在桌子

我想要的是我的表格的第一列应该总是固定的,而其他的可以水平滚动,并且这些列的宽度应该随着列的显示或隐藏而调整

我不想使用任何外部库。我创建了一个基于 div 和网格 CSS 的自定义表

下面是我到目前为止所做的事情的截图

在此处输入图片说明

下面是代码供参考:

HTML:

<ng-container *ngFor="let rData of reportData; let i = index; last as isLast" >
  <div class="myTr report-row">
    <div class="myTd">
        <button 
           class="btn report-btn-sm" 
           *ngIf="checkIfHaveMoreSplits(this.splitOpt[0].id) !== 0 && rData.isCollapsed == true"
           (click)="splitData(rowWiseFilterObj(rData,this.splitOpt[0].id),this.splitOpt[0].id,sFilters,splitOpt,i,rData,selectedDate)"
           row="rData">+</button>
        <button 
           class="btn report-btn-sm" 
           *ngIf="checkIfHaveMoreSplits(this.splitOpt[0].id) !== 0 && rData.isCollapsed == false" 
           (click)="removeDynamicComponent(rData,i)"
           >-</button>
           <span *ngIf="this.splitOpt[0].id == 'campid'">{{rData['campaign_name']}}</span>

          <span *ngIf="this.splitOpt[0].id !== '__time' && this.splitOpt[0].id !== 'campid'">{{rData[this.splitOpt[0].id]}}</span>
          <span *ngIf="this.splitOpt[0].id === '__time'">{{ rData[this.splitOpt[0].id]  | date:'dd-MM-yyyy HH:mm:ss Z'}}</span>


    </div>
    <div class="myTdGroupBox"><div class="myTdGroup">
      <div class="myTd">{{convertToDecimals(rData.impressions,2)}}</div>
      <div class="myTd">{{convertToDecimals(rData.conversions,2)}}</div>
      <div class="myTd">{{convertToDecimals(rData.bids,2)}}</div>
      <div class="myTd">{{convertToDecimals(rData.wins,2)}}</div>
      <div class="myTd">$ {{convertToDecimals(rData.spend,2)}}</div>
      <div class="myTd">
        <button class="btn btn-secondary m-btn m-btn--label-danger m-btn--label-danger m-btn--bolder m-btn--uppercase btn-sm" *ngIf="this.splitOpt[0].id=='campid'" (click)="excludeReport(rowWiseFilterObj(rData,this.splitOpt[0].id))"> <i class="la la-close"></i> </button>
        <button class="btn btn-secondary m-btn m-btn--label-danger m-btn--bolder m-btn--uppercase btn-sm" disabled="disabled" *ngIf="this.splitOpt[0].id!='campid'"> <i class="la la-ban"></i> </button>

      </div>
    </div></div>
  </div>

  <div *ngIf="isLast" class="text-right col-12">{{altrows("#ffffff","#f5f5f5")}}

            <a href="javascript:void(0)" class="m-link" (click)="loadmore()" style="    margin: 10px -30px 15px 10px;
    background: #5ccdde;
    color: #fff;
    padding: 2px 10px;
    font-size: 12px;" *ngIf="reportData.length > 19"> Load more </a>
        </div>
    <ng-template #dynamic ></ng-template>

    </ng-container>
  <div class="myTr" style="margin-top:20px;">
    <div class="myTd"></div>
    <div class="myTdGroupBox"><div class="myTdGroup">
      <div class="myTd"></div>
    </div></div>
  </div>
</div>

JS:

getReport() {
        this.hidePopup();
        if(this.splitOpt.length === 0) {
            // this.updateGraph(this.currentGraphSelection);
            return false;
        } 


        var apiFilters: any = [{}];
        for (var i = 0; i < this.sFilters.length; i++) {
            if (this.sFilters[i].values.length > 0) {
                var k;
                k = this.sFilters[i].id
                apiFilters[0][k] = this.sFilters[i].values
            }
        }

        var split = this.splitOpt[0].id;
        this.reportData=[];
        this.reportLoading = true;
        this._apis.getReportData(split, apiFilters[0],this.selectedDate,1,20).subscribe(response => {
            if (response.status == 1200) {
                this.reportData = response.data.split_by_data;
                this.reportData.map(function(obj) {
                  obj.isCollapsed = true;
                  return obj;
               });
            this.totalImpressions=response.data.totalCount[0].impressions;
            this.totalConversions=response.data.totalCount[0].conversions;
            this.totalBids=response.data.totalCount[0].bids;
            this.totalWins=response.data.totalCount[0].wins;
            this.totalSpend=response.data.totalCount[0].spend;
               this.reportLoading = false;
               var contentGroups = document.querySelectorAll('.myTr:not(:last-child) .myTdGroupBox');
var ctrlGroup = document.querySelector('.myTr:last-child .myTdGroupBox');
ctrlGroup.addEventListener('scroll', (ev)=> {
    contentGroups.forEach((g)=> g.scrollTo(ctrlGroup.scrollLeft, 0) );
});
               this.cd.detectChanges();

            }
        });
    }
奥里乌斯

您可以使用<div>带有 flex 布局的 s重新制作表格

我在下面写了一个完整的例子。您没有桌子的所有灵活性,但它非常强大。您还可以将列滚动条固定到页面上,并使其始终可见,即使表格大于页面高度。和更多...

你会看到,我使可滚动列都具有相同的宽度。您可以设置不同的宽度。我会使用列的类来做到这一点。

我相信代码很容易理解。如果你需要帮助,或者想使用更多 flex 布局的力量,你可以看到这个页面:https : //css-tricks.com/snippets/css/a-guide-to-flexbox/

让所有人一起行动的 javascript 是这里最简单的事情。这个想法是获取滚动事件并应用相同的滚动条与overflow: hidden.

创建新列就像在 a 上创建一样简单<table>,只需将<div>s 放入.myTdGroup元素中即可。

<style>
  .myTable {
    font-family: sans-serif;
    font-size: 15px;
    width: 450px;
    border: 2px solid #BBB;
    position: relative;
  }
  .myTr {
    display: flex;
    align-items: center;
  }
  .myTr:nth-child(odd) { background: #DDD }
  .myTdGroupBox {
    overflow: hidden;
  }
  .myTdGroup {
    display: flex;
    align-items: center;
    width: 500px;
  }
  .myTr:last-child { background: #777 }
  .myTr:last-child .myTdGroupBox { overflow-x: scroll }
  .myTr:last-child .myTd { padding: .1px 0 0 0 }
  .myTd {
    margin: 0 1em;
    padding: .5em 0;
    flex-grow: 1;
    flex-basis: 50px;
    overflow-x: auto;
    white-space: nowrap;
  }
  .myTr > .myTd { flex-basis: 150px; }
</style>

<div class="myTable">
  <div class="myTr">
    <div class="myTd">Line A</div>
    <div class="myTdGroupBox"><div class="myTdGroup">
      <div class="myTd">A1</div>
      <div class="myTd">A222</div>
      <div class="myTd">A333</div>
      <div class="myTd">A444</div>
      <div class="myTd">A555</div>
      <div class="myTd">A666</div>
    </div></div>
  </div>
  <div class="myTr">
    <div class="myTd">Line BBBBB</div>
    <div class="myTdGroupBox"><div class="myTdGroup">
      <div class="myTd">B111</div>
      <div class="myTd">B2</div>
      <div class="myTd">B333</div>
      <div class="myTd">BX<br>444</div>
      <div class="myTd">B555</div>
      <div class="myTd">B666</div>
    </div></div>
  </div>
  <div class="myTr">
    <div class="myTd">Line<br>CCC<br>CCC</div>
    <div class="myTdGroupBox"><div class="myTdGroup">
      <div class="myTd">C111</div>
      <div class="myTd">C222</div>
      <div class="myTd">C3</div>
      <div class="myTd">C 444 444 444 end</div>
      <div class="myTd">C555</div>
      <div class="myTd">C666</div>
    </div></div>
  </div>
  <div class="myTr">
    <div class="myTd">Line DDD</div>
    <div class="myTdGroupBox"><div class="myTdGroup">
      <div class="myTd">D111</div>
      <div class="myTd">D222</div>
      <div class="myTd">D333</div>
      <div class="myTd">D444</div>
      <div class="myTd">D555</div>
      <div class="myTd">D666</div>
    </div></div>
  </div>
  <div class="myTr">
    <div class="myTd"></div>
    <div class="myTdGroupBox"><div class="myTdGroup">
      <div class="myTd"></div>
    </div></div>
  </div>
</div>

<script>
var contentGroups = document.querySelectorAll('.myTr:not(:last-child) .myTdGroupBox');
var ctrlGroup = document.querySelector('.myTr:last-child .myTdGroupBox');
ctrlGroup.addEventListener('scroll', (ev)=> {
    contentGroups.forEach((g)=> g.scrollTo(ctrlGroup.scrollLeft, 0) );
});
</script>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在固定div中使用滚动条移动div

来自分类Dev

在固定div内使用滚动条移动div

来自分类Dev

如何使用水平滚动条在一行中管理多个div

来自分类Dev

使用显示表和显示表单元格进行DIV,但一列固定宽度

来自分类Dev

使用一个滚动条同时水平滚动列内的所有行

来自分类Dev

如何在带有向下滚动条的jQuery中使用slideUp打开div

来自分类Dev

如何仅使用长内容创建带有垂直滚动条的div

来自分类Dev

让 div 使用滚动条而不是变大

来自分类Dev

如何创建div堆栈并动态显示在滚动条上?

来自分类Dev

使用固定的左div水平滚动

来自分类Dev

使用Bootstrap使水平滚动固定一列?

来自分类Dev

如何使水平div滚动条像固定的CSS div一样浮动

来自分类Dev

Div水平滚动条

来自分类Dev

带有水平滚动条的表(无列限制,动态创建表)

来自分类Dev

将div的水平滚动条固定到页面底部

来自分类Dev

使用jQuery检查滚动条是否达到了div

来自分类Dev

使用滚动条将HTML div调整到屏幕

来自分类Dev

如何使用滚动条使列表适合父div

来自分类Dev

单击使用平滑滚动条可移至Div

来自分类Dev

div溢出时如何自动使用滚动条

来自分类Dev

使用滚动条将HTML div调整到屏幕

来自分类Dev

需要帮助将顶部栏固定在另一个带有滚动条的div中

来自分类Dev

具有4个div的布局-2个固定,1个动态(不可滚动)和1个带有滚动条的填充高度

来自分类Dev

如何在带有滚动条的div内制作固定框?

来自分类Dev

使用JavaScript显示div

来自分类Dev

如何使用引导程序在没有水平滚动条的情况下打印换行文本?

来自分类Dev

CSS:如何获取定位的div以使用窗口水平调整大小,而不是获取滚动条

来自分类Dev

CSS:如何获取定位的div以使用窗口水平调整大小,而不是获取滚动条

来自分类Dev

使用鼠标滚轮在div上滚动div

Related 相关文章

  1. 1

    在固定div中使用滚动条移动div

  2. 2

    在固定div内使用滚动条移动div

  3. 3

    如何使用水平滚动条在一行中管理多个div

  4. 4

    使用显示表和显示表单元格进行DIV,但一列固定宽度

  5. 5

    使用一个滚动条同时水平滚动列内的所有行

  6. 6

    如何在带有向下滚动条的jQuery中使用slideUp打开div

  7. 7

    如何仅使用长内容创建带有垂直滚动条的div

  8. 8

    让 div 使用滚动条而不是变大

  9. 9

    如何创建div堆栈并动态显示在滚动条上?

  10. 10

    使用固定的左div水平滚动

  11. 11

    使用Bootstrap使水平滚动固定一列?

  12. 12

    如何使水平div滚动条像固定的CSS div一样浮动

  13. 13

    Div水平滚动条

  14. 14

    带有水平滚动条的表(无列限制,动态创建表)

  15. 15

    将div的水平滚动条固定到页面底部

  16. 16

    使用jQuery检查滚动条是否达到了div

  17. 17

    使用滚动条将HTML div调整到屏幕

  18. 18

    如何使用滚动条使列表适合父div

  19. 19

    单击使用平滑滚动条可移至Div

  20. 20

    div溢出时如何自动使用滚动条

  21. 21

    使用滚动条将HTML div调整到屏幕

  22. 22

    需要帮助将顶部栏固定在另一个带有滚动条的div中

  23. 23

    具有4个div的布局-2个固定,1个动态(不可滚动)和1个带有滚动条的填充高度

  24. 24

    如何在带有滚动条的div内制作固定框?

  25. 25

    使用JavaScript显示div

  26. 26

    如何使用引导程序在没有水平滚动条的情况下打印换行文本?

  27. 27

    CSS:如何获取定位的div以使用窗口水平调整大小,而不是获取滚动条

  28. 28

    CSS:如何获取定位的div以使用窗口水平调整大小,而不是获取滚动条

  29. 29

    使用鼠标滚轮在div上滚动div

热门标签

归档