我已经建立了一个类似Buzzfeed的#34;测验应用程序,每个问题有四个答案选项。在移动设备上,我对布局非常满意(一个2x2的盒子)。 但是,在桌面上,答案只是在屏幕上水平显示4个选项。 主要问题是我使用Angular生成所有问题并回答选择,这使得样式有点棘手。 关于如何优雅地提出任何想法。编码html / css所以它总是将答案选项显示为2x2框?我试图使用媒体查询,但感觉就像在大伤口上放一个绑带。
下面的当前代码和图片:
HTML:
<div class="jumbotron text-center" ng-hide="quizComplete">
<h3>{{ questions[number].ask }}</h3>
<div class="row">
<div ng-repeat="answer in questions[number].answers" class="choice">
<div ng-click="recordChoice(answer.points)">
<span class="centerer"></span>
<span class="centered">{{ answer.choice }}</span>
</div>
</div>
</div>
</div>
CSS:
.choice {
position: relative;
display: inline-block;
width: 128px;
height: 128px;
margin: 8px;
background: rgba(183,222,237,1);
background: -moz-linear-gradient(45deg, rgba(183,222,237,1) 0%, rgba(33,180,226,1) 49%, rgba(113,206,239,1) 92%, rgba(183,222,237,1) 100%);
background: -webkit-gradient(left bottom, right top, color-stop(0%, rgba(183,222,237,1)), color-stop(49%, rgba(33,180,226,1)), color-stop(92%, rgba(113,206,239,1)), color-stop(100%, rgba(183,222,237,1)));
background: -webkit-linear-gradient(45deg, rgba(183,222,237,1) 0%, rgba(33,180,226,1) 49%, rgba(113,206,239,1) 92%, rgba(183,222,237,1) 100%);
background: -o-linear-gradient(45deg, rgba(183,222,237,1) 0%, rgba(33,180,226,1) 49%, rgba(113,206,239,1) 92%, rgba(183,222,237,1) 100%);
background: -ms-linear-gradient(45deg, rgba(183,222,237,1) 0%, rgba(33,180,226,1) 49%, rgba(113,206,239,1) 92%, rgba(183,222,237,1) 100%);
background: linear-gradient(45deg, rgba(183,222,237,1) 0%, rgba(33,180,226,1) 49%, rgba(113,206,239,1) 92%, rgba(183,222,237,1) 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#b7deed', endColorstr='#b7deed', GradientType=1 );
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
cursor: pointer;
cursor: hand;
}
.choice div {
position: absolute;
background: transparent;
width: 100%;
height: 100%;
padding: 5px;
top: 0;
left: 0;
text-decoration: none; /* No underlines on the link */
z-index: 10; /* Places the link above everything else in the div */
}
.centerer {
display: inline-block;
height: 100%;
vertical-align: middle;
}
.centered {
display: inline-block;
vertical-align: middle;
color: white;
}
移动视图(首选):
桌面视图(希望看起来像移动视图):
答案 0 :(得分:2)
使用标记的最简单的解决方案是设置row
的宽度。您的选择是128px,总边距为16px,因此将row
的宽度设置为两倍,并且可以多一点,以允许在inline(-block)
元素之间添加大约4px的空白。
.row
{
width:300px;
}
我不会说这是最优雅的解决方案,只是最简单的修复而不重构代码。您还可以使用float:left
来试验inline block
而不是.choice:nth-child(odd){clear:both}
,以便让所有其他元素在新行上开始。
答案 1 :(得分:1)
Most elegant
?也许是一个框架
实现这一点
<div clas="row">
<div class="col-md-3 col-xs-6">
1
</div>
<div class="col-md-3 col-xs-6">
2
</div>
<div class="col-md-3 col-xs-6">
3
</div>
<div class="col-md-3 col-xs-6">
4
</div>
</div>
答案 2 :(得分:0)
有几种解决方案使用angular,但最简单的方法是在第3个元素的开头插入换行符。
<br ng-if="($index) % 2 == 0 && $index != 0"/>
使用ng-repeat时,angular有一个名为$ index的局部范围变量,每次重复时都会递增。我们在其上预先形成一些模块化部门,并确保它不会显示在第一个索引上,并且您拥有所需的部分。
<div class="jumbotron text-center" ng-hide="quizComplete">
<h3>{{ questions[number].ask }}</h3>
<div class="row">
<div ng-repeat="answer in questions[number].answers" class="choice">
<br ng-if="($index) % 2 == 0 && $index != 0"/>
<div ng-click="recordChoice(answer.points)">
<span class="centerer"></span>
<span class="centered">{{ answer.choice }}</span>
</div>
</div>
</div>
</div>