#html #css #angular #css-transitions
#HTML #css #угловой #css-переходы
Вопрос:
В моем проекте angular у меня есть гибкий div, в который я динамически помещаю divs в виде кнопок, которые также являются гибкими элементами.
Всякий раз, когда я нажимаю на один из них, другие исчезают, а оставшийся центрируется. Моя проблема в том, что я могу сделать это, только добавив display: none;
свойство, иначе flex display по-прежнему выделяет им пространство, даже если их ширина была установлена на 0 с помощью добавления классов.
Моя цель — анимировать их центрирование вместо прямой привязки к центру
Контейнерный CSS:
.container {
width: 100%;
height: 25%;
display: flex;
flex-flow: column wrap;
}
sbutton {
width: auto;
display: block;
height: 100%;
}
.button-separator {
border-style: solid;
border-width: 0px;
border-color: lightcyan;
border-right-width: 1px;
}
.button-hide {
width: 0;
display: none;
}
Контейнерный HTML
<div class="container" *ngIf="buttonarray.length > 0">
<sbutton *ngFor="let button of buttonarray"></sbutton>
</div>
Компонент кнопки CSS:
.button-root {
width: 100%;
height: 100%;
display: flex;
margin: auto;
cursor: pointer;
}
.buttoncontent {
display: flex;
margin: auto;
user-select: none;
}
...
Компонент кнопки HTML
<div class="button-root">
<div class="buttoncontent">
...
</div>
</div>
Кроме того, да, я понятия не имею, что я делаю на данный момент
Ответ №1:
Не уверен в рендеринге анимации, но вы могли бы сделать это таким образом (нажмите на белые точки, чтобы анимировать) :
const hideOtherButtons = (allButtons, clickedButton) => {
allButtons.forEach((Button) => {
if(Button != clickedButton)
Button.closest('.Button-Container').classList.add('is-hidden');
})
}
const reset = (allButtons) => {
allButtons.forEach((Button) => {
Button.closest('.Button-Container').classList.remove('is-hidden');
})
}
const Buttons = document.querySelectorAll('.Button');
Buttons.forEach((Button) => {
Button.addEventListener('click', (e) => hideOtherButtons(Buttons, e.currentTarget));
});
const ResetButton = document.querySelector('.Reset');
ResetButton.addEventListener('click', () => reset(Buttons));
.ButtonGroup {
display: flex;
background : #3f55af;
border-top : solid 1px lightcyan;
}
.Button-Container {
display: flex;
justify-content: center;
align-items: center;
transition: .5s ease;
flex-grow: 1
}
.Button-Container:not(:last-child) {
border-right : solid 1px lightcyan;
}
/* State of component */
.Button-Container.is-hidden {
width : 0;
padding : 0;
overflow: hidden;
flex-grow: 0
}
.Button {
display: flex;
justify-content: center;
align-items: center;
border : none;
outline : none;
background : 0 0;
padding : 0;
margin : 0;
width : 35px;
height : 35px;
cursor: pointer;
}
.Icon {
width : 15px;
height : 15px;
border-radius: 15px;
background : #fff;
}
<div class="ButtonGroup">
<div class="Button-Container">
<button class="Button">
<i class="Icon"></i>
</button>
</div>
<div class="Button-Container">
<button class="Button">
<i class="Icon"></i>
</button>
</div>
<div class="Button-Container">
<button class="Button">
<i class="Icon"></i>
</button>
</div>
</div>
<button class="Reset">Reset</button>