var app = angular.module('MyApp', [])
.controller('SettingsCtrl', function($scope, $window, $element) {
$scope.isOpen = false;
$scope.slideDown = function (event) {
$scope.isOpen = !$scope.isOpen;
// Click was out of scope
$scope.$apply();
};
$scope.setOpen = function() {
$scope.isOpen = !$scope.isOpen;
};
})
.directive('clickAnywhereButHere', function($document) {
return {
restrict: 'A',
scope: {
callback : '=clickAnywhereButHere'
},
link: function(scope, element, attr, ctrl) {
var handler = function(event) {
if (!element[0].contains(event.target)) {
scope.callback(event);
}
};
$document.on('click', handler);
scope.$on('$destroy', function() {
$document.off('click', handler);
});
}
}
});
<!DOCTYPE html>
<html ng-app="MyApp">
<head lang="en">
<meta charset="utf-8">
<title>Hide element</title>
<script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"></script>
<link rel="stylesheet" href="style.css">
<script>
document.write('<base href="' + document.location + '" />');
</script>
<script src="app.js"></script>
</head>
<body>
<div id="content">
<h1>
This shows how to collapse an element when clicked outside of it.
</h1>
<div id="app-navigation">
<div id="app-settings" ng-controller="SettingsCtrl" ng-class="{'open': isOpen}">
<div id="app-settings-header">
<button class="settings-button" tabindex="0" ng-click="setOpen($event)">Settings</button>
</div>
<div id="app-settings-content" click-anywhere-but-here="slideDown">
<dl>
<dt>Login</dt>
<dd>
<input ng-model="user.login" type="text" />
</dd>
<dt>Password</dt>
<dd>
<input ng-model="user.password" type="password" />
</dd>
</dl>
<button>Login</button>
</div>
</div>
</div>
<div id="app-content"></div>
</div>
</body>
</html>
/* CSS goes here */
body {
font-family: sans-serif;
}
h1 {
width: 100%;
border-bottom: thin solid silver;
margin: 0;
background-color: #EEE;
}
#content {
height: 100%;
position: absolute;
width: 100%;
}
#app-navigation {
box-sizing: border-box;
background-color: #F8F8F8;
border-right: 1px solid #CCC;
float: left;
height: 100%;
padding-bottom: 44px;
width: 300px;
}
#app-settings {
border-top: 1px solid #CCC;
bottom: 0;
position: fixed;
width: 299px;
}
#app-settings.open #app-settings-content {
display: block;
max-height: 300px;
overflow-y: auto;
}
#app-settings-header {
background-color: #EEE;
}
#app-settings-content {
background-color: #EEE;
display: none;
padding: 10px;
}
#app-settings.open #app-settings-content {
display: block;
max-height: 300px;
overflow-y: auto;
}
.settings-button {
background-color: rgba(0, 0, 0, 0);
background-position: 10px center;
background-repeat: no-repeat;
border: 0 none;
border-radius: 0;
box-shadow: none;
display: block;
height: 44px;
margin: 0;
padding: 0;
width: 100%;
font-weight: bold;
}
#app-content {
height: 100%;
overflow-y: auto;
}