2017-02-21 4 views
0

Я хочу поставить .e div в .second div на 50%. Моя цель - избавиться от пробела между двумя .e divs.Как мне сделать этот макет CSS?

Я хочу сделать это без явного перемещения div вверх (например, position: relative; top: -50%;). Я заметил, что делать float: right; на .first div исправляет проблему макета, но уничтожает порядок содержимого HTML.

Вот картина того, что я пытаюсь сделать: enter image description here

Как я могу сделать эту работу, сохраняя свой HTML в том же порядке?

html, body { 
 
    height: 100%; 
 
    width: 100%; 
 
    margin: 0; 
 
} 
 

 
h1, h2, h3, h4, h5, h6 { 
 
    margin: 0; 
 
} 
 

 
body { 
 
    font-family: 'Montserrat', Helvetica, Arial, sans-serif; 
 
} 
 
body .a { 
 
    background: #f04576; 
 
} 
 
body .b { 
 
    background: #53a2e3; 
 
} 
 
body .c { 
 
    background: #ef4658; 
 
    text-align: right; 
 
} 
 
body .d { 
 
    background: #f4ad49; 
 
    text-align: left; 
 
} 
 
body .e { 
 
    background: #69de92; 
 
} 
 
body .first { 
 
    height: 100%; 
 
    width: 100%; 
 
} 
 
body .second { 
 
    height: 100%; 
 
    width: 100%; 
 
} 
 
body .tall:nth-child(2n) { 
 
    position: relative; 
 
    top: -50%; 
 
} 
 
body .tall, body .long, body .square { 
 
    float: left; 
 
} 
 
body .tall { 
 
    height: calc(100% - 4rem); 
 
    width: calc(25% - 4rem); 
 
    padding: 2rem; 
 
    font-size: 2.5rem; 
 
    text-transform: uppercase; 
 
} 
 
body .long { 
 
    height: calc(50% - 4rem); 
 
    width: calc(50% - 4rem); 
 
    padding: 2rem; 
 
    font-size: 2.5rem; 
 
    text-transform: uppercase; 
 
} 
 
body .square { 
 
    height: calc(50% - 4rem); 
 
    width: calc(25% - 4rem); 
 
    padding: 2rem; 
 
    font-size: 2.5rem; 
 
    text-transform: uppercase; 
 
    text-align: center; 
 
}
<div class='first'> 
 
    <div class='a tall'>A</div> 
 
    <div class='c square'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d long'>D</div> 
 
    <div class='e square'>E</div> 
 
</div> 
 
<div class='second'> 
 
    <div class='a square'>A</div> 
 
    <div class='c long'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d square'>D</div> 
 
    <div class='e tall'>E</div> 
 
</div>

Edit 1: Я не хочу делать position: relative; top: -50%;, потому что если я повторю свой HTML, я остался с огромным зазором после каждого .second дел. Вот пример:

html, 
 
body { 
 
    height: 100%; 
 
    width: 100%; 
 
    margin: 0; 
 
} 
 

 
h1, 
 
h2, 
 
h3, 
 
h4, 
 
h5, 
 
h6 { 
 
    margin: 0; 
 
} 
 

 
body { 
 
    font-family: 'Montserrat', Helvetica, Arial, sans-serif; 
 
} 
 

 
body .a { 
 
    background: #f04576; 
 
} 
 

 
body .b { 
 
    background: #53a2e3; 
 
} 
 

 
body .c { 
 
    background: #ef4658; 
 
    text-align: right; 
 
} 
 

 
body .d { 
 
    background: #f4ad49; 
 
    text-align: left; 
 
} 
 

 
body .e { 
 
    background: #69de92; 
 
} 
 

 
body .first { 
 
    height: 100%; 
 
    width: 100%; 
 
} 
 

 
body .second { 
 
    height: 100%; 
 
    width: 100%; 
 
} 
 

 
body .tall:nth-child(2n) { 
 
    position: relative; 
 
    top: -50%; 
 
} 
 

 
body .tall, 
 
body .long, 
 
body .square { 
 
    float: left; 
 
} 
 

 
body .tall { 
 
    height: calc(100% - 4rem); 
 
    width: calc(25% - 4rem); 
 
    padding: 2rem; 
 
    font-size: 2.5rem; 
 
    text-transform: uppercase; 
 
} 
 

 
body .long { 
 
    height: calc(50% - 4rem); 
 
    width: calc(50% - 4rem); 
 
    padding: 2rem; 
 
    font-size: 2.5rem; 
 
    text-transform: uppercase; 
 
} 
 

 
body .square { 
 
    height: calc(50% - 4rem); 
 
    width: calc(25% - 4rem); 
 
    padding: 2rem; 
 
    font-size: 2.5rem; 
 
    text-transform: uppercase; 
 
    text-align: center; 
 
}
<div class='first'> 
 
    <div class='a tall'>A</div> 
 
    <div class='c square'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d long'>D</div> 
 
    <div class='e square'>E</div> 
 
</div> 
 
<div class='second'> 
 
    <div class='a square'>A</div> 
 
    <div class='c long'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d square'>D</div> 
 
    <div class='e tall'>E</div> 
 
</div> 
 
<!-- Repeating the code --> 
 
<div class='first'> 
 
    <div class='a tall'>A</div> 
 
    <div class='c square'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d long'>D</div> 
 
    <div class='e square'>E</div> 
 
</div> 
 
<div class='second'> 
 
    <div class='a square'>A</div> 
 
    <div class='c long'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d square'>D</div> 
 
    <div class='e tall'>E</div> 
 
</div>

+0

Почему вы не хотите использовать позиционирование? –

+0

Разрыв остается после каждого .секундного div, если я повторяю свой HTML. –

+0

Мое решение исправляет это. Повторяется 8 раз и пробелов нет. –

ответ

1

Вы должны изменить этот код:

body .tall:nth-child(2n) { 
    position: relative; 
    top: -50%; 
} 

к

body .second .tall { 
    position: relative; 
    top: -50%; 
} 

или к

body .second .tall { 
    position: absolute; 
    right: 0; 
} 

html, body { 
 
    height: 100%; 
 
    width: 100%; 
 
    margin: 0; 
 
} 
 

 
h1, h2, h3, h4, h5, h6 { 
 
    margin: 0; 
 
} 
 

 
body { 
 
    font-family: 'Montserrat', Helvetica, Arial, sans-serif; 
 
} 
 
body .a { 
 
    background: #f04576; 
 
} 
 
body .b { 
 
    background: #53a2e3; 
 
} 
 
body .c { 
 
    background: #ef4658; 
 
    text-align: right; 
 
} 
 
body .d { 
 
    background: #f4ad49; 
 
    text-align: left; 
 
} 
 
body .e { 
 
    background: #69de92; 
 
} 
 
body .first { 
 
    height: 100%; 
 
    width: 100%; 
 
} 
 
body .second { 
 
    height: 100%; 
 
    width: 100%; 
 
} 
 
body .second .tall { 
 
    position: absolute; 
 
    right: 0; 
 
} 
 
body .tall, body .long, body .square { 
 
    float: left; 
 
} 
 
body .tall { 
 
    height: calc(100% - 4rem); 
 
    width: calc(25% - 4rem); 
 
    padding: 2rem; 
 
    font-size: 2.5rem; 
 
    text-transform: uppercase; 
 
} 
 
body .long { 
 
    height: calc(50% - 4rem); 
 
    width: calc(50% - 4rem); 
 
    padding: 2rem; 
 
    font-size: 2.5rem; 
 
    text-transform: uppercase; 
 
} 
 
body .square { 
 
    height: calc(50% - 4rem); 
 
    width: calc(25% - 4rem); 
 
    padding: 2rem; 
 
    font-size: 2.5rem; 
 
    text-transform: uppercase; 
 
    text-align: center; 
 
}
<div class='first'> 
 
    <div class='a tall'>A</div> 
 
    <div class='c square'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d long'>D</div> 
 
    <div class='e square'>E</div> 
 
</div> 
 
<div class='second'> 
 
    <div class='a square'>A</div> 
 
    <div class='c long'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d square'>D</div> 
 
    <div class='e tall'>E</div> 
 
</div> 
 
<!-- Repeating the code --> 
 
<div class='first'> 
 
    <div class='a tall'>A</div> 
 
    <div class='c square'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d long'>D</div> 
 
    <div class='e square'>E</div> 
 
</div> 
 
<div class='second'> 
 
    <div class='a square'>A</div> 
 
    <div class='c long'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d square'>D</div> 
 
    <div class='e tall'>E</div> 
 
</div> 
 

 
<div class='first'> 
 
    <div class='a tall'>A</div> 
 
    <div class='c square'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d long'>D</div> 
 
    <div class='e square'>E</div> 
 
</div> 
 
<div class='second'> 
 
    <div class='a square'>A</div> 
 
    <div class='c long'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d square'>D</div> 
 
    <div class='e tall'>E</div> 
 
</div> 
 
<!-- Repeating the code --> 
 
<div class='first'> 
 
    <div class='a tall'>A</div> 
 
    <div class='c square'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d long'>D</div> 
 
    <div class='e square'>E</div> 
 
</div> 
 
<div class='second'> 
 
    <div class='a square'>A</div> 
 
    <div class='c long'>B</div> 
 
    <div class='b long'>C</div> 
 
    <div class='d square'>D</div> 
 
    <div class='e tall'>E</div> 
 
</div>

+1

_ «Я хочу сделать это без явного перемещения div вверх (например, position: relative; top: -50%;)» _ –

+0

Спасибо Крису! Работает отлично. –

+1

@DeepDuggal При всем уважении, почему вы беспокоились о том, что вам не нужно решение, которое перемещало элемент вверх, если бы вы отлично справлялись с решением, которое делает именно это? – AmericanUmlaut

1

Это интересная проблема. К сожалению, я считаю, что ответ на ваш вопрос с ограничениями, которые вы предоставили, заключается в том, что это невозможно.

Нет стиля CSS, который заставит элементы настраиваться вертикально, чтобы заполнить пустое пространство. Независимо от того, что вы делаете, блок C будет перенесен в следующую строку, и после него будут добавлены дополнительные блоки.

0

Возможно, вы захотите использовать flexbox. CSS Grid, вероятно, станет идеальным решением для вашей проблемы, но поскольку это не готово, макет на основе flexbox может работать лучше, чем у вас в настоящее время. Вы могли бы значительно уменьшить сложность вашего макета. Подобно тому, как частичному например:

.a { 
 
    background: #f04576; 
 
    flex: 1; 
 
} 
 
.b { 
 
    background: #53a2e3; 
 
    flex: 3; 
 
} 
 
.c { 
 
    background: #ef4658; 
 
    flex: 4; 
 
} 
 
.d { 
 
    background: #f4ad49; 
 
    flex: 1; 
 
} 
 

 
.top { 
 
    display: flex; 
 
    height:100vh; 
 
} 
 
.left { 
 
    width: 75%; 
 
    height: 100vh; 
 
} 
 
.left-top, .left-bot { 
 
    height: 50vh; 
 
    display: flex; 
 
} 
 
.e { 
 
    background: #69de92; 
 
    width: 25%; 
 
}
<div class='top'> 
 

 
    <div class="left"> 
 
    <div class="left-top"> 
 
     <div class='a '>A</div> 
 
     <div class='c '>B</div> 
 
    </div> 
 
    <div class="left-bot"> 
 
     <div class='b '>C</div> 
 
     <div class='d '>D</div> 
 
    </div> 
 
    </div> 
 
    
 
    <div class='e'>E</div> 
 
    
 
</div>

Смежные вопросы