使用 CSS 的复杂响应式 HTML 布局
Complex responsive HTML layout using CSS
我需要在网页上创建一个新闻部分(它是 SharePoint,但这可能不是很相关),看起来类似于下图。
我的问题是 HTML 将从新闻项目列表中动态生成,因此每个项目的代码都是相同的 - 即。我不认为我可以添加代码来区分左侧列项目和右侧列项目。
代码的格式是handlebars.js,但是那里缺乏逻辑似乎阻止我在那里做?
所以在把手中使用一个简单的{{#each items}},我最终得到这样的结果:
<div class="newsContainer">
<div class="newsItem">
<a href="link1"><img src="image1"/></a>
<div class="newsTitle"><a href="link1">Headline 1</a></div>
<div class="newsSummary">Summary 1</div>
</div>
<div class="newsItem">
<a href="link2"><img src="image2"/></a>
<div class="newsTitle"><a href="link2">Headline 2</a></div>
<div class="newsSummary">Summary 2</div>
</div>
<div class="newsItem">
<a href="link3"><img src="image3"/></a>
<div class="newsTitle"><a href="link3">Headline 3</a></div>
<div class="newsSummary">Summary 3</div>
</div>
<div class="newsItem">
<a href="link4"><img src="image4"/></a>
<div class="newsTitle"><a href="link4">Headline 4</a></div>
<div class="newsSummary">Summary 4</div>
</div>
</div>
所以我的挑战是使用 CSS 或 CSS 和 JavaScript.
从上面的代码创建下面的布局
我在“:first-of-type”方面取得的进展有限,但我想知道像 FlexBox 这样的东西是否是另一种选择?
谢谢!
您可以创建自己的柱状布局来实现此目的:
.newsContainer {
width: 100%;
}
.col {
position: relative;
float: left;
width: 50%;
}
<div class="newsContainer">
<div class="col">
<div class="newsItem">
<a href="link1"><img src="image1" /></a>
<div class="newsTitle"><a href="link1">Headline 1</a></div>
<div class="newsSummary">Summary 1</div>
</div>
</div><!--End Col 1-->
<div class="col">
<div class="newsItem">
<a href="link2"><img src="image2" /></a>
<div class="newsTitle"><a href="link2">Headline 2</a></div>
<div class="newsSummary">Summary 2</div>
</div>
<div class="newsItem">
<a href="link3"><img src="image3" /></a>
<div class="newsTitle"><a href="link3">Headline 3</a></div>
<div class="newsSummary">Summary 3</div>
</div>
<div class="newsItem">
<a href="link4"><img src="image4" /></a>
<div class="newsTitle"><a href="link4">Headline 4</a></div>
<div class="newsSummary">Summary 4</div>
</div>
</div><!--End Col 2-->
</div>
您可以使用浮动 div 来实现所需的布局。我给你写了一个小例子。
我没有编辑您提供的任何 HTML
。因此,您可以从下方 复制 并 粘贴 CSS
。
请参阅下面的代码段。
* {
box-sizing: border-box;
}
/**
This is a clearfix. Floated divs have to be cleared, else the layout will mess up
*/
.newsContainer::before,
.newsContainer::after,
.newsContainer .newsItem::before,
.newsContainer .newsItem::after {
display: table;
content: " ";
clear: both;
}
.newsContainer .newsItem {
float: left;
}
.newsContainer .newsItem:first-child {
width: 50%;
}
/**
Margin-left 5% acts as spacing
Put all divs near the first child, except :first-child using CSS :not() selector
*/
.newsContainer .newsItem:not(:first-child) {
width: 45%;
margin-left: 5%;
}
/**
Overwrite above CSS, now set float right on the 4th and 5th divs. You can add
more divs `.newsItem:nth-child(6) ... etc` if more divs are present.
Set margin left value same as .newsContainer .newsItem:first-child width
*/
.newsContainer .newsItem:nth-child(5) {
float: right;
margin-left: 50%;
}
/**
This is just for responive images
*/
.newsContainer .newsItem img {
max-width: 100%;
max-height: 100%;
}
.newsContainer .newsItem .newsTitle > a,
.newsContainer .newsItem .newsSummary {
color: #969696;
}
.newsContainer .newsItem .newsTitle > a {
font-size: 28px;
text-decoration: none;
}
.newsContainer .newsItem .newsSummary {
font-size: 16px;
}
.newsContainer .newsItem > div {
padding: 0 15px 15px;
}
.newsContainer .newsItem:not(:first-child) > * {
float: left;
width: 50%;
}
<div class="newsContainer">
<div class="newsItem">
<a href="link1"><img src="https://via.placeholder.com/600x500"/></a>
<div class="newsTitle"><a href="link1">Headline 1</a></div>
<div class="newsSummary">Summary 1</div>
</div>
<div class="newsItem">
<a href="link2"><img src="https://via.placeholder.com/200x200"/></a>
<div class="newsTitle"><a href="link2">Headline 2</a></div>
<div class="newsSummary">Summary 2</div>
</div>
<div class="newsItem">
<a href="link3"><img src="https://via.placeholder.com/200x200"/></a>
<div class="newsTitle"><a href="link3">Headline 3</a></div>
<div class="newsSummary">Summary 3</div>
</div>
<div class="newsItem">
<a href="link4"><img src="https://via.placeholder.com/200x200"/></a>
<div class="newsTitle"><a href="link4">Headline 4</a></div>
<div class="newsSummary">Summary 4</div>
</div>
<div class="newsItem">
<a href="link4"><img src="https://via.placeholder.com/200x200"/></a>
<div class="newsTitle"><a href="link4">Headline 5</a></div>
<div class="newsSummary">Summary 5</div>
</div>
</div>
我需要在网页上创建一个新闻部分(它是 SharePoint,但这可能不是很相关),看起来类似于下图。
我的问题是 HTML 将从新闻项目列表中动态生成,因此每个项目的代码都是相同的 - 即。我不认为我可以添加代码来区分左侧列项目和右侧列项目。
代码的格式是handlebars.js,但是那里缺乏逻辑似乎阻止我在那里做?
所以在把手中使用一个简单的{{#each items}},我最终得到这样的结果:
<div class="newsContainer">
<div class="newsItem">
<a href="link1"><img src="image1"/></a>
<div class="newsTitle"><a href="link1">Headline 1</a></div>
<div class="newsSummary">Summary 1</div>
</div>
<div class="newsItem">
<a href="link2"><img src="image2"/></a>
<div class="newsTitle"><a href="link2">Headline 2</a></div>
<div class="newsSummary">Summary 2</div>
</div>
<div class="newsItem">
<a href="link3"><img src="image3"/></a>
<div class="newsTitle"><a href="link3">Headline 3</a></div>
<div class="newsSummary">Summary 3</div>
</div>
<div class="newsItem">
<a href="link4"><img src="image4"/></a>
<div class="newsTitle"><a href="link4">Headline 4</a></div>
<div class="newsSummary">Summary 4</div>
</div>
</div>
所以我的挑战是使用 CSS 或 CSS 和 JavaScript.
从上面的代码创建下面的布局我在“:first-of-type”方面取得的进展有限,但我想知道像 FlexBox 这样的东西是否是另一种选择?
谢谢!
您可以创建自己的柱状布局来实现此目的:
.newsContainer {
width: 100%;
}
.col {
position: relative;
float: left;
width: 50%;
}
<div class="newsContainer">
<div class="col">
<div class="newsItem">
<a href="link1"><img src="image1" /></a>
<div class="newsTitle"><a href="link1">Headline 1</a></div>
<div class="newsSummary">Summary 1</div>
</div>
</div><!--End Col 1-->
<div class="col">
<div class="newsItem">
<a href="link2"><img src="image2" /></a>
<div class="newsTitle"><a href="link2">Headline 2</a></div>
<div class="newsSummary">Summary 2</div>
</div>
<div class="newsItem">
<a href="link3"><img src="image3" /></a>
<div class="newsTitle"><a href="link3">Headline 3</a></div>
<div class="newsSummary">Summary 3</div>
</div>
<div class="newsItem">
<a href="link4"><img src="image4" /></a>
<div class="newsTitle"><a href="link4">Headline 4</a></div>
<div class="newsSummary">Summary 4</div>
</div>
</div><!--End Col 2-->
</div>
您可以使用浮动 div 来实现所需的布局。我给你写了一个小例子。
我没有编辑您提供的任何 HTML
。因此,您可以从下方 复制 并 粘贴 CSS
。
请参阅下面的代码段。
* {
box-sizing: border-box;
}
/**
This is a clearfix. Floated divs have to be cleared, else the layout will mess up
*/
.newsContainer::before,
.newsContainer::after,
.newsContainer .newsItem::before,
.newsContainer .newsItem::after {
display: table;
content: " ";
clear: both;
}
.newsContainer .newsItem {
float: left;
}
.newsContainer .newsItem:first-child {
width: 50%;
}
/**
Margin-left 5% acts as spacing
Put all divs near the first child, except :first-child using CSS :not() selector
*/
.newsContainer .newsItem:not(:first-child) {
width: 45%;
margin-left: 5%;
}
/**
Overwrite above CSS, now set float right on the 4th and 5th divs. You can add
more divs `.newsItem:nth-child(6) ... etc` if more divs are present.
Set margin left value same as .newsContainer .newsItem:first-child width
*/
.newsContainer .newsItem:nth-child(5) {
float: right;
margin-left: 50%;
}
/**
This is just for responive images
*/
.newsContainer .newsItem img {
max-width: 100%;
max-height: 100%;
}
.newsContainer .newsItem .newsTitle > a,
.newsContainer .newsItem .newsSummary {
color: #969696;
}
.newsContainer .newsItem .newsTitle > a {
font-size: 28px;
text-decoration: none;
}
.newsContainer .newsItem .newsSummary {
font-size: 16px;
}
.newsContainer .newsItem > div {
padding: 0 15px 15px;
}
.newsContainer .newsItem:not(:first-child) > * {
float: left;
width: 50%;
}
<div class="newsContainer">
<div class="newsItem">
<a href="link1"><img src="https://via.placeholder.com/600x500"/></a>
<div class="newsTitle"><a href="link1">Headline 1</a></div>
<div class="newsSummary">Summary 1</div>
</div>
<div class="newsItem">
<a href="link2"><img src="https://via.placeholder.com/200x200"/></a>
<div class="newsTitle"><a href="link2">Headline 2</a></div>
<div class="newsSummary">Summary 2</div>
</div>
<div class="newsItem">
<a href="link3"><img src="https://via.placeholder.com/200x200"/></a>
<div class="newsTitle"><a href="link3">Headline 3</a></div>
<div class="newsSummary">Summary 3</div>
</div>
<div class="newsItem">
<a href="link4"><img src="https://via.placeholder.com/200x200"/></a>
<div class="newsTitle"><a href="link4">Headline 4</a></div>
<div class="newsSummary">Summary 4</div>
</div>
<div class="newsItem">
<a href="link4"><img src="https://via.placeholder.com/200x200"/></a>
<div class="newsTitle"><a href="link4">Headline 5</a></div>
<div class="newsSummary">Summary 5</div>
</div>
</div>