gpt4 book ai didi

html - 递归 CSS 布局

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:55 24 4
gpt4 key购买 nike

我正在尝试创建一个基于黄金比例 (1:1.618) 的响应式布局,我希望它可以无限递归。

我知道,在这么多层之后它永远不会被使用,但我开始沉迷于我无法弄清楚如何使它无限递归的事实!

这里是:

* { box-sizing: border-box; }
.top {
width: 100%;
height: 100%;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}

/**
*
* GOLDEN RATIO LAYOUT
*
**/

/**
* Default layout is left to right, top to bottom
* To use the Golden Ratio Layout, create a container.
* Within that container, have only two childen.
* The first child should have the class .large-side,
* and the second child should have the class .small-side .
* I suggest nesting layouts on the small side, where the
* element would have .small-side and .golden-ratio-layout .
**/

.golden-ratio-layout {
display: flex;
flex-wrap: nowrap;
flex-direction: column;
}
.golden-ratio-layout > .large-side {
flex: 1.618 1 0%;
}
.golden-ratio-layout > .small-side {
flex: 1 1 0%;
}
.golden-ratio-layout .panel-wrapper {
padding: 0;
}
.golden-ratio-layout .golden-ratio-panel {
width: 100%;
height: 100%;
border: 1px solid black;
display: flex;
align-items: center;
justify-content: center;
}

/* Standard flow */
.golden-ratio-layout .golden-ratio-layout {
flex-direction: column;
}
.golden-ratio-layout > .golden-ratio-layout {
flex-direction: row;
}
.golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: column-reverse;
}
.golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: row-reverse;
}

/* Reverse flow */
.golden-ratio-layout.reverse {
flex-direction: column-reverse;
}
.golden-ratio-layout.reverse .golden-ratio-layout {
flex-direction: column-reverse;
}
.golden-ratio-layout.reverse > .golden-ratio-layout {
flex-direction: row-reverse;
}
.golden-ratio-layout.reverse > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: column;
}
.golden-ratio-layout.reverse > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: row;
}

@media screen and (orientation:landscape) {
.golden-ratio-layout {
flex-direction: row;
}

/* Standard flow */
.golden-ratio-layout .golden-ratio-layout {
flex-direction: row;
}
.golden-ratio-layout > .golden-ratio-layout {
flex-direction: column;
}
.golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: row-reverse;
}
.golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: column-reverse;
}

/* Reverse flow */
.golden-ratio-layout.reverse {
flex-direction: row-reverse;
}
.golden-ratio-layout.reverse .golden-ratio-layout {
flex-direction: row-reverse;
}
.golden-ratio-layout.reverse > .golden-ratio-layout {
flex-direction: column-reverse;
}
.golden-ratio-layout.reverse > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: row;
}
.golden-ratio-layout.reverse > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: column;
}
}
<div class="top golden-ratio-layout">
<div class="large-side panel-wrapper" >
<div class="golden-ratio-panel" >1</div>
</div>
<div class="small-side golden-ratio-layout" >
<div class="large-side panel-wrapper" >
<div class="golden-ratio-panel" >2</div>
</div>
<div class="small-side golden-ratio-layout" >
<div class="large-side panel-wrapper" >
<div class="golden-ratio-panel" >3</div>
</div>
<div class="small-side golden-ratio-layout" >
<div class="large-side panel-wrapper" >
<div class="golden-ratio-panel" >4</div>
</div>
<div class="small-side panel-wrapper" >
<div class="golden-ratio-panel" >5</div>
</div>
</div>
</div>
</div>
</div>

看起来不错吧?

很有可能,这将是所有需要的,因为我们可能不想超过五个面板,但看看当我们添加第六个面板时会发生什么:

* { box-sizing: border-box; }
.top {
width: 100%;
height: 100%;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}

/**
*
* GOLDEN RATIO LAYOUT
*
**/

/**
* Default layout is left to right, top to bottom
* To use the Golden Ratio Layout, create a container.
* Within that container, have only two childen.
* The first child should have the class .large-side,
* and the second child should have the class .small-side .
* I suggest nesting layouts on the small side, where the
* element would have .small-side and .golden-ratio-layout .
**/

.golden-ratio-layout {
display: flex;
flex-wrap: nowrap;
flex-direction: column;
}
.golden-ratio-layout > .large-side {
flex: 1.618 1 0%;
}
.golden-ratio-layout > .small-side {
flex: 1 1 0%;
}
.golden-ratio-layout .panel-wrapper {
padding: 0;
}
.golden-ratio-layout .golden-ratio-panel {
width: 100%;
height: 100%;
border: 1px solid black;
display: flex;
align-items: center;
justify-content: center;
}

/* Standard flow */
.golden-ratio-layout .golden-ratio-layout {
flex-direction: column;
}
.golden-ratio-layout > .golden-ratio-layout {
flex-direction: row;
}
.golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: column-reverse;
}
.golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: row-reverse;
}

/* Reverse flow */
.golden-ratio-layout.reverse {
flex-direction: column-reverse;
}
.golden-ratio-layout.reverse .golden-ratio-layout {
flex-direction: column-reverse;
}
.golden-ratio-layout.reverse > .golden-ratio-layout {
flex-direction: row-reverse;
}
.golden-ratio-layout.reverse > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: column;
}
.golden-ratio-layout.reverse > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: row;
}

@media screen and (orientation:landscape) {
.golden-ratio-layout {
flex-direction: row;
}

/* Standard flow */
.golden-ratio-layout .golden-ratio-layout {
flex-direction: row;
}
.golden-ratio-layout > .golden-ratio-layout {
flex-direction: column;
}
.golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: row-reverse;
}
.golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: column-reverse;
}

/* Reverse flow */
.golden-ratio-layout.reverse {
flex-direction: row-reverse;
}
.golden-ratio-layout.reverse .golden-ratio-layout {
flex-direction: row-reverse;
}
.golden-ratio-layout.reverse > .golden-ratio-layout {
flex-direction: column-reverse;
}
.golden-ratio-layout.reverse > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: row;
}
.golden-ratio-layout.reverse > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: column;
}
}
<div class="top golden-ratio-layout">
<div class="large-side panel-wrapper" >
<div class="golden-ratio-panel" >1</div>
</div>
<div class="small-side golden-ratio-layout" >
<div class="large-side panel-wrapper" >
<div class="golden-ratio-panel" >2</div>
</div>
<div class="small-side golden-ratio-layout" >
<div class="large-side panel-wrapper" >
<div class="golden-ratio-panel" >3</div>
</div>
<div class="small-side golden-ratio-layout" >
<div class="large-side panel-wrapper" >
<div class="golden-ratio-panel" >4</div>
</div>
<div class="small-side golden-ratio-layout" >
<div class="large-side panel-wrapper" >
<div class="golden-ratio-panel" >5</div>
</div>
<div class="small-side panel-wrapper" >
<div class="golden-ratio-panel" >6</div>
</div>
</div>
</div>
</div>
</div>
</div>

没用!

好吧,让我们看看最后的.golden-ratio-layout

我们可以通过以下方式定位此元素:

.golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: {{ whatever }};
}

如果我们添加该规则,它将得到修复,但是我们将确保我们需要为我们想要支持的每个深度级别添加规则。

那么,我们如何才能支持这些嵌套规则的无限深度级别呢?可能吗?

最佳答案

你有两个问题。

首先是您的 HTML。在您的工作示例中,您重复了 golden-ratio-layout -> panel-wrapper -> golden-ratio-panel 的模式。但是在你的坏例子中,你在最后一级省略了黄金比例布局。添加它会修复故障行为,但不会解决所有问题。

第二个问题是在第四层之后,您将继续在框的顶部添加框 - 您要实现的螺旋不会重复。如果您向背景添加颜色,您可以看到会发生什么。指定第四层黄金比例布局的规则只是重复,您的意图是从第一层开始重复所有四个规则。

为了解决这个问题,我不得不求助于添加一个 reset 类,从第一个 div 开始,每隔四个 div 应用一次。我重写了更改 flex-direction 的 CSS 规则,因此规则中最顶层的类是 reset。如果我能想出如何使用伪选择器,我早就这么做了。

* { box-sizing: border-box; }
.top {
width: 100%;
height: 100%;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
}

.golden-ratio-layout {
display: flex;
flex-wrap: nowrap;
flex-direction: column;
}
.golden-ratio-layout > .large-side {
flex: 1.618 1 0%;
}
.golden-ratio-layout > .small-side {
flex: 1 1 0%;
}
.golden-ratio-layout .panel-wrapper {
padding: 0;
box-shadow: 1px 1px 10px 2px #024;
}
.golden-ratio-layout .golden-ratio-panel {
width: 100%;
height: 100%;
border: 1px solid black;
display: flex;
align-items: center;
justify-content: center;
}

/* Relevant changes past this point */
/* Standard flow */
.golden-ratio-layout.reset {
flex-direction: column;
background: #800;
color: white;

}
.golden-ratio-layout.reset > .golden-ratio-layout {
flex-direction: row;
background: #601;
}
.golden-ratio-layout.reset > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: column-reverse;
background: #402;
}
.golden-ratio-layout.reset > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: row-reverse;
background: #203;
}

@media screen and (orientation:landscape) {
.golden-ratio-layout {
flex-direction: row;
}

/* Standard flow */
.golden-ratio-layout.reset {
flex-direction: row;
}
.golden-ratio-layout.reset > .golden-ratio-layout {
flex-direction: column;
}
.golden-ratio-layout.reset > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: row-reverse;
}
.golden-ratio-layout.reset > .golden-ratio-layout > .golden-ratio-layout > .golden-ratio-layout {
flex-direction: column-reverse;
}

}
<div class="top golden-ratio-layout reset">
<div class="large-side panel-wrapper">
<div class="golden-ratio-panel">1</div>
</div>
<div class="small-side golden-ratio-layout">
<div class="large-side panel-wrapper">
<div class="golden-ratio-panel">2</div>
</div>
<div class="small-side golden-ratio-layout">
<div class="large-side panel-wrapper">
<div class="golden-ratio-panel">3</div>
</div>
<div class="small-side golden-ratio-layout">
<div class="large-side panel-wrapper">
<div class="golden-ratio-panel">4</div>
</div>
<div class="small-side golden-ratio-layout reset">
<div class="large-side panel-wrapper">
<div class="golden-ratio-panel">5</div>
</div>
<div class="small-side golden-ratio-layout">
<div class="large-side panel-wrapper">
<div class="golden-ratio-panel">6</div>
</div>
<div class="small-side golden-ratio-layout reset">
<div class="large-side panel-wrapper">
<div class="golden-ratio-panel">7</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

关于html - 递归 CSS 布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54578637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com