Отрегулируйте вторую позицию градиента и, что самое важное, задайте радиус для обоих градиентов, чтобы избежать автоматического значения, которое будет не одинаковым, поскольку у нас будет другое положение, а значение размера по умолчанию равно * 1003. *
.top-semi-circle, .bottom-semi-circle {
width: 10em;
height: 5em;
}
.top-semi-circle {
border-radius: 10em 10em 0 0;
background: radial-gradient(circle 10em at 100px 100px, red, #000);
}
.bottom-semi-circle {
border-radius: 0 0 10em 10em;
background: radial-gradient(circle 10em at 100px 20px, red, #000);
}
.bottom-semi-circle:hover {
transform:translateY(10px);
}
<div class="top-semi-circle"></div>
<div class="bottom-semi-circle"></div>
Синтаксис радиального градиента:
radial-gradient() = radial-gradient(
[ <ending-shape> || <size> ]? [ at <position> ]? ,
<color-stop-list>
<size>
Определяет размер конечной формы градиента. Если опущено, по умолчанию используется дальний угол . ref
Вы также можете играть с background-size
/ background-position
, если хотите сохранить определение градиента таким же. Просто задайте размер, равный овальной форме (верхняя половина + нижняя половина).
.top-semi-circle, .bottom-semi-circle {
width: 10em;
height: 5em;
background-image: radial-gradient(circle at 100px 100px, red, #000);
background-size:10em 10em;
}
.top-semi-circle {
border-radius: 10em 10em 0 0;
background-position:top;
}
.bottom-semi-circle {
border-radius: 0 0 10em 10em;
background-position:bottom;
}
.bottom-semi-circle:hover {
transform:translateY(10px);
}
<div class="top-semi-circle"></div>
<div class="bottom-semi-circle"></div>
Другая идея состоит в том, чтобы рассмотреть возможность перекрытия с путем пути клипа:
.top-semi-circle, .bottom-semi-circle {
width: 10em;
height: 10em;
border-radius: 10em;
background: radial-gradient(circle at 100px 100px, red, #000);
}
.top-semi-circle {
clip-path:polygon(0 0,100% 0,100% 50%,0 50%);
}
.bottom-semi-circle {
margin-top:-10em;
clip-path:polygon(0 100%,100% 100%,100% 50%,0 50%);
}
.bottom-semi-circle:hover {
transform:translateY(10px);
}
<div class="top-semi-circle"></div>
<div class="bottom-semi-circle"></div>
Та же логика с использованием mask
:
.top-semi-circle, .bottom-semi-circle {
width: 10em;
height: 10em;
border-radius: 10em;
background: radial-gradient(circle at 100px 100px, red, #000);
}
.top-semi-circle {
-webkit-mask:linear-gradient(to bottom,white 50%,transparent 0);
mask:linear-gradient(to bottom,white 50%,transparent 0);
}
.bottom-semi-circle {
margin-top:-10em;
-webkit-mask:linear-gradient(to top,white 50%,transparent 0);
mask:linear-gradient(to top,white 50%,transparent 0);
}
.bottom-semi-circle:hover {
transform:translateY(10px);
}
<div class="top-semi-circle"></div>
<div class="bottom-semi-circle"></div>