【问题标题】:CSS: How to make two grids equals (one of them over the other)CSS:如何使两个网格相等(其中一个在另一个之上)
【发布时间】:2021-01-21 17:09:28
【问题描述】:

我正在尝试使用 React + Javascript 从头开始​​制作 carousel/slider。我认为有两层会很好。其中一个超过另一个。上层将填充窗口,我们可以在其中看到位于底部的层的元素。

上层

  • id 是#window-container
  • 只有 3 列。(中间列将是滑块的窗口。其他两列将被隐藏。每个网格的边框都涂有颜色。)

底层

  • id 是#slider-container。
  • 有 4 列,但可以获得 10、20、100 或无限列。每列的背景都有不同的颜色。

我希望上层和底层的列宽相等,但现在不一样。

无论底层有多少列,如何使它们相等?


你可以在这里查看我的开发:

body {
    margin: 0px;
    padding: 0px;
    overflow-x: hidden;
}
  
h1 {
    font-family: Arial, Helvetica, sans-serif;
    width: 100%;
    text-align: center;
}
  
/*****************************************************/
/******************** Container **********************/
/*****************************************************/
  
.container {
    position: relative;
    border: 3px solid black;
    height: 300px;
    width: 100%;
    z-index: 0;
}
  
/*****************************************************/
/***************** Slider Container ******************/
/*****************************************************/
.slider-container {
    position: absolute;
    box-sizing: border-box;
    /*background-color: yellow;*/
    height: 100%;
    z-index: 1;
}
  
/*****************************************************/
/*************** Window Container ********************/
/*****************************************************/
  
.window-container {
    position: absolute;
    box-sizing: border-box;
    padding: 10px;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: 10px;
    height: 100%;
    width: 100%;
    z-index: 100;
}
  
.left {
    border: 1px solid green;
    grid-column: 1;
}
  
.right {
    border: 1px solid red;
    grid-column: 3;
}
  
#window {
    grid-column: 2;
    border: 1px solid #000000;
}
<!DOCTYPE html>
<html>
    <header>
        <link rel="stylesheet" href="./css/styles.css">
    </header>
    <body>
        <div>
            <h1>Slider Scandiweb</h1>
            <div class = "container">
                <div class = "slider-container"></div>
                <div class = "window-container">
                    <div class = "left"></div>
                    <div id="window"></div>
                    <div class = "right"></div>
                </div>
            </div>
        </div>    
    </body>
    <script type="text/javascript">
        let e = document.querySelector("#window");
        //Set slider-container
        let elements = 10;
        let gap = 10;
        let sc = document.querySelector(".slider-container");
        //sc.style.backgroundColor = "red";
        sc.style.width = e.clientWidth * elements + (elements + 1) * gap + "px";
        sc.style.padding = "10px";
        sc.style.display = "grid";
        sc.style.gridTemplateColumns = "repeat(" + elements + ", 1fr)";
        sc.style.gap = "10px";
        //sc.style.height = "100%";
        //Creations of elements
        for (let i = 0; i < elements; i++) {
          let div = document.createElement("div");
          div.style.backgroundColor = "#" + Math.floor(Math.random()*16777215).toString(16);;
          sc.appendChild(div);
        }      
    </script>
</html>

【问题讨论】:

  • 寻求代码帮助的问题必须包括在问题本身中重现它所需的最短代码,最好是在堆栈片段中。尽管您提供了一个链接,但如果它变得无效,那么您的问题对于未来遇到同样问题的其他 SO 用户将毫无价值。见Something in my website/example doesn't work can I just paste a link
  • 为什么它们必须相等?让下层也有三列宽并将所有图像放在中间层不是更容易吗?但是你甚至不需要中间的下层。
  • 上层只有三层,中间层是我设置了交换事件监听的窗口。底层是具有n个元素的层,它比上面的层大。每次向左或向右交换时,我将底层向左或向右移动。我需要底层内部的所有层与上层中的中间层具有相同的宽度。现在,底部的图层稍微向左移动

标签: css reactjs carousel css-grid


【解决方案1】:

看来.slider-container的宽度需要增加elements,然后与.window-container如预期对齐:

sc.style.width = e.clientWidth * elements + (elements + 1) * gap + elements + "px";

body {
    margin: 0px;
    padding: 0px;
    overflow-x: hidden;
}
  
h1 {
    font-family: Arial, Helvetica, sans-serif;
    width: 100%;
    text-align: center;
}
  
/*****************************************************/
/******************** Container **********************/
/*****************************************************/
  
.container {
    position: relative;
    border: 3px solid black;
    height: 300px;
    width: 100%;
    z-index: 0;
}
  
/*****************************************************/
/***************** Slider Container ******************/
/*****************************************************/
.slider-container {
    position: absolute;
    box-sizing: border-box;
    /*background-color: yellow;*/
    height: 100%;
    z-index: 1;
}
  
/*****************************************************/
/*************** Window Container ********************/
/*****************************************************/
  
.window-container {
    position: absolute;
    box-sizing: border-box;
    padding: 10px;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: 10px;
    height: 100%;
    width: 100%;
    z-index: 100;
}
  
.left {
    border: 1px solid green;
    grid-column: 1;
}
  
.right {
    border: 1px solid red;
    grid-column: 3;
}
  
#window {
    grid-column: 2;
    border: 1px solid #000000;
}
<!DOCTYPE html>
<html>
    <header>
        <link rel="stylesheet" href="./css/styles.css">
    </header>
    <body>
        <div>
            <h1>Slider Scandiweb</h1>
            <div class = "container">
                <div class = "slider-container"></div>
                <div class = "window-container">
                    <div class = "left"></div>
                    <div id="window"></div>
                    <div class = "right"></div>
                </div>
            </div>
        </div>    
    </body>
    <script type="text/javascript">
        let e = document.querySelector("#window");
        //Set slider-container
        let elements = 10;
        let gap = 10;
        let sc = document.querySelector(".slider-container");
        //sc.style.backgroundColor = "red";
        sc.style.width = e.clientWidth * elements + (elements + 1) * gap + elements + "px";
        sc.style.padding = "10px";
        sc.style.display = "grid";
        sc.style.gridTemplateColumns = "repeat(" + elements + ", 1fr)";
        sc.style.gap = "10px";
        //sc.style.height = "100%";
        //Creations of elements
        for (let i = 0; i < elements; i++) {
          let div = document.createElement("div");
          div.style.backgroundColor = "#" + Math.floor(Math.random()*16777215).toString(16);;
          sc.appendChild(div);
        }      
    </script>
</html>

但是,这仍然不理想,因为它根据e.clientWidth 设置宽度,所以它不会响应。如下设置也解决了这个问题:

sc.style.width = "calc(" + elements * 100/3 + "% - 20px)";

body {
    margin: 0px;
    padding: 0px;
    overflow-x: hidden;
}
  
h1 {
    font-family: Arial, Helvetica, sans-serif;
    width: 100%;
    text-align: center;
}
  
/*****************************************************/
/******************** Container **********************/
/*****************************************************/
  
.container {
    position: relative;
    border: 3px solid black;
    height: 300px;
    width: 100%;
    z-index: 0;
}
  
/*****************************************************/
/***************** Slider Container ******************/
/*****************************************************/
.slider-container {
    position: absolute;
    box-sizing: border-box;
    /*background-color: yellow;*/
    height: 100%;
    z-index: 1;
}
  
/*****************************************************/
/*************** Window Container ********************/
/*****************************************************/
  
.window-container {
    position: absolute;
    box-sizing: border-box;
    padding: 10px;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: 10px;
    height: 100%;
    width: 100%;
    z-index: 100;
}
  
.left {
    border: 1px solid green;
    grid-column: 1;
}
  
.right {
    border: 1px solid red;
    grid-column: 3;
}
  
#window {
    grid-column: 2;
    border: 1px solid #000000;
}
<!DOCTYPE html>
<html>
    <header>
        <link rel="stylesheet" href="./css/styles.css">
    </header>
    <body>
        <div>
            <h1>Slider Scandiweb</h1>
            <div class = "container">
                <div class = "slider-container"></div>
                <div class = "window-container">
                    <div class = "left"></div>
                    <div id="window"></div>
                    <div class = "right"></div>
                </div>
            </div>
        </div>    
    </body>
    <script type="text/javascript">
        let e = document.querySelector("#window");
        //Set slider-container
        let elements = 10;
        let gap = 10;
        let sc = document.querySelector(".slider-container");
        //sc.style.backgroundColor = "red";
        sc.style.width = "calc(" + elements * 100/3 + "% - 20px)";
        sc.style.padding = "10px";
        sc.style.display = "grid";
        sc.style.gridTemplateColumns = "repeat(" + elements + ", 1fr)";
        sc.style.gap = "10px";
        //sc.style.height = "100%";
        //Creations of elements
        for (let i = 0; i < elements; i++) {
          let div = document.createElement("div");
          div.style.backgroundColor = "#" + Math.floor(Math.random()*16777215).toString(16);;
          sc.appendChild(div);
        }      
    </script>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2015-01-21
    • 2021-11-08
    相关资源
    最近更新 更多