Angularjs ui bootstrap: how to vertical center modal component?

23,359

Solution 1

If I understand your problem correctly, you can acheive the vertical center alignment just by using CSS. Add following CSS:

.modal {
  text-align: center;
  padding: 0!important;
}

.modal::before {
  content: '';
  display: inline-block;
  height: 100%;
  vertical-align: middle;
  margin-right: -4px;
}

.modal-dialog {
  display: inline-block;
  text-align: left;
  vertical-align: middle;
}

I have setup a Plunker forked from yours to make a demonstration.

You can find following links Helpful

  1. Bootstrap 3 modal vertical position center
  2. Codepen Emaple

Hope this helps. Cheers !!

Solution 2

The above solutions will apply to all the modals. If you want to apply to selective modals then follow the below given solution.

The CSS uses .class-a.class-b and .class-a .class-b selector and need to set option windowClass.

.center-modal.modal {
  text-align: center;
}

@media screen and (min-width: 768px) { 
  .center-modal.modal:before {
    display: inline-block;
    vertical-align: middle;
    content: " ";
    height: 100%;
  }
}

.center-modal .modal-dialog {
  display: inline-block;
  text-align: left;
  vertical-align: middle;
}

var modalInstance = $uibModal.open({
    templateUrl: 'modules/users/client/views/authentication/login.client.view.html',
    windowClass: "center-modal"
});

Solution 3

You can use windowTopClass property in the object argument for open method.

https://angular-ui.github.io/bootstrap/

$uibModal.open({
  ...
  ...
  windowTopClass: "modal-center-override"
});

with the respective CSS class override

.modal-center-override {
  top: 50% !important;
  transform: translateY(-50%) !important;
  -webkit-transform: translateY(-50%) !important;
  -moz-transform: translateY(-50%) !important;
  -o-transform: translateY(-50%) !important;  
}
Share:
23,359
ahwyX100
Author by

ahwyX100

Updated on July 09, 2022

Comments

  • ahwyX100
    ahwyX100 almost 2 years

    Recently I am learning angularjs. I have used bootstrap before. With jquery, I can easily change the position of the modal component position to make it vertical align. Now with angularjs, it seems not very easy to do that. Here is a plunker link of ui bootstrap modal, Does anyone know how to make it vertical align?

    ui bootstrap modal component

    1.index.html

        <!doctype html>
        <html ng-app="ui.bootstrap.demo">
        <head>
            <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.js"></script>
            <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular-animate.js"></script>
            <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-1.2.1.js"></script>
            <script src="example.js"></script>
            <link href="//netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
        </head>
        <body>
            <div ng-controller="ModalDemoCtrl">
                <script type="text/ng-template" id="myModalContent.html">
                    <div class="modal-header">
                        <h3 class="modal-title">I'm a modal!</h3>
                    </div>
                    <div class="modal-body">
                        This is modal body
                    </div>
                    <div class="modal-footer">
                        <button class="btn btn-primary" type="button" ng-click="ok()">OK</button>
                        <button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button>
                    </div>
                </script>
                <button type="button" class="btn btn-default" ng-click="open()">Open me!</button>
            </div>
        </body>
    </html>
    

    2.example.js

        angular.module('ui.bootstrap.demo', ['ngAnimate', 'ui.bootstrap']);
        angular.module('ui.bootstrap.demo').controller('ModalDemoCtrl', function($scope, $uibModal, $log) {
    
            $scope.items = ['item1', 'item2', 'item3'];
    
            $scope.animationsEnabled = true;
    
            $scope.open = function(size) {
    
                var modalInstance = $uibModal.open({
                    animation: $scope.animationsEnabled,
                    templateUrl: 'myModalContent.html',
                    controller: 'ModalInstanceCtrl',
                    size: size,
                    resolve: {
                        items: function() {
                            return $scope.items;
                        }
                    }
                });
            };
        });
    
        angular.module('ui.bootstrap.demo').controller('ModalInstanceCtrl',   function($scope, $uibModalInstance, items) {
            $scope.ok = function() {
                $uibModalInstance.close($scope.selected.item);
            };
    
            $scope.cancel = function() {
                $uibModalInstance.dismiss('cancel');
            };
        });
    
  • ahwyX100
    ahwyX100 over 8 years
    Thanks, this solves my problem, I haven't thought it could be solved in pure css.