Вопрос или проблема
Я пытаюсь достичь следующего вида для своих двух вкладок вставьте описание изображения здесь
Можно посмотреть примеры на
https://www.binance.com/en/crypto/buy/AUD/USDT
https://www.okx.com/sell-crypto#sourceQuote=usd&sourceBase=usdt
Но проблема в том, что я добился следующего вставьте описание изображения здесь. Проблема в том, что между ними есть расстояние, я изучил предыдущий сайт и выяснил, что у них есть 2 вкладки, у правой вкладки есть отступ слева, и затем есть 2 параллелограмма, которые смещаются влево и вправо, отступ составляет примерно 48 пикселей, так что один параллелограмм движется на 24 пикселя, в то время как другой также двигается на 24 пикселя. Вот мой код.
Я попытался наклонить прямоугольник, чтобы сделать параллелограмм, и затем сдвинул оба на 24 пикселя, но это не дало никакого результата.
.container {
margin: 0 auto;
padding: 0;
border-radius: 8px;
background-color: #fff;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
height: 50vh;
/* overflow: hidden; */
}
@media (min-width: 768px) {
.container {
width: 66.6667%;
}
}
@media (min-width: 1024px) {
.container {
width: 80%;
}
}
.tab-container {
display: flex;
justify-content: center;
align-items: center;
position: relative;
height: 60px;
overflow: visible;
/* border-radius: 8px; */
/* background-color: #1b1b1b; */
}
.tab {
display: flex; /* Используйте флексбокс */
justify-content: center; /* Центрировать по горизонтали */
align-items: center; /* Центрировать по вертикали */
position: relative;
flex: 1;
height: 100%;
text-align: center;
align-items: center;
font-weight: bold;
cursor: pointer;
color: #777;
background-color: #181a20;
border: none;
z-index: 1;
}
.tab.active {
color: white;
background-color: #181a20;
}
.tab.not-active {
background-color: #2c2c2c;
}
.tab.sell {
margin-left: 48px; /* Положительный отступ для перекрытия */
z-index: 2;
}
.tab-content {
display: inline-block;
position: relative;
z-index: 1;
}
.tab::before,
.tab::after {
content: '';
position: absolute;
top: 0;
height: 100%;
z-index: 0;
width: 24px;
}
.buy.active::after {
transform: skewX(10deg);
background-color: #181a20;
right: -24px;
width: 24px;
}
.sell.not-active::before {
transform: skewX(10deg);
background-color: #2c2c2c;
left: -24px;
width: 24px;
}
.sell.active::before {
transform: skewX(-10deg);
background-color: #181a20;
left: -24px;
width: 24px;
}
.buy.not-active::after {
transform: skewX(-10deg);
background-color: #2c2c2c;
right: -24px;
width: 24px;
}
.form {
display: flex;
flex-direction: column;
gap: 10px;
padding: 20px;
background-color: #fff;
}
.label {
display: flex;
justify-content: space-between;
align-items: center;
}
.input {
margin-left: 10px;
padding: 8px;
font-size: 16px;
width: 100%;
box-sizing: border-box;
}
@media (max-width: 600px) {
.tab {
padding: 10px 0;
}
.form {
padding: 10px;
}
.input {
font-size: 14px;
}
}
import React, { useState } from 'react';
import './BuySellContainer.css';
import AssetInput from '../AssetInput/AssetInput';
const BuySellContainer: React.FC = () => {
const [mode, setMode] = useState<'buy' | 'sell'>('buy');
const handleModeChange = (newMode: 'buy' | 'sell') => {
setMode(newMode);
};
return (
<div className="container">
<div className="tab-container">
<div
onClick={() => handleModeChange('buy')}
className={`tab buy ${mode === 'buy' ? 'active' : 'not-active'} `} >
<span className="tab-content">Купить</span>
</div>
<div
onClick={() => handleModeChange('sell')}
className={`tab sell ${mode === 'sell' ? 'active' : 'not-active'} `}
>
<span className="tab-content">Продать</span>
</div>
</div>
<div className="form">
{mode === 'buy' ? (
<AssetInput label="Вы заплатите" asset="HKD" />
) : (
<AssetInput label="Вы продадите" asset="HKD" />
)}
<AssetInput label="Вы получите" asset="USDT" />
</div>
</div>
);
};
export default BuySellContainer;
Ответ или решение
Создание вкладок с наклонными краями — это задача, которая требует точной настройки CSS для достижения необходимого визуального эффекта. Давайте рассмотрим, как можно улучшить ваш текущий код для создания двойной вкладки с наклонами, как показано в примерах, которые вы привели.
Шаги для достижения желаемого эффекта:
1. Структура и стили вкладок
Убедитесь, что ваши вкладки правильно настроены в разметке и стилях. Ваш CSS-код содержит хорошую основу, но давайте внесем некоторые уточнения:
.container {
margin: 0 auto;
padding: 0;
border-radius: 8px;
background-color: #fff;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
height: 50vh;
}
.tab-container {
display: flex;
justify-content: center;
align-items: center;
height: 60px;
position: relative;
}
.tab {
display: flex;
justify-content: center;
align-items: center;
position: relative;
flex: 1;
height: 100%;
text-align: center;
font-weight: bold;
cursor: pointer;
color: #777;
background-color: #181a20;
border: none;
overflow: hidden; /* Обеспечить отсутствие переполнения */
}
.tab.active {
color: white;
background-color: #181a20;
}
.tab.not-active {
background-color: #2c2c2c;
}
.tab.sell {
margin-left: -24px; /* Сдвигаем вкладку влево для наклона */
}
.tab-content {
position: relative;
z-index: 1;
}
.tab::before,
.tab::after {
content: '';
position: absolute;
top: 0;
height: 100%;
width: 24px;
z-index: 0;
}
.tab.buy.active::after,
.tab.sell.active::before {
transform: skewX(10deg);
background-color: #181a20;
}
.tab.buy.not-active::after,
.tab.sell.not-active::before {
transform: skewX(-10deg);
background-color: #2c2c2c;
}
2. Отредактируйте HTML с учетом CSS
Ваш JSX-код также выглядит корректно, но важно убедиться, что логика переключения между состояниями вкладок (активные и неактивные) работает правильно:
import React, { useState } from 'react';
import './BuySellContainer.css';
import AssetInput from '../AssetInput/AssetInput';
const BuySellContainer: React.FC = () => {
const [mode, setMode] = useState<'buy' | 'sell'>('buy');
const handleModeChange = (newMode: 'buy' | 'sell') => {
setMode(newMode);
};
return (
<div className="container">
<div className="tab-container">
<div
onClick={() => handleModeChange('buy')}
className={`tab buy ${mode === 'buy' ? 'active' : 'not-active'}`}
>
<span className="tab-content">Buy</span>
</div>
<div
onClick={() => handleModeChange('sell')}
className={`tab sell ${mode === 'sell' ? 'active' : 'not-active'}`}
>
<span className="tab-content">Sell</span>
</div>
</div>
<div className="form">
{mode === 'buy' ? (
<AssetInput label="Вы заплатите" asset="HKD" />
) : (
<AssetInput label="Вы продадите" asset="HKD" />
)}
<AssetInput label="Вы получите" asset="USDT" />
</div>
</div>
);
};
export default BuySellContainer;
3. Примечания по настройке
- Ваша логика сдвига вкладок на 24 пикселя указывает на то, что вы хотите создать эффект наложения, который визуально соединяет вкладки.
- Использование
transform: skewX()
позволяет добиться нужного наклона. Обязательно проверьте, что ваши стили последовательно применяются как для активных, так и для неактивных вкладок. - Убедитесь, что нет лишних отступов и полей, которые могут повлиять на видимость вкладок.
Заключение
Следуя вышеуказанным шагам и рекомендациям, вы сможете создать двойные вкладки с наклонными краями, как на примерах сайтов, которые вы указали. Если возникнут дополнительные вопросы или потребуются уточнения, не стесняйтесь обращаться!