我正在创建一个响应式网格来显示图像和其他信息。
我发布了example in codepen。基本上我有 2个问题:
当我将窗口调整到最小尺寸(1列)时,我得到一个不应存在的右边距。
独立于大小,最后一行总是有一个底部边距。
标记如下:
<div class="wrapper">
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
</div>
CSS(LESS)是:
.wrapper {
background-color: red;
margin: 0 5%;
.clear;
div {
background-color: green;
float: left;
.make(@count) {
margin: 0 (6 / (@count - 1) * 1%) (6 / (@count - 1) * 1%) 0;
width: (94 / @count) * 1%;
&:nth-child(@{count}n) {margin-right: 0;}
} // make
@media screen and (max-width: 480px) {.make(1);}
@media screen and (min-width: 481px) and (max-width: 768px) {.make(2);}
@media screen and (min-width: 769px) and (max-width: 1024px) {.make(3);}
@media screen and (min-width: 1025px) {.make(4);}
img {
display: block;
max-width: 100%;
height: auto;
outline: 0;
}
}
}
.clear {
&:after {
content: "";
display: table;
clear: both;
} // :after
} // clear
谢谢你, 米格尔
答案 0 :(得分:1)
修正正确的保证金问题
如果您检查LESS脚本生成的CSS,您会看到以下内容:
.make(1)
:
media screen and (max-width: 480px) {
.wrapper div {
margin: 0 Infinity% Infinity% 0;
width: 94%;
}
.wrapper div:nth-child( 1n) {
margin-right: 0;
}
}
.make(2)
:
@media screen and (min-width: 481px) and (max-width: 768px) {
.wrapper div {
margin: 0 6% 6% 0;
width: 47%;
}
.wrapper div:nth-child( 2n) {
margin-right: 0;
}
}
对于.make(1)
的情况,由于6 / (@count - 1)
会导致除以零错误,因此您在LESS中收到错误条件,因此您会看到Infinity%
值无效
在CSS中。
在这种情况下,div
选择器的CSS规则并不完全有效,因此边距值不是您所期望的。
您可能需要将.make(1)
的案例视为一种特殊情况并对CSS进行硬编码
你需要的规则。
您可以使用default()
函数和gaurd条件(when
)处理LESS中一列的特殊情况。
请参阅以下示例:
http://lesscss.org/functions/#misc-functions-default
修复LESS / CSS的一种方法如下:
.make(1) {
margin: 0;
}
.make(@count) when (default()) {
margin: 0 (6 / (@count - 1) * 1%) (6 / (@count - 1) * 1%) 0;
width: (94 / @count) * 1%;
&:nth-child(@{count}n) {margin-right: 0;}
} // make
,结果如下所示:http://codepen.io/anon/pen/DeEhK
修复底部保证金问题
最底层的问题有点棘手。
我默认将底部边距设置为零,然后将上边距设置为所需的值。
然后我会将顶行元素的上边距设置为零。
对于两列的情况,我可能会执行以下操作:
.make(2) {
margin: (6 / (2 - 1) * 1%) (6 / (2 - 1) * 1%) 0 0;
width: (94/2)*1%;
&:nth-child(2n) {margin-right: 0;}
&:nth-child(1) {margin-top: 0;}
&:nth-child(2) {margin-top: 0;}
}
我使用nth-child({1,2})
将上边距归零。
对于其他情况(1,3和4列),您需要类似的规则。
选择顶行项目然后选择底行项目更容易,因此使用上边距设置比下边距更容易。
答案 1 :(得分:1)
您可以查看我的PocketGrid微网格框架,它会让您的生活更轻松! ;)
这是一个纯CSS网格,但您也可以将它与LESS一起使用。
我为你制作了一个CodePen: http://codepen.io/arnaudleray/pen/HgweL?editors=110
HTML 与您的相同:
<div class="wrapper">
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
</div>
然后你可以在LESS文件的开头导入PocketGrid (请让版权所有):
//@import (less) "http://arnaudleray.github.io/pocketgrid/pocketgrid.css"
/*! PocketGrid 1.1.0
* Copyright 2013 Arnaud Leray
* MIT License
*/
/* Border-box-sizing */
.block-group, .block, .block-group:after, .block:after, .block-group:before, .block:before {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
/* Clearfix */
.block-group {
*zoom: 1;
}
.block-group:before, .block-group:after {
display: table;
content: "";
line-height: 0;
}
.block-group:after {
clear: both;
}
.block-group {
/* ul/li compatibility */
list-style-type: none;
padding: 0;
margin: 0;
}
/* Nested grid */
.block-group > .block-group {
clear: none;
float: left;
margin: 0 !important;
}
/* Default block */
.block {
float: left;
width: 100%;
}
之后,您可以在LESS文件中设置类:
您的.wrapper
必须延长.block-group
,并且您的子女div必须延长.block
。
body {
margin: 0;
}
.wrapper {
&:extend(.block-group);
background-color: red;
div {
&:extend(.block);
background-color: green;
img {
display: block;
width: 100%;
height: auto;
outline: 0;
}
}
}
.make(@count) {
.wrapper div {
width: (100% / @count);
}
// PocketGrid can manage gutters in pixels, percents or even ems...
@gutter: 10px * @count;
.block-group { margin: -@gutter 0 0 -@gutter; }
.block { padding: @gutter 0 0 @gutter; }
} // make
@media screen and (max-width: 480px) { .make(1); }
@media screen and (min-width: 481px) and (max-width: 768px) { .make(2); }
@media screen and (min-width: 769px) and (max-width: 1024px) { .make(3); }
@media screen and (min-width: 1025px) { .make(4); }
您可以在此处获得有关PocketGrid的更多示例:http://arnaudleray.github.io/pocketgrid/docs/
希望这有帮助!
答案 2 :(得分:0)
您需要做的是在媒体查询中添加一些更改并在HTML中添加类。我已经粘贴了更改后的代码,它可以根据您的需要正常工作。
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CodePen - A Pen by mdmoura</title>
<link rel="stylesheet" href="css/style.css" media="screen" type="text/css" />
</head>
<body>
<div class="wrapper">
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
<div><img src="http://placehold.it/400x200"/></div>
<div class="temp1"><img src="http://placehold.it/400x200"/></div>
<div class="temp"><img src="http://placehold.it/400x200"/></div>
<div class="temp"><img src="http://placehold.it/400x200"/></div>
</div>
</body>
CSS
.wrapper {
background-color: red;
margin: 0 5%;
}
.wrapper:after {
content: "";
display: table;
clear: both;
}
.wrapper div {
background-color: green;
float: left;
}
.wrapper .temp {
margin: 0 0 0 0;
}
@media screen and (max-width: 480px) {
.wrapper div {
margin: 0 Infinity% Infinity% 0;
width: 94%;
}
.wrapper .temp {
margin: 0 Infinity% 0 0;
}
.wrapper { background-color: white;}
.wrapper div:nth-child( 1n) {
margin-right: 0;
}
}
@media screen and (min-width: 481px) and (max-width: 768px) {
.wrapper div {
margin: 0 6% 6% 0;
width: 47%;
}
.wrapper div:nth-child( 2n) {
margin-right: 0;
}
.wrapper .temp {
margin: 0 6% 0 0;
}
}
@media screen and (min-width: 769px) and (max-width: 1024px) {
.wrapper div {
margin: 0 3% 3% 0;
width: 31.33333333%;
}
.wrapper .temp {
margin: 0 3% 0 0;
}
.wrapper .temp1 {
margin: 0 3% 0 0;
}
.wrapper div:nth-child( 3n) {
margin-right: 0;
}
}
@media screen and (min-width: 1025px) {
.wrapper div {
margin: 0 2% 2% 0;
width: 23.5%;
}
.wrapper .temp {
margin: 0 2% 0 0;
}
.wrapper div:nth-child( 4n) {
margin-right: 0;
}
}
.wrapper div img {
display: block;
max-width: 100%;
height: auto;
outline: 0;
}
.clear:after {
content: "";
display: table;
clear: both;
}