Как анимировать вогнутый прямоугольник в выпуклый - PullRequest
0 голосов
/ 16 декабря 2018

Я создал прямоугольник следующей формы, используя эскиз.

enter image description here

При наведении на него мне нужно анимировать и отдыхать, как показано ниже,

enter image description here

Есть ли способ, которым я могу анимировать его, используя css только от вогнутого до выпуклого.

Любая помощь будет принята с благодарностью.Я в порядке с svg solution.

Вот ссылка на fiddle для svg.

    <svg width="641px" height="313px" viewBox="0 0 641 313" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 52.5 (67469) - http://www.bohemiancoding.com/sketch -->
    <title>Concave</title>
    <desc>Created with Sketch.</desc>
    <defs>
        <path d="M0,252.683363 C104.477953,274.894454 210.133596,286 316.966929,286 C423.800262,286 531.811286,274.894454 641,252.683363 L641,565 L0,565 L0,252.683363 Z" id="path-1"></path>
    </defs>
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="iteration-3" transform="translate(-752.000000, -3299.000000)">
            <g id="case--study" transform="translate(0.000000, 2766.000000)">
                <g transform="translate(50.000000, 100.000000)" id="case--study--1-copy">
                    <g transform="translate(702.000000, 181.000000)">
                        <use id="bottom" fill="#000000" fill-rule="nonzero" xlink:href="#path-1"></use>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Одним из решений может быть создание фигуры с помощью SVG, а затем переход пути через CSS:

body {
  width: 40vw;
  display: block;
  margin: 0 auto;
}
.path {
    transition: d 2s ease-in-out;
}

.path:hover{     
    d: path('M0 20 Q 50 0 100 20 L100 60 L0 60 Z');
}
<svg viewBox="0 0 100 60" xmlns="http://www.w3.org/2000/svg">
  <path class="path" d="M0 20 Q 50 40 100 20 L100 60 L0 60 Z" fill="black"/>
</svg>
<p>hover over the shape</p>
0 голосов
/ 16 декабря 2018

Для решения только с CSS я бы рассмотрел радиальный градиент и некоторую фоновую анимацию:

.box {
  height:50px;
  width:600px;
  padding-top:50px;
  background:
    /*concave*/
    radial-gradient(410px 50px at 50% 0,transparent, 80%, #000 80.5%) center,
    /*convexe*/
    radial-gradient(410px 50px at 50% 50px,#000, 80%, transparent 80.5%)center,
    linear-gradient(#000,#000) content-box;
  background-size:100% 100%,100% 0px,auto;  
  background-repeat:no-repeat;
  transition:1s all;
}
.box:hover {
  background-size:100% 0,100% 100%,auto;
}
<div class="box"></div>

Вы также можете использовать его для прямоугольника полной ширины:

.box {
  height:50px;
  padding-top:50px;
  background:
    /*concave*/
    radial-gradient(70% 50px at 50% 0,transparent, 80%, #000 80.5%) center,
    /*convexe*/
    radial-gradient(70% 50px at 50% 50px,#000, 80%, transparent 80.5%)center,
    linear-gradient(#000,#000) content-box;
  background-size:100% 100%,100% 0px,auto;  
  background-repeat:no-repeat;
  transition:1s all;
}
.box:hover {
  background-size:100% 0,100% 100%,auto;
}
<div class="box"></div>

В случае, если вы будете иметь большую высоту или динамическую высоту, лучше рассмотрите псевдоэлемент, чтобы эффект не изменялся при изменении высоты:

.box {
  height: 80vh;
  position: relative;
  padding-top: 50px;
  background: #000 content-box;
}

.box::before {
  content: "";
  position: absolute;
  top: 1px;
  left: 0;
  right: 0;
  padding: inherit;
  background: 
   /*concave*/
   radial-gradient(70% 50px at 50% 0, transparent, 80%, #000 80.5%) bottom,      
   /*convexe*/
   radial-gradient(70% 50px at 50% 50px, #000, 80%, transparent 80.5%)bottom;
  background-size: 100% 100%, 100% 0px;
  background-repeat: no-repeat;
  transition: 1s all;
}

.box:hover::before {
  background-size: 100% 0, 100% 100%;
}
<div class="box"></div>

Обновление

Вы также можете настроить эффект, как показано ниже:

.box {
  height: 80vh;
  position: relative;
  padding-top: 100px;
  background: #000 content-box;
}


/*concave*/
.box::before {
  content: "";
  position: absolute;
  top: 50px;
  left: 0;
  right: 0;
  height: 51px;
  background: 
   radial-gradient(70% 50px at 50% 0, transparent, 80%, #000 80.5%) top center;
  background-size: 100% 200%;
  background-repeat: no-repeat;
  transition: 0.5s all 0.4s ease-out;
}

/*convexe*/
.box::after {
  content: "";
  position: absolute;
  top: 1px;
  left: 0;
  right: 0;
  height: 51px;
  background:
   radial-gradient(70% 50px at 50% 50px, #000, 80%, transparent 80.5%)bottom center;
  background-size: 200% 0%;
  background-repeat: no-repeat;
  transition: 0.5s all ease-in;
}

.box:hover::before {
  background-position: bottom center;
  background-size: 200% 200%;
  transition: 0.5s all ease-in;
}

.box:hover::after {
  background-size: 100% 100%;
  transition: 0.5s all 0.4s ease-out;
}
<div class="box"></div>
...