У меня есть следующий код:
angular.module("myApp", []).controller("myController", function($scope) {
$scope.toggleBlue = false;
});
span {
cursor: pointer;
}
.wrapper {
display: flex;
justify-content: space-between;
padding: 10px;
background-color: grey;
margin-top: 10px;
}
.row {
width: 35%;
}
.first {
flex: 1;
background-color: red;
}
.second {
display: flex;
}
.toggle {
width: 80%;
background-color: blue;
}
.decrease {
width: 30px;
height: 20px;
background-color: yellow;
}
.noWidth {
width: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="myApp" ng-controller="myController">
<span ng-click="toggleBlue = !toggleBlue">TOGGLE BLUE BOX</span>
<div class="wrapper">
<div class="row first"></div>
<div class="row second" ng-class="{noWidth: toggleBlue}">
<div class="toggle" ng-if="!toggleBlue"></div>
<div class="decrease"></div>
</div>
</div>
</body>
Когда я нажимаю на текст "TOGGLE BLUE BOX", он должен скрывать синий квадрат с ng-if
, увеличивать красный квадрат, чтобы заполнить его flex: 1;
и измените ширину желтого прямоугольника с ng-class
. Поэтому он должен просто переключать синий ящик. Это отлично работает на хроме. Но когда я пытаюсь сделать это на iPad в браузере Safari, он удаляет синюю рамку, но не увеличивает красную. Кроме того, желтая коробка, а не в конце, она за красным выглядит так:
Мой ожидаемый результат такой же, как здесь, в фрагменте. Как я могу исправить это на сафари? Я попробовал это с помощью flex: 1 1 auto;
на классе. .first
в случае flex 1;
, но это не сработало. Есть идеи?
благодаря
Хорошо... Я немного смущен относительно вашего кода. Вы определяете гибкость отображения, но не используете его на всех дочерних элементах. Я исправил это как можно лучше, но дайте мне знать, если что-то не так.
Кроме того, если вам интересно, почему Safari волновался, в основном ваш css не соответствовал надлежащим стандартам (не определяя flex для всех элементов управления для детей).
angular.module("myApp", []).controller("myController", function($scope) {
$scope.toggleBlue = false;
});
span {
cursor: pointer;
}
.wrapper {
display: flex;
flex-direction: row;
justify-content: space-between;
background-color: grey;
padding: 10px;
height: 25px;
}
.first {
flex: 1 1 35px;
background-color: red;
}
.second {
flex: 1 1 35px;
background-color: blue;
}
.third{
flex: 0 0 35px;
background-color: yellow;
}
.noWidth {
flex: 0 0 0px;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="myApp" ng-controller="myController">
<span ng-click="toggleBlue = !toggleBlue">TOGGLE BLUE BOX</span>
<div class="wrapper">
<div class="first"></div>
<div class="second" ng-class="{noWidth: toggleBlue}"></div>
<div class="third"></div>
</div>
</body>
display: flex
имеет flex: 1 1 auto
или что-то подобное. Если вы этого не сделаете, браузер должен использовать кучу странных сценариев резервного копирования, которые могут работать некорректно в разных браузерах (как вы заметили). Для получения дополнительной информации здесь отличный учебник flexbox! css-tricks.com/snippets/css/a-guide-to-flexbox
добавленной
.decrease {
flex: 1 0;
}
width: 35%;
для.row
?