Я пытаюсь создать кнопку со специальными стилями. На самом деле я хочу, чтобы у кнопки были границы, но не снизу и не сверху. Я знаю, что могу использовать свойство 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;
`
Любая помощь высоко ценится.
Как это будет работать?
I am looking to reproduce this button
- Вы уверены, что эта кнопка была сделана с помощью CSS (где бы вы ее ни видели) и на ней не было изображения?
Кнопка исходит от дизайнерской модели, сделанной на adobe xd, но я уверен, что на ней нет изображения.
Вы не сможете добиться этого с помощью границ кнопок как таковых. Однако вы можете попробовать полностью удалить границу кнопки и добавить псевдоэлементы :before и :after к кнопке для достижения этого результата.
Я создал пример на чистом 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>
Этот способ не отображает кнопку, как я пытался...
Я поиграл и обнаружил, что есть разные способы добиться этого.
Ниже приведены коды 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>
Вам нужно больше, чем стиль границы. например, вы можете использовать селекторы :after и :before