动态更改 CSS 网格中的行数
Dynamically changing the number of rows in a CSS Grid
我有一个使用 CSS 网格设计的网页。这是它的样子 -
在某些情况下,我想删除用户名 - CSS 网格用户 以便呈现的页面看起来像这样 -
我在 react/redux
项目中使用它。基于变量,我必须 show/hide 用户的用户名。
因此我想更改网格的行数,我尝试将 class display: none
设置为
.username {
display: none;
}
然而,它所做的只是删除CSS Grid User 字符串,但该行存在,留下空白space。
有什么方法可以动态更改 rows/columns 的数量。我不想使用 CSS in JS
解决方案。我有一个普通的 CSS 文件,它为反应组件设置样式。
.layout {
display: grid;
grid-template-columns: minmax(200px, auto) minmax(200px, 300px) minmax(900px, auto) minmax(200px, auto);
grid-template-rows: 60px 60px 60px minmax(700px, auto);
grid-gap: 5px;
height: calc(100vh);
}
.navbar {
grid-column: 1 / -1;
grid-row: 1 / 2;
background-color: #3a3f51;
border-bottom: 1px solid #797d89;
text-align: center;
color: aliceblue;
}
.username {
grid-column: 1 / -1;
grid-row: 2 / 3;
background-color: #f7f9f9;
border-bottom: 1px solid #dee5e7;
text-align: center;
}
.statement-list {
grid-column: 2 / 3;
grid-row: 3 / 5;
max-height: 600px;
overflow-y: auto;
}
.title {
grid-column: 3 / 4;
grid-row: 3 / 4;
}
.content {
grid-column: 3 / 4;
grid-row: 4 / 5;
overflow-x: auto;
overflow-y: auto;
}
<body class="layout">
<div class="navbar">About</div>
<div class="username">CSS Grid User</div>
<div class="title">Lorem Ipsum</div>
<div class="statement-list">
Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna. Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus
lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna.
</div>
<div class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet a odio quis commodo. In nisl justo, tincidunt vel aliquet eget, mollis eget lorem. Aenean sit amet nibh eget nunc sodales vestibulum id ac ante. Nullam eleifend sodales ipsum, sed
porta tellus posuere molestie. Vestibulum congue porta odio sed iaculis. Phasellus varius sodales ullamcorper. Praesent consectetur ante eget turpis pretium, eget sagittis leo volutpat. Aenean posuere, sapien quis placerat pulvinar, lectus est interdum
dui, at pretium risus sapien et neque. Sed eu fringilla turpis. Ut viverra, nisl non euismod sollicitudin, tellus lectus finibus leo, in ornare sem mauris non eros. Fusce augue est, rhoncus vitae tristique in, malesuada nec libero. Sed venenatis vehicula
ultricies. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce interdum auctor ante a fermentum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam malesuada
scelerisque tortor ac faucibus. Integer pharetra eget velit a tempus. Aenean at lobortis massa, vel accumsan ligula.
</div>
</body>
就个人而言,我喜欢编写自己的函数。所以这就是我的方法......
JavaScript
function removeElementsByClass(className){
var elements = document.getElementsByClassName(className);
while(elements.length > 0){
elements[0].parentNode.removeChild(elements[0]);
}
}
然后...
removeElementsByClass('.username')
当然,选择简单的选项并不丢脸(但了解幕后发生的事情会很有帮助)。
jQuery
$('.username').remove();
注意: 这只会删除具有分配的 class 名称的元素。
因此,您需要为目标行提供一个 class 名称,或者通过包含额外的 parentNode
...
来进一步回溯
elements[0].parentNode.parentNode.removeChild(elements[0]);
您可以根据您设置的用户名变量在 div.layout 元素(或其他父标签)上设置一个 class,然后调整您的 CSS 网格以重新定义CSS 网格 columns/rows 基于 class。
(我对 React 不是很熟悉,但是如果没记错的话你可以像这样有条件地设置一个 class)
<div className={"layout " + (this.props.usernameShown ? 'username-avail' : 'username-unavail')}>
然后在您的 CSS 文件中,您可以定义 CSS 网格,例如
.layout {
display: grid;
grid-template-columns: minmax(200px, auto) minmax(200px, 300px) minmax(900px, auto) minmax(200px, auto);
grid-gap: 5px;
height: calc(100vh);
}
.username-avail.layout {
/* Four rows */
grid-template-rows: 60px 60px 60px minmax(700px, auto);
}
.username-unavail.layout {
/* Three rows */
grid-template-rows: 60px 60px minmax(700px, auto);
}
创建显式 轨道后,这些轨道是使用以下属性创建的行和列:
grid-template-rows
grid-template-columns
grid-template-areas
grid
(一个shorthand)
...您被那些曲目困住了。他们不会消失。
您尝试在网格项目 (.username
) 上删除带有 display: none
的显式行是行不通的。该命令在项目级别运行,但该行是在容器级别创建的。
如果要构建具有动态流入和流出轨道的网格,请使用隐式,而不是显式轨道。
隐式轨道是自动创建的行和列,用于容纳位于显式网格之外的网格项目。
当没有网格项占据隐式轨道时,该轨道根本不存在。
我根据您的代码在下面发布了两个示例。
- 第一个示例显示
.username
的一行,另一个示例不显示;
grid-template-rows
已被删除,因此没有明确的行;所有行都是隐式的;
- 先前在
grid-template-rows
上设置的高度已移至其各自的网格项;
- 隐式行高由
grid-auto-rows
控制,其初始值为auto
(基于内容),因此与前一点配合得很好;并且,
- 因为您正在处理隐式轨道,所以源顺序很重要。
用户名行
.layout {
display: grid;
grid-template-columns: minmax(200px, auto) minmax(200px, 300px) minmax(900px, auto) minmax(200px, auto);
grid-gap: 5px;
height: 100vh;
}
/* implicit first row */
.navbar {
height: 60px;
grid-column: 1 / -1;
background-color: #3a3f51;
border-bottom: 1px solid #797d89;
text-align: center;
color: aliceblue;
}
/* implicit second row */
.username {
/* display: none; */
height: 60px;
grid-column: 1 / -1;
background-color: #f7f9f9;
border-bottom: 1px solid #dee5e7;
text-align: center;
}
/* implicit third row (start) */
.statement-list {
height: 60px;
grid-column: 2 / 3;
max-height: 600px;
}
/* implicit third row */
.title {
height: 60px;
grid-column: 3 / 4;
grid-row: 3 / 4;
}
.content {
min-height: 700px;
grid-column: 3 / 4;
overflow-x: auto;
overflow-y: auto;
}
body {
margin: 0;
}
<body class="layout">
<div class="navbar">About</div>
<div class="username">CSS Grid User</div>
<div class="title">Lorem Ipsum</div>
<div class="statement-list">
Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna. Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus
lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna.
</div>
<div class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet a odio quis commodo. In nisl justo, tincidunt vel aliquet eget, mollis eget lorem. Aenean sit amet nibh eget nunc sodales vestibulum id ac ante. Nullam eleifend sodales ipsum, sed
porta tellus posuere molestie. Vestibulum congue porta odio sed iaculis. Phasellus varius sodales ullamcorper. Praesent consectetur ante eget turpis pretium, eget sagittis leo volutpat. Aenean posuere, sapien quis placerat pulvinar, lectus est interdum
dui, at pretium risus sapien et neque. Sed eu fringilla turpis. Ut viverra, nisl non euismod sollicitudin, tellus lectus finibus leo, in ornare sem mauris non eros. Fusce augue est, rhoncus vitae tristique in, malesuada nec libero. Sed venenatis vehicula
ultricies. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce interdum auctor ante a fermentum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam malesuada
scelerisque tortor ac faucibus. Integer pharetra eget velit a tempus. Aenean at lobortis massa, vel accumsan ligula.
</div>
没有用户名行(只需添加display: none
)
.layout {
display: grid;
grid-template-columns: minmax(200px, auto) minmax(200px, 300px) minmax(900px, auto) minmax(200px, auto);
grid-gap: 5px;
height: 100vh;
}
/* implicit first row */
.navbar {
height: 60px;
grid-column: 1 / -1;
background-color: #3a3f51;
border-bottom: 1px solid #797d89;
text-align: center;
color: aliceblue;
}
/* implicit second row */
.username {
display: none; /* ADDED */
height: 60px;
grid-column: 1 / -1;
background-color: #f7f9f9;
border-bottom: 1px solid #dee5e7;
text-align: center;
}
/* implicit third row (start) */
.statement-list {
height: 60px;
grid-column: 2 / 3;
max-height: 600px;
}
/* implicit third row */
.title {
height: 60px;
grid-column: 3 / 4;
grid-row: 3 / 4;
}
.content {
min-height: 700px;
grid-column: 3 / 4;
overflow-x: auto;
overflow-y: auto;
}
body {
margin: 0;
}
<body class="layout">
<div class="navbar">About</div>
<div class="username">CSS Grid User</div>
<div class="title">Lorem Ipsum</div>
<div class="statement-list">
Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna. Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus
lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna.
</div>
<div class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet a odio quis commodo. In nisl justo, tincidunt vel aliquet eget, mollis eget lorem. Aenean sit amet nibh eget nunc sodales vestibulum id ac ante. Nullam eleifend sodales ipsum, sed
porta tellus posuere molestie. Vestibulum congue porta odio sed iaculis. Phasellus varius sodales ullamcorper. Praesent consectetur ante eget turpis pretium, eget sagittis leo volutpat. Aenean posuere, sapien quis placerat pulvinar, lectus est interdum
dui, at pretium risus sapien et neque. Sed eu fringilla turpis. Ut viverra, nisl non euismod sollicitudin, tellus lectus finibus leo, in ornare sem mauris non eros. Fusce augue est, rhoncus vitae tristique in, malesuada nec libero. Sed venenatis vehicula
ultricies. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce interdum auctor ante a fermentum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam malesuada
scelerisque tortor ac faucibus. Integer pharetra eget velit a tempus. Aenean at lobortis massa, vel accumsan ligula.
</div>
规格参考:
我有一个使用 CSS 网格设计的网页。这是它的样子 -
在某些情况下,我想删除用户名 - CSS 网格用户 以便呈现的页面看起来像这样 -
我在 react/redux
项目中使用它。基于变量,我必须 show/hide 用户的用户名。
因此我想更改网格的行数,我尝试将 class display: none
设置为
.username {
display: none;
}
然而,它所做的只是删除CSS Grid User 字符串,但该行存在,留下空白space。
有什么方法可以动态更改 rows/columns 的数量。我不想使用 CSS in JS
解决方案。我有一个普通的 CSS 文件,它为反应组件设置样式。
.layout {
display: grid;
grid-template-columns: minmax(200px, auto) minmax(200px, 300px) minmax(900px, auto) minmax(200px, auto);
grid-template-rows: 60px 60px 60px minmax(700px, auto);
grid-gap: 5px;
height: calc(100vh);
}
.navbar {
grid-column: 1 / -1;
grid-row: 1 / 2;
background-color: #3a3f51;
border-bottom: 1px solid #797d89;
text-align: center;
color: aliceblue;
}
.username {
grid-column: 1 / -1;
grid-row: 2 / 3;
background-color: #f7f9f9;
border-bottom: 1px solid #dee5e7;
text-align: center;
}
.statement-list {
grid-column: 2 / 3;
grid-row: 3 / 5;
max-height: 600px;
overflow-y: auto;
}
.title {
grid-column: 3 / 4;
grid-row: 3 / 4;
}
.content {
grid-column: 3 / 4;
grid-row: 4 / 5;
overflow-x: auto;
overflow-y: auto;
}
<body class="layout">
<div class="navbar">About</div>
<div class="username">CSS Grid User</div>
<div class="title">Lorem Ipsum</div>
<div class="statement-list">
Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna. Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus
lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna.
</div>
<div class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet a odio quis commodo. In nisl justo, tincidunt vel aliquet eget, mollis eget lorem. Aenean sit amet nibh eget nunc sodales vestibulum id ac ante. Nullam eleifend sodales ipsum, sed
porta tellus posuere molestie. Vestibulum congue porta odio sed iaculis. Phasellus varius sodales ullamcorper. Praesent consectetur ante eget turpis pretium, eget sagittis leo volutpat. Aenean posuere, sapien quis placerat pulvinar, lectus est interdum
dui, at pretium risus sapien et neque. Sed eu fringilla turpis. Ut viverra, nisl non euismod sollicitudin, tellus lectus finibus leo, in ornare sem mauris non eros. Fusce augue est, rhoncus vitae tristique in, malesuada nec libero. Sed venenatis vehicula
ultricies. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce interdum auctor ante a fermentum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam malesuada
scelerisque tortor ac faucibus. Integer pharetra eget velit a tempus. Aenean at lobortis massa, vel accumsan ligula.
</div>
</body>
就个人而言,我喜欢编写自己的函数。所以这就是我的方法......
JavaScript
function removeElementsByClass(className){
var elements = document.getElementsByClassName(className);
while(elements.length > 0){
elements[0].parentNode.removeChild(elements[0]);
}
}
然后...
removeElementsByClass('.username')
当然,选择简单的选项并不丢脸(但了解幕后发生的事情会很有帮助)。
jQuery
$('.username').remove();
注意: 这只会删除具有分配的 class 名称的元素。
因此,您需要为目标行提供一个 class 名称,或者通过包含额外的 parentNode
...
elements[0].parentNode.parentNode.removeChild(elements[0]);
您可以根据您设置的用户名变量在 div.layout 元素(或其他父标签)上设置一个 class,然后调整您的 CSS 网格以重新定义CSS 网格 columns/rows 基于 class。
(我对 React 不是很熟悉,但是如果没记错的话你可以像这样有条件地设置一个 class)
<div className={"layout " + (this.props.usernameShown ? 'username-avail' : 'username-unavail')}>
然后在您的 CSS 文件中,您可以定义 CSS 网格,例如
.layout {
display: grid;
grid-template-columns: minmax(200px, auto) minmax(200px, 300px) minmax(900px, auto) minmax(200px, auto);
grid-gap: 5px;
height: calc(100vh);
}
.username-avail.layout {
/* Four rows */
grid-template-rows: 60px 60px 60px minmax(700px, auto);
}
.username-unavail.layout {
/* Three rows */
grid-template-rows: 60px 60px minmax(700px, auto);
}
创建显式 轨道后,这些轨道是使用以下属性创建的行和列:
grid-template-rows
grid-template-columns
grid-template-areas
grid
(一个shorthand)
...您被那些曲目困住了。他们不会消失。
您尝试在网格项目 (.username
) 上删除带有 display: none
的显式行是行不通的。该命令在项目级别运行,但该行是在容器级别创建的。
如果要构建具有动态流入和流出轨道的网格,请使用隐式,而不是显式轨道。
隐式轨道是自动创建的行和列,用于容纳位于显式网格之外的网格项目。
当没有网格项占据隐式轨道时,该轨道根本不存在。
我根据您的代码在下面发布了两个示例。
- 第一个示例显示
.username
的一行,另一个示例不显示; grid-template-rows
已被删除,因此没有明确的行;所有行都是隐式的;- 先前在
grid-template-rows
上设置的高度已移至其各自的网格项; - 隐式行高由
grid-auto-rows
控制,其初始值为auto
(基于内容),因此与前一点配合得很好;并且, - 因为您正在处理隐式轨道,所以源顺序很重要。
用户名行
.layout {
display: grid;
grid-template-columns: minmax(200px, auto) minmax(200px, 300px) minmax(900px, auto) minmax(200px, auto);
grid-gap: 5px;
height: 100vh;
}
/* implicit first row */
.navbar {
height: 60px;
grid-column: 1 / -1;
background-color: #3a3f51;
border-bottom: 1px solid #797d89;
text-align: center;
color: aliceblue;
}
/* implicit second row */
.username {
/* display: none; */
height: 60px;
grid-column: 1 / -1;
background-color: #f7f9f9;
border-bottom: 1px solid #dee5e7;
text-align: center;
}
/* implicit third row (start) */
.statement-list {
height: 60px;
grid-column: 2 / 3;
max-height: 600px;
}
/* implicit third row */
.title {
height: 60px;
grid-column: 3 / 4;
grid-row: 3 / 4;
}
.content {
min-height: 700px;
grid-column: 3 / 4;
overflow-x: auto;
overflow-y: auto;
}
body {
margin: 0;
}
<body class="layout">
<div class="navbar">About</div>
<div class="username">CSS Grid User</div>
<div class="title">Lorem Ipsum</div>
<div class="statement-list">
Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna. Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus
lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna.
</div>
<div class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet a odio quis commodo. In nisl justo, tincidunt vel aliquet eget, mollis eget lorem. Aenean sit amet nibh eget nunc sodales vestibulum id ac ante. Nullam eleifend sodales ipsum, sed
porta tellus posuere molestie. Vestibulum congue porta odio sed iaculis. Phasellus varius sodales ullamcorper. Praesent consectetur ante eget turpis pretium, eget sagittis leo volutpat. Aenean posuere, sapien quis placerat pulvinar, lectus est interdum
dui, at pretium risus sapien et neque. Sed eu fringilla turpis. Ut viverra, nisl non euismod sollicitudin, tellus lectus finibus leo, in ornare sem mauris non eros. Fusce augue est, rhoncus vitae tristique in, malesuada nec libero. Sed venenatis vehicula
ultricies. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce interdum auctor ante a fermentum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam malesuada
scelerisque tortor ac faucibus. Integer pharetra eget velit a tempus. Aenean at lobortis massa, vel accumsan ligula.
</div>
没有用户名行(只需添加display: none
)
.layout {
display: grid;
grid-template-columns: minmax(200px, auto) minmax(200px, 300px) minmax(900px, auto) minmax(200px, auto);
grid-gap: 5px;
height: 100vh;
}
/* implicit first row */
.navbar {
height: 60px;
grid-column: 1 / -1;
background-color: #3a3f51;
border-bottom: 1px solid #797d89;
text-align: center;
color: aliceblue;
}
/* implicit second row */
.username {
display: none; /* ADDED */
height: 60px;
grid-column: 1 / -1;
background-color: #f7f9f9;
border-bottom: 1px solid #dee5e7;
text-align: center;
}
/* implicit third row (start) */
.statement-list {
height: 60px;
grid-column: 2 / 3;
max-height: 600px;
}
/* implicit third row */
.title {
height: 60px;
grid-column: 3 / 4;
grid-row: 3 / 4;
}
.content {
min-height: 700px;
grid-column: 3 / 4;
overflow-x: auto;
overflow-y: auto;
}
body {
margin: 0;
}
<body class="layout">
<div class="navbar">About</div>
<div class="username">CSS Grid User</div>
<div class="title">Lorem Ipsum</div>
<div class="statement-list">
Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna. Phasellus commodo sit amet eros non pharetra. Phasellus consequat augue est, ornare finibus
lectus auctor non. Praesent rutrum odio tortor. Proin id massa magna.
</div>
<div class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean laoreet a odio quis commodo. In nisl justo, tincidunt vel aliquet eget, mollis eget lorem. Aenean sit amet nibh eget nunc sodales vestibulum id ac ante. Nullam eleifend sodales ipsum, sed
porta tellus posuere molestie. Vestibulum congue porta odio sed iaculis. Phasellus varius sodales ullamcorper. Praesent consectetur ante eget turpis pretium, eget sagittis leo volutpat. Aenean posuere, sapien quis placerat pulvinar, lectus est interdum
dui, at pretium risus sapien et neque. Sed eu fringilla turpis. Ut viverra, nisl non euismod sollicitudin, tellus lectus finibus leo, in ornare sem mauris non eros. Fusce augue est, rhoncus vitae tristique in, malesuada nec libero. Sed venenatis vehicula
ultricies. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce interdum auctor ante a fermentum. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam malesuada
scelerisque tortor ac faucibus. Integer pharetra eget velit a tempus. Aenean at lobortis massa, vel accumsan ligula.
</div>
规格参考: