Создание чувствительной формы облака

Я пытаюсь создать чувствительную форму облака в CSS для проекта. Я стараюсь не делать этого с помощью изображений, CSS или встроенного SVG из-за HTTP-запросов и требований к отзывчивости.

Форма, о которой идет речь, будет такой: (но может быть похожей - небольшие изменения/улучшения были бы классными):

Cloud Shape

Я нашел оба этих вопроса, но они, похоже, не соответствуют моим конкретным потребностям:

Я попытался (и не смог) создать облако с border или box-shadow и должен знать, возможно ли это с помощью CSS или как альтернативного встроенного SVG. Я также видел, что Canvas - тоже вариант, но я предпочел бы держаться подальше от него, поскольку это может быть довольно сложно.

Это моя неудачная попытка

body {
  background: skyblue;
}

.cloud {
  width: 15%;
  height: 10vh;
  background: white;
  position: relative;
  margin: 100px 100px;
  border-radius: 65px;
  box-shadow: black 0 0 10px 10px;
}
.cloud:after {
  content: '';
  position: absolute;
  width: 150px;
  height: 150px;
  top: -60px;
  left: 100px;
  border-radius: 75px;
  background: white;
}
.cloud:before {
  content: '';
  position: absolute;
  width: 70px;
  height: 70px;
  background: white;
  left: 50px;
  top: -30px;
  border-radius: 35px;
}
<div class="cloud"></div>

Ответы

Ответ 1

Форма облака может быть создана с использованием SVG с одним элементом path в SVG. SVG по своей природе масштабируются без каких-либо искажений формы. Поддержка браузера для SVG очень хороша, и откат для IE8 и ниже (при необходимости) может быть предоставлен с использованием VML.

Создание формы

Команды, используемые при рисовании фигуры и их значении, следующие:

  • M 25,60 - Эта команда перемещает перо в точку, которая на 25 пикселей выше начала координат (0,0) по оси X и на 60 пикселей впереди начала координат по оси Y. ( Примечание: Команда написана в верхнем регистре, что указывает на движение absolute, а не движение relative).
  • a 20,20 1 0,0 0,40 - Эта команда создает дугу, радиусы X и Y которой 20 пикселей. Начальная точка дуги равна (25,60), а конечная точка (25,100) (то есть 0px прочь по оси X и 40 пикселей по оси Y).
  • h 50 - Эта команда рисует горизонтальную линию, которая на 50 пикселей впереди относительно начальной точки. Поскольку он относительный, конечная точка будет равна (75 100).
  • a 20,20 1 0,0 0,-40 - Подобно второй команде, это создает другую дугу, радиусы которой равны 20px на любой оси, а ее конечная точка - 40px раньше по отношению к предыдущей точке. Поэтому по существу это создало бы дугу от (75 100) до (75,60). Эта и вторая команда вместе образуют дуги с двух сторон облака.
  • a 10,10 1 0,0 -15,-10 - Еще одна команда дуги для создания одной части изогнутой вершины облака. Радиусы 10px, а дуга будет от (75,60) до (60,50).
  • a 15,15 1 0,0 -35,10 - Последняя дуга для завершения облака. Радиусы 15px, а дуга будет от (60,50) до (25,60). (25,60) была исходной отправной точкой и, таким образом, завершает форму.
  • z - Закрывает путь.

svg {
  height: 50%;
  width: 50%;
}
path {
  fill: white;
  stroke: black;
  stroke-width: 2;
  stroke-linejoin: round;
}
path:hover {
  fill: aliceblue;
  stroke: lightskyblue;
}
<svg viewBox='0 0 105 105'>
  <path d='M 25,60 
           a 20,20 1 0,0 0,40 
           h 50 
           a 20,20 1 0,0 0,-40 
           a 10,10 1 0,0 -15,-10 
           a 15,15 1 0,0 -35,10  
           z' />
</svg>

Ответ 2

Пухлые облака и радуги.

Отказ от ответственности: здесь нет радуг

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

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

.cloud {
  height: 30vw;
  width: 90vw;
  background: lightgray;
  border-radius: 40vw;
  border: 5px solid black;
  position: relative;
  margin-top: 20vw;
}
.cloud:before {
  content: "";
  position: absolute;
  top: -10vw;
  box-sizing: border-box;
  height: 20vw;
  width: 20vw;
  left: 15vw;
  border-radius: 50%;
  border: 5px solid black;
  border-bottom-color: transparent;
  border-right-color: transparent;
  background: lightgray;
  transform: rotate(40deg);
}
.cloud:after {
  content: "";
  position: absolute;
  height: 40vw;
  width: 40vw;
  top: -20vw;
  left: 32vw;
  border-radius: 50%;
  box-sizing: border-box;
  border: 5px solid black;
  border-bottom-color: transparent;
  background: lightgray;
  border-right-color: transparent;
  transform: rotate(55deg);
}
<div class="cloud"></div>