Создайте стрелку на мачте

Я пытаюсь сделать стрелку, которая выглядит так:

Пример стрелки

Однако, это самое близкое, что я могу до него донести:

.button {
  margin: 4em 0;
  padding: 2em;
  width: 15%;
  margin: 0 auto;
  text-align: center;
  background-color: #000000;
  color: #ffffff;
  display: -moz-box;
  display: -ms-flexbox;
  display: -webkit-flex;
  display: flex;
  -moz-flex-flow: row wrap;
  -webkit-flex-flow: row wrap;
  -ms-flex-flow: row wrap;
  flex-flow: row wrap;
  webkit-justify-content: center;
  justify-content: center;
}
.curved-arrow {
  display: inline-block;
  border-top: 10px solid #fff;
  border-bottom: 10px solid #fff;
  border-left: 30px solid #fff;
  border-top-right-radius: 100%;
  border-bottom-right-radius: 100%;
}
<div class="button">
  <div class="curved-arrow"></div>
</div>

Ответ 1

SVG

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

svg{width:100px;}
<svg viewbox="0 0 20 8">
  <path d="M0 0 Q 30 4 0 8" />
</svg>

Ответ 2

CSS

Для достижения желаемой формы требуется немного стильного стиля border-radius.

.container {
  width: 100px;
  height: 100px;
  background: red;
  position: relative;
}
.arrow {
  width: 50px;
  height: 30px;
  position: absolute;
  top: 32px;
  left: 25%;
  border-radius: 0px 100% 100% 0px / 0 50% 50% 0;
  background: white;
}
<div class="container">
  <div class="arrow"></div>
</div>

Ответ 3

Я думаю, что я сделал что-то очень похожее, возможно, вы могли бы изменить некоторые поля/ширину или высоты:

#arrow{
    display: block;
    box-sizing: content-box;
    float: none;
    width: 130px;
    height: 50px;
    top: auto;
    right: auto;
    bottom: auto;
    left: auto;
    margin: 0;
    padding: 0;
    overflow: visible;
    outline: none;
    border: 0 solid rgba(0,0,0,1);
    -webkit-border-radius: 50%;
    border-radius: 50%;
    background: #1abc9c;
    box-shadow: none;
    text-shadow: none;
    margin-left:-65px;
}
#arrow:after {
 position:absolute;
    left:-65px;
    width:65px;
    background:transparent;
    content:'';

}

Это должен быть овал, который я спрятаю наполовину, используя :after (довольно грязный трюк)

js скрипка

Однако я бы рекомендовал использовать CSS-спрайты, я думаю, они должны соответствовать вашей ситуации лучше, потому что CSS-формы не так легко читать для браузеров.

Надеюсь, это поможет!:)

Ответ 4

Здесь я беру на себя это. Не совсем так остро, как хотелось бы, но это немного ближе. Edit: second take использует два псевдоэлемента, чтобы помочь заострить угол.

.button { margin: 4em 0; padding: 2em; width: 15%; margin: 0 auto; text-align: center; background-color: #000000; color: #ffffff; isplay: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; -moz-flex-flow:row wrap; -webkit-flex-flow:row wrap; -ms-flex-flow:row wrap; flex-flow:row wrap; webkit-justify-content: center; justify-content: center; }

.curved-arrow { 
    position: relative;
    display: inline-block;
    height: 36px;
    width: 56px;
    overflow: hidden;
}
.curved-arrow:after {
    content: '';
    position: absolute;
    right: 0;
    top: 0;
    border-radius: 0 100% 0 0;
    height: 50%;
    width: 200%;
    background: #FFF;
}
.curved-arrow:before {
    content: '';
    position: absolute;
    right: 0;
    bottom: 0;
    border-radius: 0 0 100% 0;
    height: 50%;
    width: 200%;
    background: #FFF;
}
<div class="button">
  <div class="curved-arrow"></div>
</div>

Ответ 5

Что-то вроде этого?

#arrow-base {
  width: 120px;
  height: 80px;
  background: red;
}
#arrow {
  width: 0;
  height: 0;
  border-top: 16px solid transparent;
  border-bottom: 16px solid transparent;
  border-left: 32px solid white;
  display: inline-block;
  margin: 24px 44px;
  border-radius: 2px;
}
<div id="arrow-base">
  <div id="arrow">
    <!-- should be empty -->
  </div>
</div>