Flex-grid 渲染的差异

问题描述 投票:0回答:1

任何人都可以解释一下,为什么第一个示例向下滚动时速度更快 比第二个?似乎第二个示例在我向下滚动时重新渲染行。

只有当您抓住滚动手柄并将表格向下滚动到底部时才会注意到。在示例 #2 中,您应该在表格下部看到白色条纹/或空白区域。

两者之间的唯一区别是容器中的“高度”属性。

示例1

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
<title>Flex Grid with Floating Header</title>


<style>

    .container {
        display: flex;
        flex-direction: column;
        overflow: auto;
        height: 90vh;
    }

    .header {
        display: flex;
        position: sticky;
        top: 0;
        background-color: #f1f1f1;
        z-index: 1;
    }
    
    .header div {
        flex: 1;
        padding: 10px;
        border: 1px solid #ccc;
        text-align: center;
    }

    .grid {
        display: flex;
        flex-direction: column;
    }
    
    .row {
        display: flex;
    }
    
    .row div {
        flex: 1;
        padding: 10px;
        border: 1px solid #ccc;
        text-align: center;
    }

    .header div:first-child, .cell:first-child {
        color: white;
    }

</style>

</head>

<body>

    <div class="container">

        <div>
            <div>
            
                <div class="header">
                    <script>
                        for (let j = 0; j < 50; j++) {
                            document.write(`
                                <div>
                                    <span> Header ${(j + 1)} </span>
                                </div>
                            `);
                        }
                    </script>
                </div>

                <div class="table__body">

                    <div class="rows">
                        <!-- Generate 1000 rows -->
                        <script>
                            for (let i = 1; i <= 2000; i++) {
                                document.write('<div class="row">');
                                for (let j = 1; j <= 60; j++) {
                                    document.write('<div>Row ' + i + ' Col ' + j + '</div>');
                                }
                                document.write('</div>');
                            }
                        </script>
                    </div>

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

</html>

示例2

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
<title>Flex Grid with Floating Header</title>


<style>

    .container {
        display: flex;
        flex-direction: column;
        overflow: auto;
        height: 100%;
    }

    .header {
        display: flex;
        position: sticky;
        top: 0;
        background-color: #f1f1f1;
        z-index: 1;
    }
    
    .header div {
        flex: 1;
        padding: 10px;
        border: 1px solid #ccc;
        text-align: center;
    }

    .grid {
        display: flex;
        flex-direction: column;
    }
    
    .row {
        display: flex;
    }
    
    .row div {
        flex: 1;
        padding: 10px;
        border: 1px solid #ccc;
        text-align: center;
    }

    .header div:first-child, .cell:first-child {
        color: white;
    }

</style>

</head>

<body>

    <div class="container">

        <div>
            <div>
            
                <div class="header">
                    <script>
                        for (let j = 0; j < 50; j++) {
                            document.write(`
                                <div>
                                    <span> Header ${(j + 1)} </span>
                                </div>
                            `);
                        }
                    </script>
                </div>

                <div class="table__body">

                    <div class="rows">
                        <!-- Generate 1000 rows -->
                        <script>
                            for (let i = 1; i <= 2000; i++) {
                                document.write('<div class="row">');
                                for (let j = 1; j <= 60; j++) {
                                    document.write('<div>Row ' + i + ' Col ' + j + '</div>');
                                }
                                document.write('</div>');
                            }
                        </script>
                    </div>

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

</html>

javascript html css flexbox
1个回答
0
投票

是因为浏览器的渲染和布局计算行为。在第一个示例中,您将容器的高度设置为固定值,即视口的 90%。因此,浏览器能够优化渲染过程,因为它具有固定的高度。

在第二个示例中,您将容器的高度设置为父组件的 100%,该高度可能会随着滚动而改变。因此,浏览器需要更频繁地重新计算组件的高度,并强制重新渲染行。

这就是为什么当您滚动得更快时,您会看到它正在重新渲染行。

© www.soinside.com 2019 - 2024. All rights reserved.