Форма коробки с прямоугольными трапециями

Мне интересно, может ли эта форма быть сделана в 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>