#css
#css
Вопрос:
Я пытаюсь создать простое боковое меню с анимацией, которая соответствует изменениям его ширины. Когда меню закрыто, я хочу показывать только значки, а когда оно открыто, я хочу отображать оба — значки и текст. Анимация работает нормально, но при переключении возникает какой-то сбой…кажется, что когда появляется текст, он разрывает строку со значком. Как я могу соответствующим образом задержать появление текста при открытии меню?
HTML
<div ng-app class="container" ng-controller="MyCtrl">
<div class="row">
<div class="col-md-3"><button class="btn btn-success" ng-click="toggleSideMenu()">
<i class="fa fa-bars"></i></button>
<div class="side-menu-wrapper" ng-class="{'menu-open':!!isMenuExpanded, 'menu-closed':!isMenuExpanded}">
<ul class="list-group">
<li class="list-item">
<i class="fa fa-cog">
</i><span>
First item</span></li>
<li class="list-item">
<i class="fa fa-book"></i>
<span>
First item</span></li>
<li class="list-item">
<i class="fa fa-pencil"></i>
<span>
First item</span></li>
</ul>
</div>
</div>
<div class="col-md-9">
</div>
</div>
</div>
CSS
.container {
margin-top: 15px;
}
.side-menu-wrapper {
background-color: rgb(41, 44, 90);
height: 100vh;
transition: width 0.5s ease-in;
}
.side-menu-wrapper span {
margin-left: 5px;
}
.side-menu-wrapper.menu-closed {
width: 15%;
}
.side-menu-wrapper.menu-closed span {
/* display: none;
opacity: 0; */
transition: opacity 1s ease-out;
opacity: 0;
height: 0;
overflow: hidden;
}
.side-menu-wrapper.menu-open span {
display: inline-block;
float: right;
opacity: 1;
}
.side-menu-wrapper.menu-open {
opacity: 1;
transition: width 0.5s ease-out;
width: 100%;
}
.list-item {
background-color: transparent;
color: rgb(161, 165, 224);
position: relative;
display: flex;
padding: 10px 15px;
border-bottom: 1px solid rgb(161, 165, 224);
}
Angularjs
function MyCtrl($scope) {
$scope.isMenuExpanded = false;
$scope.toggleSideMenu = function() {
$scope.isMenuExpanded = !$scope.isMenuExpanded;
}
}
Ответ №1:
Проблема вызвана настройкой height: 0;
в .side-menu-wrapper.menu-closed span
Изменить
.side-menu-wrapper.menu-closed span {
/* display: none;
opacity: 0; */
transition: opacity 1s ease-out;
opacity: 0;
height: 0;
overflow: hidden;
}
Для
.side-menu-wrapper.menu-closed span {
/* display: none;
opacity: 0; */
transition: opacity 1s ease-out;
opacity: 0;
overflow: hidden;
}
И
.side-menu-wrapper span {
margin-left: 5px;
}
Для
.side-menu-wrapper span {
margin-left: 5px;
opacity: 0;
white-space: nowrap;
}
Ответ №2:
Я исправил это в этом JSFIddle
Вот новый CSS, который вы должны использовать:
.container {
margin-top: 15px;
}
.side-menu-wrapper {
background-color: rgb(41, 44, 90);
height: 100vh;
transition: width 0.5s ease-in;
}
.side-menu-wrapper span {
margin-left: 5px;
}
.side-menu-wrapper.menu-closed {
width: 15%;
}
.side-menu-wrapper.menu-closed span {
/* display: none;
opacity: 0; */
transition: opacity 1s ease-out;
opacity: 0;
overflow: hidden;
}
.side-menu-wrapper.menu-open span {
display: inline-block;
float: right;
opacity: 1;
}
.side-menu-wrapper.menu-open {
opacity: 1;
transition: width 0.5s ease-out;
width: 100%;
}
.list-item {
background-color: transparent;
color: rgb(161, 165, 224);
position: relative;
display: flex;
padding: 10px 15px;
border-bottom: 1px solid rgb(161, 165, 224);
}
Подробнее о вашем сбое
Прежде всего, я обновил следующий класс, удалив height: 0;
в вашем переходе, который вызывал конфликт:
.side-menu-wrapper.menu-open {
opacity: 1;
transition: width 0.5s ease-out;
/*height: 0; This line make a conflict and is not needed */
width: 100%;
}
Возможные улучшения
В приведенном ниже классе вы также можете поработать над тем фактом, что в вашем меню после завершения отображаются не только значки, но и странное поле справа
.side-menu-wrapper.menu-closed {
width: 15%;
}
Попробуйте что-то вроде:
.side-menu-wrapper.menu-closed {
width: 5.5%;
}
Комментарии:
1. @RoyBarOn Это исправлено и должно сработать сейчас, если вы хотите попробовать.