Форма коробки с прямоугольными трапециями
Мне интересно, может ли эта форма быть сделана в css3 с минимальным количеством html:
![Screenshot]()
До сих пор мне удалось это сделать:
.wrapper {
position: relative;
}
.box {
width: 100px;
height: 100px;
border: 1px solid #000;
position: absolute;
top: 100px;
left: 100px;
}
.box:before {
content: "";
border: 1px solid #000;
border-bottom: 1px solid #fff;
width: 50%;
height: 10px;
position: absolute;
top: -12px;
left: -1px;
}
.box:after {
content: "";
border: 1px solid #000;
border-top: 1px solid #fff;
width: 50%;
height: 10px;
position: absolute;
bottom: -12px;
right: -1px;
}
<div class="wrapper">
<div class="box"></div>
</div>
Ответы
Ответ 1
Форма не нуждается в дополнительных элементах
Форма может быть создана только с помощью <div>
:
-
Левая сторона создается с левыми, верхними и нижними границами div.
-
Правая сторона сделана :before
, а ее верхняя, правая и нижняя границы
-
Пространства, соединяющие два поля, создаются с помощью :after
благодаря skewY
Обратите внимание на поддержку браузера свойства transform. Для IE 9 требуется префикс -ms-
, а для браузера Safari и Android требуется -webkit-
.
![Screenshot]()
Рабочий пример - только форма
CSS был сжат, а стиль границы псевдоэлементов наследуется от самого div.
div {
border: solid 4px #000;
border-right-width: 0;
width: 100px;
height: 200px;
position: relative;
}
div:before,div:after {
content: '';
display: block;
height: 100%;
width: 100%;
border: inherit;
border-right-width: 4px;
border-left: none;
position: absolute;
left: 100%;
top: 13px;
margin-left: 20px;
}
div:after {
width: 20px;
border-right: none;
top: 5px;
transform: skewY(40deg);
margin: 0;
}
<div></div>
Ответ 2
Использование двух разных элементов:
1) Отделите фигуру в двух разных прямоугольных
2) После использования псевдоэлементов after
и before
для создания линии связи.
Мой подход:
![enter image description here]()
.wrapper {
position: relative;
}
.box {
width: 50px;
height: 100px;
border: 4px solid #000;
position: absolute;
top: 100px;
left: 100px;
border-right: 0;
}
.box2 {
width: 50px;
height: 100px;
border: 4px solid #000;
position: absolute;
top: 112px;
left: 164px;
border-left: 0;
}
.box:after {
content: "";
position: absolute;
width: 15px;
border: 2px solid #000;
right: -15px;
top: 2px;
transform: rotate(45deg);
}
.box:before {
content: "";
position: absolute;
width: 15px;
border: 2px solid #000;
right: -15px;
bottom: -10px;
transform: rotate(45deg);
}
<div class="box"></div>
<div class="box2"></div>
Ответ 3
Я использовал четыре div
s: .left
, .right
, .middle-top
и .middle-bottom
; и перекосил .middle-top
и .middle-bottom
, чтобы добавить эти линии связи.
.left {
width: 40px;
height: 100px;
border: 3px solid black;
border-right: 1px solid white;
position: absolute;
top: 50px;
left: 100px;
}
.right {
width: 40px;
height: 100px;
border: 3px solid #000;
border-left: 1px solid white;
position: absolute;
top: 60px;
left: 160px;
}
.middle-top {
width: 20px;
height: 20px;
border-top: 3px solid black;
position: absolute;
transform: matrix(1, 0.5, -0.5, 1, 0, 0);
top: 55px;
left: 137px;
z-index: 9;
}
.middle-bottom {
width: 21px;
height: 20px;
border-top: 3px solid black;
position: absolute;
transform: matrix(1, 0.5, -0.5, 1, 0, 0);
top: 158px;
left: 135px;
z-index: 9;
}
<div class="left"></div>
<div class="middle-top"></div>
<div class="middle-bottom"></div>
<div class="right"></div>