CSS применяет границу к форме облака?

Я нарисовал облако с помощью CSS3, используя разные теги div. Я пытаюсь добавить границу ко всей фигуре, но у меня возникают проблемы, поскольку каждая фигура имеет свою собственную границу. Как я могу применить границу ко всему облаку?

HTML:

<div id="cloud">
  <div id="bottom_c"></div>
  <div id="right_c"></div>
  <div id="left_c"></div>
</div>

CSS:

* {
  margin: 0;
  padding: 0;
  border: 0;
}

body{
  background-color: #4ca3ff;
}
#cloud {
  position: absolute;

}
#bottom_c {
  position: relative; top: 200px; left: 500px;
  width: 350px;
  height: 150px;
  background-color: #fff;
  border-radius: 100px;
  border: solid 5px black;
  z-index: 100;
}
#right_c{
  position: absolute; top: 140px; left: 640px;
  width: 150px;
  height: 150px;
  border-radius: 100%;
  background-color: #fff;
  border: solid 5px black;
}
#left_c{
  position: absolute; top: 170px; left: 550px;
  width: 100px;
  height: 100px;
  border-radius: 100%;
  background-color: #fff;
  border: solid 5px black;
}

Изображение:

Форма облака CSS


person JeeG    schedule 12.05.2013    source источник


Ответы (2)


Вы можете сделать это без каких-либо дополнительных элементов. Просто используйте псевдоэлементы ::before и ::after того же размера и круглой формы, что и верхние облачные пузыри. z-index сохраняет все в правильном слое.

Демо: jsFiddle

Выход:

выход

CSS:

body{
    background-color: #4ca3ff;
}

#cloud {
    height: 230px;
    margin: 40px;
    position: relative;
    width: 400px;
}

#cloud div {
    border: solid 5px black;
}

#bottom_c {
    background-color: #fff;
    border-radius: 100px;
    height: 150px;
    position: absolute; 
    top: 100px;
    width: 350px;
    z-index: 0;
}

#right_c{
    background-color: #fff;
    border-radius: 100%;
    height: 150px;
    left: 140px;
    position: absolute; 
    top: 40px; 
    width: 150px;
    z-index: -1;
}

#left_c{
    background-color: #fff;  
    border-radius: 100%;
    height: 100px;
    left: 50px;
    position: absolute; 
    top: 70px; 
    width: 100px;
    z-index: -1;
}

#cloud::before {
    background-color: white;
    border-radius: 50%;
    content: '';
    height: 100px;
    left: 55px;
    position: absolute; 
    top: 75px; 
    width: 100px;
    z-index: 1;
}

#cloud::after {
    position: absolute; top: 45px; left: 145px;
    background-color: white;
    border-radius: 50%;
    content: '';
    width: 150px;
    height: 150px;
    z-index: 1;
}

HTML:

<div id="cloud">
  <div id="bottom_c"></div>
  <div id="right_c"></div>
  <div id="left_c"></div>
</div>
person ThinkingStiff    schedule 12.05.2013
comment
спасибо, чувак, код выглядит красиво и чисто, я заметил, что использовал слишком много элементов и трюков. - person JeeG; 12.05.2013

Спасибо за оригинальное решение! Мне нужно было создать несколько облаков, динамически изменять их размер и перекрашивать, поэтому я адаптировал исходное решение следующим образом:

  1. Я сделал облака изменяемыми по размеру, используя процентные значения для свойств высоты, ширины, верха и левого края. Класс .cloud использует padding-top для настройки высоты облака относительно его ширины.
  2. Я сделал :before и :after псевдоэлементы div.
  3. Я изменил селекторы идентификаторов на селекторы классов
  4. И я реорганизовал свойства, чтобы их было легче читать.

Я надеюсь, что это поможет кому-то. Вот код:

Выход

У меня еще нет репутации для публикации изображений :/. Вот ссылка на результат: http://imgur.com/nN9dBiQ

CSS:

.cloud {
    position: relative;
    width: 100%;
    padding-top: 57.5%;
    box-sizing: border-box;
}

.cloud_bottom,
.cloud_left,
.cloud_right {
    border: solid 5px black; 
}

.cloud_bottom,
.cloud_left,
.cloud_right,
.cloud_leftCircle,
.cloud_rightCircle {
    background-color: #fff;
}

.cloud_bottom {
    position: absolute;
    top: 43.48%;
    height: 65.2%;
    width: 87.5%;
    border-radius: 100px;
    z-index: 0;
}

.cloud_left {
    position: absolute;
    top: 30.43%;
    left: 12.5%;
    height: 43.48%;
    width: 25%;
    border-radius: 100%;
    z-index: -1;
}

.cloud_right {
    position: absolute;
    top: 17.39%; 
    left: 35%;
    height: 65.2%;
    width: 37.5%;
    border-radius: 100%;
    z-index: -1;
}

.cloud_leftCircle {
    position: absolute; 
    top: 32.61%;
    left: 13%;
    height: 43.48%;
    width: 25%;
    border-radius: 50%;
    z-index: 1;
}

.cloud_rightCircle {
    position: absolute;
    top: 23.48%;
    left: 35%;
    height: 65.21%;
    width: 37.5%;
    border-radius: 50%;
    z-index: 1;
}

HTML:

<div class="firstCloud cloud">
    <div class="cloud_bottom"></div>
    <div class="cloud_left"></div>
    <div class="cloud_right"></div>
    <div class="cloud_leftCircle"></div>
    <div class="cloud_rightCircle"></div>
</div>

<div class="secondCloud cloud">
    <div class="cloud_bottom"></div>
    <div class="cloud_left"></div>
    <div class="cloud_right"></div>
    <div class="cloud_leftCircle"></div>
    <div class="cloud_rightCircle"></div>
</div>

JavaScript:

function updateCloudColor(cloudElement, color) {
    cloudElement.children().css("background-color", color);
}

$(window).load(function () {
    updateCloudColor($(".firstCloud"), "red");
    updateCloudColor($(".secondCloud"), "blue");
});
person Ryan James    schedule 05.11.2015
comment
Это не работает на codepen или jsfiddle. Я установил структуру js как jQuery. Что делать? - person Shubham Garg; 12.06.2021