Совет о том, как создать эту форму кнопки

Я хотел бы создать кнопку с двумя небольшими крыльями с каждой стороны, но не совсем уверен, как добиться этой формы, и мне было интересно, может ли кто-нибудь дать какое-то руководство?

введите здесь описание изображения

Я понимаю, что мне нужно будет использовать псевдонимы до и после, но не знаю, как создать эту небольшую кривую, ведущую к основному телу кнопки?


person styler    schedule 05.11.2013    source источник
comment
Трапеция достаточно проста, но закругленные углы будут несколько проблематичными. Иногда изображение является лучшим способом.   -  person Paulie_D    schedule 05.11.2013
comment
@Paulie_D как так? В моем примере я просто использовал border-top-left-radius и border-top-right-radius, и все было в порядке.   -  person Albzi    schedule 05.11.2013
comment
Поскольку стороны под углом не будут пересекаться с радиусом границы в точной точке, которую можно описать с помощью свойства border-radius. Они встречаются по касательной. Если кнопка достаточно маленькая, никто ее не заметит... но это дизайнерское решение.   -  person Paulie_D    schedule 05.11.2013
comment
эй, да, border-radius, кажется, не очень хорошо работает с этим примером   -  person styler    schedule 05.11.2013
comment
Ах, теперь я понимаю, что вы имеете в виду, но только если кнопка достаточно велика, чтобы понять.   -  person Albzi    schedule 05.11.2013
comment
да, кнопка в конечном итоге будет плавной, поэтому должна иметь возможность масштабироваться вверх и вниз без потери качества   -  person styler    schedule 05.11.2013
comment
Кроме того, ваш пример относится только к границам. Попробуйте поместить какой-нибудь текст в div... так как это должна быть кнопка.   -  person Paulie_D    schedule 05.11.2013
comment
Текст работает нормально (Могло быть и лучше) @Paulie_D   -  person Albzi    schedule 05.11.2013


Ответы (3)


Чтобы создать впечатление 3D-плоскости, вращающейся в сторону от точки зрения, например Star Wars сканирование (воссоздано также и в svg), используйте (с префиксом) perspective и rotate3d (или rotateX).

Чтобы предотвратить наложение, используйте прозрачный контур толщиной 1 пиксель, как описано здесь.

Пример выполнения

#trapezoid {
    -webkit-transform : perspective(400px) rotate3d(1, 0, 0, 20deg);
       -moz-transform : perspective(400px) rotate3d(1, 0, 0, 20deg);
         -o-transform : perspective(400px) rotate3d(1, 0, 0, 20deg);
        -ms-transform : perspective(400px) rotate3d(1, 0, 0, 20deg);
            transform : perspective(400px) rotate3d(1, 0, 0, 20deg);

        border-radius : 5px 5px 0 0;
              outline : 1px solid transparent;
}

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

Выполнение примера с не повернутым текстом

Код:

#trapezoid {    
         width : 200px;
        height : 50px;
        margin : 10px;
       padding : 10px;
      position : relative;
    text-align : center;
}

#trapezoid::before {
    -webkit-transform : perspective(400px) rotate3d(1, 0, 0, 20deg);
       -moz-transform : perspective(400px) rotate3d(1, 0, 0, 20deg);
         -o-transform : perspective(400px) rotate3d(1, 0, 0, 20deg);
        -ms-transform : perspective(400px) rotate3d(1, 0, 0, 20deg);
            transform : perspective(400px) rotate3d(1, 0, 0, 20deg);
              outline : 1px solid transparent;
        border-radius : 5px 5px 0 0;
             position : absolute;
                  top : 0;
               bottom : 0;
                 left : 0;
                right : 0;
              content : '';
              z-index : -1;
           background : red;
}
person Andrea Ligios    schedule 05.11.2013
comment
Вам, вероятно, придется включить некоторую совместимость .js, чтобы это работало на <= IE9 - person MackieeE; 05.11.2013

Взято с здесь

Вы можете создать эту форму, используя это:

#trapezoid {
    border-bottom: 100px solid red;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    height: 0;
    width: 100px;
}

Вот пример

Если вам нужен текст, поместите текст в div и добавьте в css это:

text-align:center;
line-height:30px; /*Size of bottom border*/

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

ОБНОВЛЕННЫЙ ПРИМЕР

person Albzi    schedule 05.11.2013

Вы можете достичь этого стиля, используя :before и :after. Хитрость заключается в том, чтобы наклонить элементы по бокам и применить небольшой радиус границы для плавного закругления, например:

button {
  border: 0 none;
  background-color: red;
  position: relative;

  font-size: 4em;
  margin-left: 100px; 
}

button:before,
button:after {
  content: '';
  position: absolute;
  background-color: inherit;
  top: 0;
  bottom: 0;
  width: 1em;
  z-index: -1;
}

button:before {
  left: -0.5em;
  -webkit-transform: skew(-10deg);
  transform: skew(-10deg);
  border-top-left-radius: 10%;
}

button:after {
  left: auto;
  right: -0.5em;
  -webkit-transform: skew(10deg);
  transform: skew(10deg);
  border-top-right-radius: 10%;
}

Скрипка здесь: http://jsfiddle.net/JyhwZ/1/

person Severin    schedule 05.11.2013
comment
Работает хорошо, кроме IE. - person Albzi; 05.11.2013
comment
Это хорошо, но я думаю, что у вас там много магических чисел .... Мне было бы интересно посмотреть, насколько он гибок при меньших размерах, разной ширине и т. Д. Тем не менее ... приятно! - person Paulie_D; 05.11.2013
comment
Это должно быть довольно гибко, так как я использовал ems и %. В скрипте просто измените размер шрифта кнопки с 4em на что угодно, чтобы увидеть, как кнопка адаптируется. Единственное значение, основанное на пикселях, — это левое поле кнопки, которое я использую только для того, чтобы оставить достаточно места с левой стороны кнопки, чтобы :before был полностью видимым. - person Severin; 05.11.2013