Создание кнопки без верхней границы и нижней границы

Я пытаюсь создать кнопку со специальными стилями. На самом деле я хочу, чтобы у кнопки были границы, но не снизу и не сверху. Я знаю, что могу использовать свойство css в стиле border-top, а затем установить для него значение none, но я хочу воспроизвести эту кнопку:

Как вы можете видеть на картинке, у кнопки есть левая и правая границы, которые немного смещаются вниз и вверх, поэтому использование свойства border-top-style не совсем работает.

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

export const ButtonWithoutBorderTopAndBottom = styled.a`
  display: inline-block;
  color: ${(props) => props.theme.colors.primary};
  border-radius: 36px;
  border: 6px solid ${(props) => props.theme.colors.primary};
  padding: 10px 15px;
`

Любая помощь высоко ценится.

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

Abbas Bagheri 21.02.2023 14:30

Как это будет работать?

Baki 21.02.2023 14:33
I am looking to reproduce this button - Вы уверены, что эта кнопка была сделана с помощью CSS (где бы вы ее ни видели) и на ней не было изображения?
Kitswas 21.02.2023 14:43

Кнопка исходит от дизайнерской модели, сделанной на adobe xd, но я уверен, что на ней нет изображения.

Baki 21.02.2023 14:47

Вы не сможете добиться этого с помощью границ кнопок как таковых. Однако вы можете попробовать полностью удалить границу кнопки и добавить псевдоэлементы :before и :after к кнопке для достижения этого результата.

Oddrigue 21.02.2023 14:56
Уроки CSS 6
Уроки CSS 6
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки...
Как создать страницу входа в систему с помощью HTML с использованием CSS.
Как создать страницу входа в систему с помощью HTML с использованием CSS.
Создание страницы входа в систему является важной частью создания веб-сайта или приложения, требующего аутентификации пользователя. Простую страницу...
Псевдоэлементы
Псевдоэлементы
Псевдоэлемент CSS - это ключевое слово, добавляемое к селектору, которое позволяет стилизовать определенную часть выбранного элемента (элементов)....
Освоение эссе по ЕГЭ: Советы и стратегии для успешной сдачи экзамена
Освоение эссе по ЕГЭ: Советы и стратегии для успешной сдачи экзамена
Исходя из отчетов экзаменаторов, очевидно, что для успешной сдачи эссе CSS экзаменаторы ожидают от студентов следующее:
Ve It
Ve It
Мире, где большая часть интернет-трафика приходится на мобильные устройства, отзывчивый веб-дизайн стал необходимостью. Отзывчивый сайт - это сайт,...
0
5
64
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я создал пример на чистом css:

Извините, у меня нет опыта работы со StyledComponent, но, возможно, это может быть полезным руководством.

Вы можете увидеть демо по этой ссылке

button {
  display: inline-block;
  color: black;
  border-radius: 0;
  border: 0;
  padding: 10px 15px;
  position: relative;
  margin: 100px;
  height: 80px;
}
button::after {
  content: " ";
  position: absolute;
  top: 0;
  left: -40px;
  width: 40px;
  height: 80px;
  background-color: none;
  border-top-left-radius: 100px;
  border-bottom-left-radius: 100px;
  border: 6px solid red;
  border-right: 0;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

button::before {
  content: " ";
  position: absolute;
  top: 0;
  left: 100%;
  width: 40px;
  height: 80px;
  background-color: none;
  border-top-right-radius: 100px;
  border-bottom-right-radius: 100px;
  border: 6px solid red;
  border-left: 0;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}
Ответ принят как подходящий

Я бы сделал это, как показано ниже:

button {
  padding-inline: .75em;
  border-radius: 100px;
  line-height: 1.3em;
  font-size: 35px;
  border: none;
  --g: #0000 calc(97% - 4px), red calc(100% - 4px);
  background: 
    radial-gradient(100% 50% at left ,var(--g)) right,
    radial-gradient(100% 50% at right,var(--g)) left ;
  background-size: calc(1.3em/2) 100%; /* same as line-height here */
  background-repeat: no-repeat;
}
<button>Button</button>

Вы можете легко реализовать это, добавив border-left и border-right или просто добавив границу и убрав border-top и border-bottom.

Попробуйте код ниже:

    button {
         border-radius: 1000px;
         border: solid black 2px;
         border-top: 0;
         border-bottom: 0;
         background: unset
    }
<button>Click Here</button>

Этот способ не отображает кнопку, как я пытался...

Baki 22.02.2023 10:02

Я поиграл и обнаружил, что есть разные способы добиться этого.

Ниже приведены коды 5 из них. Кроме того, вы также можете использовать svg.

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

Ссылка на Codepen

/* Solution 1: Hide border-top & border-bottom */
.fancy-btn-1a {
  display: inline-block;
  padding: 10px 24px;

  border-radius: 100px;
  border: 6px solid red;
  border-bottom-color: white;
  border-top-color: white;
}
.fancy-btn-1b {
  display: inline-block;
  padding: 10px 24px;
  
  border: 6px solid red;
  border-radius: 100px;
  border-top: none;
  border-bottom: none;
}

/* Solution 2: Use ::before, ::after to make border-left & border-right */
.fancy-btn-2 {
  display: inline-block;
  padding: 10px;
  box-sizing: border-box;
  
  position: relative;
  left: 20px;
}
.fancy-btn-2::before,
.fancy-btn-2::after {
  content: '';
  display: block;
  width: 21px;
  height: 100%;
  
  border: 6px solid red;
  
  position: absolute;
  top: -2px;
}
.fancy-btn-2::before {
  left: -20px;
  border-right: none;
/*   border-right-color: white; */
  border-top-left-radius: 100px;
  border-bottom-left-radius: 100px;
}
.fancy-btn-2::after {
  right: -20px;
  border-left: none;
/*   border-left-color: white; */
  border-top-right-radius: 100px;
  border-bottom-right-radius: 100px;
}

/* Solution 3: Use ::before, ::after to make border-top & border-bottom */
.fancy-btn-3 {
  display: inline-block;
  padding: 10px 24px;
  box-sizing: border-box;
  
  border: 6px solid red;
  border-radius: 100px;
  position: relative;
}
.fancy-btn-3::before,
.fancy-btn-3:after {
  content:"";
  display: block;
  width: calc(100% - 40px);
  height: 6px;
  background: white;
  
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
}
.fancy-btn-3::before {
  top: -6px;
}
.fancy-btn-3::after {
  bottom: -6px;
}

/* Solution 4: Use ::after, background-color, border-image & clip-path */
.fancy-btn-4 {
  display: inline-block;
  padding: 10px 24px;
  margin-left: 6px;
  box-sizing: border-box;
  position: relative;
 
  border-radius: 100px;
  background-color: white;
}
.fancy-btn-4::after {
  content: '';
  
  position: absolute;
  inset: -6px;  /* same as "top: -6px; bottom: -6px; left: -6px; right: -6px;" */
  bottom: -5.6px; /* I don't know why border-image cannot completely cover here */
  z-index: -1;
  
  background-color: red;
  border: 6px solid red;
  border-image: linear-gradient(to right, red 20%, #fff 20%, #fff 80%, red 80%);
  border-image-slice: 1;
  clip-path: inset(0 round 100px);
}

/* Solution 5:
   The shortest & easiest way! 
   Use background: (background-image, background-clip,...) 
*/
.fancy-btn-5 {
  width: fit-content;
  padding: 10px 24px;
  text-align: center;
  
  border: double 6px transparent;
  border-radius: 100px;
  background-origin: border-box;
  background-image: linear-gradient(white, white), 
                    linear-gradient(to right, red 22%, #fff 22%, #fff 78%, red 78%);
  background-clip: padding-box, border-box;
}
<div class = "fancy-btn-1a">
  Button 1a
</div>

<div class = "fancy-btn-1b">
  Button 1b
</div>

<br/><br/>

<div class = "fancy-btn-2">
  Button 2
</div>

<br/><br/>

<div class = "fancy-btn-3">
  Button 3
</div>

<br/><br/>

<div class = "fancy-btn-4">
  Button 4
</div>

<br/><br/>

<div class = "fancy-btn-5">
  Button 5
</div>
please try again
<pre>
export const ButtonWithoutBorderTopAndBottom = styled.a`
  display: inline-block;
  color: ${(props) => props.theme.colors.primary};
  border-radius: 36px;
  border-left: 6px solid ${(props) => props.theme.colors.primary};
  border-right: 6px solid ${(props) => props.theme.colors.primary};
  padding: 10px 15px;
</pre>

Другие вопросы по теме