最优雅的方式制作2x2盒div

时间:2014-08-17 22:54:27

标签: html css angularjs

我已经建立了一个类似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;
}

移动视图(首选): mobile view

桌面视图(希望看起来像移动视图): desktop view

3 个答案:

答案 0 :(得分:2)

使用标记的最简单的解决方案是设置row的宽度。您的选择是128px,总边距为16px,因此将row的宽度设置为两倍,并且可以多一点,以允许在inline(-block)元素之间添加大约4px的空白。

.row
{
     width:300px;
}

Demo

我不会说这是最优雅的解决方案,只是最简单的修复而不重构代码。您还可以使用float:left来试验inline block而不是.choice:nth-child(odd){clear:both},以便让所有其他元素在新行上开始。

Demo

答案 1 :(得分:1)

Most elegant?也许是一个框架

Bootstrap

实现这一点

<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>