Волшебный Круг: Css-Головоломка

Доброго времени суток, уважаемые хабровцы.

Недавно Уго Жиродель , он же CSS-гоблин, SASS-хакер и Margin-психопат, опубликовал очень интересную CSS-головоломка за сообразительность.



Волшебный круг: CSS-головоломка

Сможете ли вы выполнить это, учитывая следующие правила?

  • Круг в центре должен быть прозрачным, чтобы был виден фон.

  • Расстояние между левым и правым блоками, а также между верхним и нижним должно быть одинаковым
  • Если в блоке есть дочерние элементы, содержимое должно отображаться.

  • DOM должен выглядеть так: ul > li > раздел > верхний + нижний колонтитул
  • Запрещен JavaScript или изображения.

  • Еще добавлю от себя: Вы не можете использовать CSS Shape и Clip Path.
Чтоб не лениться - рамка уже есть .

Сделанный? Базовый HTML:

  
  
  
  
   

<ul class="boxes"> <li class="box box-alpha"> <section class="box-content"> <header class="box-header"></header> <footer class="box-footer"></footer> </section> </li> <li class="box box-beta"> <section class="box-content"> <header class="box-header"></header> <footer class="box-footer"></footer> </section> </li> <li class="box box-gamma"> <section class="box-content"> <header class="box-header"></header> <footer class="box-footer"></footer> </section> </li> <li class="box box-delta"> <section class="box-content"> <header class="box-header"></header> <footer class="box-footer"></footer> </section> </li> </ul>

Я не буду заполнять место в этом посте тривиальными стилями, отражающими и позиционирующими блоки.

Укажу лишь появление круга в самом центре, одинаковое во всех примерах:

.

boxes:after { background: none repeat scroll 0 0 #34495E; border: 0.5em solid #2C3D50; border-radius: 50%; content: " "; height: 5.5em; left: 50%; margin-left: -2.75em; position: absolute; top: 10.75em; width: 5.5em; }



Первый способ: радиальный градиент

Необходимо задать правильные радиальные градиенты с цветом и прозрачностью для всех элементов футера для верхних блоков и всех элементов хедера для нижних блоков.

На первый взгляд, это самое тривиальное решение, но в нем есть одна особенность: использовать CSS Calc(), чтобы сделать его отзывчивым:

.

box-alpha .

box-footer { background: radial-gradient(circle at calc(100% + 2em) 7em , rgba(0, 0, 0, 0) 6em, #148F77 6em) repeat scroll 0 0 rgba(0, 0, 0, 0); } .

box-beta .

box-footer { background: radial-gradient(circle at -2em 7em , rgba(0, 0, 0, 0) 6em, #25A25A 6em) repeat scroll 0 0 rgba(0, 0, 0, 0); } .

box-gamma .

box-header { background: radial-gradient(circle at calc(100% + 2em) -2em , rgba(0, 0, 0, 0) 6em, #217DBB 6em) repeat scroll 0 0 rgba(0, 0, 0, 0); } .

box-delta .

box-header { background: radial-gradient(circle at -2em -2em , rgba(0, 0, 0, 0) 6em, #804399 6em) repeat scroll 0 0 rgba(0, 0, 0, 0); }



Второй способ: рамка для псевдоэлементов

Я думаю, что это самый изобретательный способ решить эту проблему.

Для элементов хедера и футера в соответствии с каждым из блоков задайте отступ в нужном направлении.

Затем для каждого раздела и шапки с футером создаем псевдоэлементы:

.

box-alpha .

box-content:before { border-color: #148F77 rgba(0, 0, 0, 0) rgba(0, 0, 0, 0) #148F77; bottom: -7.5em; right: -7.5em; } .

box-content:before { border: 10em solid #FF0000; content: ""; display: block; height: 0; position: absolute; width: 0; } .

box-alpha .

box-content:after { border-color: #148F77; bottom: -10em; right: -10em; } .

box-content:after { border: 2em solid #FF0000; border-radius: 30em; content: ""; display: block; height: 12em; position: absolute; width: 12em; z-index: 0; } .



Обратите внимание на :before для .

box-alpha, у которого нет ширины и высоты.

Давайте вспомним как мы все привыкли делать «стрелки» или треугольники в CSS с использованием границы.

Здесь действует тот же принцип.



Волшебный круг: CSS-головоломка



Третий способ: тени и отрицательные отступы

Мое любимое решение, демонстрирующее доскональное понимание самых тонких нюансов CSS. Как и в предыдущей версии, мы создаем для элементов псевдоэлемент и задаем правильный отступ.

Элемент каждого из блоков, часть которого необходимо разрезать на четверть круга, полностью прозрачен.

Фон задается огромной внешней тенью псевдоэлемента.



.

block__element--cut:before { border-radius: 50%; content: ""; height: 8em; margin: -5em; position: absolute; width: 8em; z-index: -1; } .

block:nth-child(1) .

block__element--cut:before { bottom: 0; box-shadow: 0 0 0 40em #0F414C; right: 0; } .

block:nth-child(2) .

block__element--cut:before { bottom: 0; box-shadow: 0 0 0 40em #673A01; left: 0; } .

block:nth-child(3) .

block__element--cut:before { box-shadow: 0 0 0 40em rgba(187, 169, 255, 0.65); right: 0; top: 0; } .

block:nth-child(4) .

block__element--cut:before { box-shadow: 0 0 0 40em rgba(176, 214, 95, 0.65); left: 0; top: 0; }

Но самое элегантное здесь не тень.

И используя отрицательное значение маржа: -5em .

При абсолютном позиционировании вправо, снизу к элементу будут применяться значения поля-право: -5em и поля-дна: -5ем соответственно.

Оригинальное решение Хьюго на SASS можно посмотреть здесь .

Он использует box-shadow, как в третьем примере.

Вспомнив в конце мой вчерашний перевод «Об этом помнят только разработчики 90-х» , хочу сказать, что лет через 15 мы тоже будем улыбаться этим диким методам, которые приведены в этом посте.

Спасибо всем за внимание.

Теги: #головоломка #CSS #HTML #Разработка сайтов #CSS #HTML

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.