Bootstrap 4.0 响应动态网站的每行卡片数

Posted

技术标签:

【中文标题】Bootstrap 4.0 响应动态网站的每行卡片数【英文标题】:Bootstrap 4.0 Responsive Number of Cards Per Row For Dynamic Website 【发布时间】:2022-01-16 06:41:23 【问题描述】:

我有一个有趣的问题。我正在使用 UI 上的 razor 语法在我的 .Net 5.0 应用程序中动态创建引导卡。

每 5 张卡片创建一个新行,因此我有 4 张卡片可见,与用户水平对齐。

在大多数屏幕尺寸上都可以正常工作。有 4 张卡片,或者在较小的屏幕上可以看到 1 或 2 张卡片水平对齐。

问题出在中等屏幕上,当它太小而不能连续放 4 张卡片,但又太大而不能降到每行 2 张卡片时。这会导致 3 张卡片可见,与用户,以及低于他们的第 4 次下降。它们都仍在同一个“行”元素内。

我看不出如何使用类属性来解决这个问题,因为行是动态创建并填充了 4 张卡片的。我也看不到如何在代码中修复它,因为我的 razor 函数不知道生成元素的屏幕尺寸是多少?任何建议都非常感谢...

cshtml代码:

        <body class="body-bg-img">
        
        <!-- This function checks if the card iteration is divisible by 4 to move to the next row -->
        
            @
                bool check(int i)
                
                    var iAsString = i.ToString();
                    int iLength = iAsString.Length;
        
                    if ((iLength == 1 && ((iAsString[0] - '0') % 4 == 0)) || iLength == 0)
                    
                        return true;
                    
                    else if (iLength > 1)
                    
                        int last = iAsString[iLength - 1] - '0';
                        int secondLast = iAsString[iLength - 2] - '0';
        
                        if ((secondLast * 10 + last) % 4 == 0)
                        
                            return true;
                        
                        else
                        
                            return false;
                        
                    
                    else
                    
                        return false;
                    
                
        
            
        
        <!-- This function creates a row and populates the first card, the nested loop then populates 3
    more cards on the same row before breaking out to the main loop again, which creates the next row.  
    The nested loop then populates the next row etc. NOTE: I have [snipped] out some code for posting 
    to make it easier to read. -->
        
            @for (int i = 0; i < Model.MainArticleList.Count(); i++)
            
                var item = Model.MainArticleList[i];
        
                if (check(i))
                

                <div class="container-body">
                <div class="row align-content-center justify-content-center">

                <!-- CREATE A NEW CONTAINER WITH ROW & ADD FIRST CARD IN ROW -->
        
                            @if (item.UserIdRef != "none")
                            
                [snip]
        
                                @if (item.RazorRef != "none")
                                
                                        <div class="card h-35 border-success m-2" style="max-width: 18rem;">

               [snip] <!-- Bootstrap card properties are being populated here -->

                                        </div>
                                
                                else if (item.HREFRef != "none")
                                
                                    <div class="card h-35 border-success m-2" style="max-width: 18rem;">

               [snip] <!-- Just a different card content type -->

                                    </div>
                                
                            
        
                            @for (int j = i + 1; j < Model.MainArticleList.Count(); j++)
                            

               <!-- CREATE CARDS 2, 3 and 4 INSIDE THE EXISTING ROW -->

                                var item1 = Model.MainArticleList[j];
        
                                if (!check(j))
                                
        
                                    @if (item1.UserIdRef != "none")
                                    
               [snip]
        
                                        @if (item1.RazorRef != "none")
                                        
                                                <div class="card h-35 border-success m-2" style="max-width: 18rem;">

               [snip] <!-- Bootstrap card properties are being populated here -->

                                                </div>
                                        
                                        else if (item1.HREFRef != "none")
                                        
                                            <div class="card h-35 border-success m-2" style="max-width: 18rem;">

               [snip] <!-- Just a different card content type -->

                                            </div>
                                        
                                    
                                
                                else
                                
                                    break;
                                
                            
                        </div>
                    </div>
                
            
            <br />
        </body>

【问题讨论】:

【参考方案1】:

诀窍是不要自己计算行和列,而是在 CSS 级别上进行计算。今天我们可以通过使用 flex-box 来做到这一点。这是 Bootstrap 4 已经使用的卡片布局card-deck。How to adjust the data in grid columns in placing the data dynamically from the backend

CSS

.card-deck .card 
    flex-basis: 100%;


@media (min-width: 992px) 
    .card-deck .card 
        flex-basis: calc(25% - 30px); /* #$grid-gutter-width */
    

如果.card 是剩余的卡片,您的设计要求应该告诉您让其增长。您可以在 CSS 中使用 flex-grow 1 或 0 来控制它。 通常您将其设置为 0 可能会为某些分辨率创建空白空间。

DEMO 1(1卡移动,2小,3中,4大)DEMO 2(1卡移动,3中)DEMO 3(1卡手机,2中卡)

为了使后端更加动态,您可以在后端选择卡片组有多少列,您可以使用帮助类来映射断点,如.two-col.three-col.four-col 等,如所示演示 2 和 3。


如果您确实必须使用行和列,请参阅我的other answer。 您可以使用模运算符 => amount % 4 计算剩余部分。 根据我的经验,我设法将其用于三列布局。 四列肯定会更加棘手。


另请注意,在 Bootstrap 5 上,这再次发生了变化,因为他们摆脱了卡片组。 在这里,您可以简单地使用 .row.col,这又是在 CSS 中控制的。bootstrap 5 alpha 2 card deck example not showing like it is in documentation

【讨论】:

谢谢蒂姆。因此,为了清楚起见,我应该将它们全部放在一行上并使用 flex 使它们根据所有屏幕尺寸的要求跳到下一行? (在我的解决方案中浪费了大量的编码工作!哎呀!:D) 是的,一排和一列 12。在里面放你的卡片组。如果您需要全角背景颜色,它将变成 1 节,1 行,1 列 12 和一个容器。 辛苦了,谢谢@Tim

以上是关于Bootstrap 4.0 响应动态网站的每行卡片数的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Vue 和 Bootstrap 4 每行显示 3 张卡片

具有等高卡片的 Bootstrap 4 响应式卡片列

基于视口响应的 Bootstrap 4 卡片组表格单元列?

使用 flickity 和 bootstrap 4 进行水平卡片滚动(响应式)

使用 Bootstrap 创建响应式水平内容缩略图

带网格的 Bootstrap 4 卡片列