Angular Material
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2345373/angular-logo.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637572/evolution-of-design.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637117/19-02_first_webpages.png)
1992
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637142/25-17_yahoo_96.jpg)
1996
1997
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637167/google_1473879a.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637224/12312312432136546375.jpg)
Web 2.0
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637260/online-booking-website-design-2.jpg)
Skeuomorphism
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637270/Grand.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637278/iphone-skeuomorphic-design.jpg)
Metro and the beginning of Modern UI
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637305/a593280f3b09468f9ebafd4615bd856a.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2646140/theme06screenshot.jpg)
Twitter Bootstrap
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637339/bootstrap-example-fluid.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637347/0cd82df6c7d3415d93ea14c013971185.jpg)
The crisis of “flat vs skeuomorphism”
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637381/f53c8339c2344daeab49e7992c0ac9b5.png)
Google’s Material Design
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637673/9d2b4d2266d1287a08e127193d42b2f8.jpg)
I'm very HUNGRY
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637395/adafruit_4009.jpg)
design language
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637689/screencapture-www-ibm-com-design-language-inspiration-1463686117544.png)
Так что же дальше?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637747/900x300.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2637775/android-tv-auto-wear.jpg)
Что такое Material Design?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2669004/0a1974d503a0401e9be380a520a0ac47.jpg)
Набор принципов разработки для приложений, основанных на физических принципах бумаги и чернил в сочетании с наукой и техникой.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2669031/material-city-site-1000x429.jpg)
Что такое Angular Material Design?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2666252/26-05-2016_2-35-50.png)
Website & Docs | https://material.angularjs.org |
GitHub | https://github.com/angular/material |
Latest stable release | 1.0.9 |
angular-material.min.js | 309.1KB |
angular-material.min.css | 434.2KB |
Project stated | 2014 |
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2669463/30dfc2f0-6e6a-11e4-9723-07c918128f4f.png)
CAN I USE?
- Browser Support (n-1)
- Tested on IE 11+, Chrome, Safari, Firefox, Android 4.2+ and iOS 8+
- Angular 1.3.x or higher
ОСНОВНЫЕ МОМЕНТЫ
- Themes
- Grid (Flexbox)
- Input Elements
- Accessibility
- Touch Support
Как начать?
Требования
- > Angular 1.3.x
- ngAria
- ngAnimate
Желательно
- ngMessages
- ngSanitize
- ngRoute
Не поддерживается
- ngTouch
- Ionic
Установка
npm install angular-material
jspm install angular-material
require('angular-material')
bower install angular-material
NPM
JSPM
Browserify | Webpack | NPM | JSPM
Bower
Подключения файлов
<script src="//ajax.googleapis.com/ajax/libs/angular_material/1.1.0-rc2/
angular-material.min.js"></script>
JS
<link rel="stylesheet" href="/bower_components/angular-material/angular-material.css">
CSS
<script src="/bower_components/angular-material/angular-material.js"></script>
JS
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/angular_material/
1.1.0-rc2/angular-material.min.css">
CSS
CDN - Google Hosted Libraries.
Подключения модуля
angular.module('app', ['ngMaterial']);
ngMaterial
<html lang="en" >
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Angular Material style sheet -->
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0-rc2/
angular-material.min.css">
</head>
<body ng-app="BlankApp" ng-cloak>
<!--
Your HTML content here
-->
<!-- Angular Material requires Angular.js Libraries -->
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular-animate.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular-aria.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.3/angular-messages.min.js"></script>
<!-- Angular Material Library -->
<script src="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0-rc2/angular-material.min.js">
</script>
<!-- Your application bootstrap -->
<script type="text/javascript">
/**
* You must include the dependency on 'ngMaterial'
*/
angular.module('BlankApp', ['ngMaterial']);
</script>
</body>
</html>
Basic template
Layout
layout | flex | show |
---|---|---|
layout-align | flex-order | hide |
layout-fill | flex-offset | |
layout-wrap | ||
layout-nowrap | ||
layout-margin | ||
layout-padding |
<div layout="column" layout-xs="row" class="zero">
<div flex="20" flex-md="50" class="one"></div>
<div flex="33" layout="column" layout-md="row" class="two">
<div flex="22" flex-md="10" hide-lg class="two_one"></div>
<div flex="30px" show hide-md="true" flex-md="25" class="two_two"></div>
<div flex="20" flex-md="65" class="two_three"></div>
</div>
<div flex class="three"></div>
</div>
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2664691/687474703a2f2f6d6174657269616c2d64657369676e2e73746f726167652e676f6f676c65617069732e636f6d2f7075626c6973682f6d6174657269616c5f765f342f6d6174657269616c5f6578745f7075626c6973682f3042386f6c5631354a3761625053474678656d4.png)
Layout Grid
xs | '(max-width: 599px)' |
gt-xs | '(min-width: 600px)' |
sm | '(min-width: 600px) and (max-width: 959px)' |
gt-sm | '(min-width: 960px)' |
md | '(min-width: 960px) and (max-width: 1279px)' |
gt-md | '(min-width: 1280px)' |
lg | '(min-width: 1280px) and (max-width: 1919px)' |
gt-lg | '(min-width: 1920px)' |
xl | '(min-width: 1920px)' |
layout-xs | flex-xs | show-xs | hide-xs ...
Breakpoint Aliases
Directives
<md-button> Flat Button </md-button>
<md-button href="http://google.com"> Flat link </md-button>
<md-button class="md-raised"> Raised Button </md-button>
<md-button ng-disabled="true"> Disabled Button </md-button>
<md-button>
<md-icon md-svg-src="your/icon.svg"></md-icon>
Register Now
</md-button>
<md-dialog>
<form>
<md-input-container>
<label for="testInput">Label</label>
<input id="testInput" type="text" md-autofocus> // Directive attribute md-autofocus
</md-input-container>
</form>
</md-dialog>
Directive Element
Directive Attribute
1. md-autocomplete | 14. md-fab-actions |
2. md-autofocus | 15. md-fab-speed-dial |
3. md-button | 16. md-fab-toolbar |
4. md-card | 17. md-fab-trigger |
5. md-checkbox | 18. md-grid-list |
6. md-chip | 19. md-grid-tile |
7. md-chip-remove | 20. md-highlight-text |
8. md-chips | 21. md-icon |
9. md-contact-chips | 22. md-ink-ripple |
10. md-content | 23. md-input |
11. md-datepicker | 24. md-input-container |
12. md-dialog | 25. md-list |
13. md-divider | 26. md-list-item |
27. md-menu | 40. md-swipe-left |
28. md-menu-bar | 41. md-swipe-right |
29. md-progress-circular | 42. md-swipe-up |
30. md-progress-linear | 43. md-switch |
31. md-radio-button | 44. md-tab |
32. md-radio-group | 45. md-tabs |
33. md-select | 46. md-toolbar |
34. md-select-on-focus | 47. md-tooltip |
35. md-sidenav | 48. md-virtual-repeat |
36. md-sidenav-focus | 49. md-virtual-repeat-container |
37. md-slider | 50. md-whiteframe |
38. md-subheader | |
39. md-swipe-down |
Services
-
$mdBottomSheet
-
$mdDateLocaleProvider
-
$mdDialog
-
$mdIcon
-
$mdIconProvider
-
$mdInkRipple
-
$mdMedia
-
$mdSidenav
-
$mdSticky
-
$mdToast
app.config(function($mdIconProvider) {
// Configure URLs for icons specified by [set:]id.
$mdIconProvider
.defaultFontSet( 'fa' ) // This sets our default fontset className.
.defaultIconSet('my/app/icons.svg') // Register a default set of SVG icons
.iconSet('social', 'my/app/social.svg') // Register a named icon set of SVGs
.icon('alarm', 'my/app/alarm.svg') // Register a specific icon (by name)
.icon('work:chair', 'my/app/chair.svg'); // Register icon in a specific set
});
<md-icon> face </md-icon>
<md-icon md-font-set="fa"> &#x[unicode] </md-icon> // unicode f0f3
<md-icon md-font-set="material-icons"> face </md-icon>
<md-icon
md-font-icon="android"
aria-label="android">
</md-icon>
<md-icon
class="icon_home"
aria-label="Home">
</md-icon>
<md-icon
md-svg-icon="alarm"
style="color: #0F0;"
aria-label="Alarm Icon">
</md-icon>
<md-icon
md-svg-icon="social:cake"
aria-label="Cake Icon">
</md-icon>
Customization
<md-button class="btn1"> Button </md-button>
.btn1 {
color : rgb(49, 46, 46);
background-color: rgba(255, 222, 121, 0.96);
border-radius: 10px 0 0 10px;
font-size: 16px;
}
.btn1:not([disabled]):hover {
background-color: rgba(107, 103, 91, 0.96);
color: white;
}
.btn1[disabled] {
color : rgb(187, 187, 187);
background-color: rgba(230, 230, 229, 0.96);
}
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2669059/c1b1c700-0939-11e5-879c-ba804ca03267.png)
Theming
angular.module('myApp', ['ngMaterial'])
.config(function($mdThemingProvider) {
$mdThemingProvider.theme('default')
.primaryPalette('indigo')
.accentPalette('orange')
.warnPalette('red')
.backgroundPalette('lime');
});
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2665627/26-05-2016_0-08-26.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2665863/33.png)
<md-button class="md-raised md-primary">Click me</md-button>
<md-button class="md-raised md-accent">or maybe me</md-button>
<md-button class="md-raised md-warn">Careful</md-button>
<md-button class="md-raised md-primary">Click me</md-button>
<md-button class="md-raised md-primary md-hue-1">Click me</md-button>
<md-button class="md-raised md-primary md-hue-2">Click me</md-button>
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2665792/26-05-2016_0-46-24.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2665809/26-05-2016_0-48-33.png)
angular.module('myApp', ['ngMaterial'])
.config(function($mdThemingProvider) {
$mdThemingProvider.definePalette('amazingPaletteName', {
'50': 'ffebee',
'100': 'ffcdd2',
'200': 'ef9a9a',
'300': 'e57373',
'400': 'ef5350',
'500': 'f44336',
'600': 'e53935',
'700': 'd32f2f',
'800': 'c62828',
'900': 'b71c1c',
'A100': 'ff8a80',
'A200': 'ff5252',
'A400': 'ff1744',
'A700': 'd50000',
'contrastDefaultColor': 'light', // whether, by default, text (contrast)
// on this palette should be dark or light
'contrastDarkColors': ['50', '100', //hues which contrast should be 'dark' by default
'200', '300', '400', 'A100'],
'contrastLightColors': undefined // could also specify this if default was 'dark'
});
$mdThemingProvider.theme('default')
.primaryPalette('amazingPaletteName');
});
$mdThemingProvider.definePalette('new', {
'50': '#e8eaf6',
'100': '#c5cae9',
'200': '#9fa8da',
'300': '#7986cb',
'400': '#5c6bc0',
'500': '#3f51b5',
'600': '#3949ab',
'700': '#303f9f',
'800': '#283593',
'900': '#1a237e',
'A100': '#8c9eff',
'A200': '#536dfe',
'A400': '#3d5afe',
'A700': '#304ffe',
'contrastDefaultColor': 'light',
'contrastDarkColors': '50 100 200 A100'
});
Multiple Themes
angular.module('myApp', ['ngMaterial'])
.config(function($mdThemingProvider) {
$mdThemingProvider.theme('altTheme')
.primaryPalette('purple') // specify primary color, all
// other color intentions will be inherited
// from default
});
$mdThemingProvider.setDefaultTheme('altTheme');
<div>
<md-button ng-click="dynamicTheme = 'default'">Default</md-button>
<md-button ng-click="dynamicTheme = 'altTheme'">altTheme</md-button>
<div md-theme="{{ dynamicTheme }}" md-theme-watch>
<md-button class="md-primary">I'm dynamic</md-button>
</div>
</div>
$mdThemingProvider.alwaysWatchTheme(true);
Примеры
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2666168/26-05-2016_2-12-57.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2666169/26-05-2016_2-10-30.png)
Проекты на основе Angular Material
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2669861/screencapture-instantchat-io-1464269191140.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/468718/images/2669876/screencapture-app-trendingdevs-com-1464269365464.png)
Pros
- Поддерживается Google
- Flexbox
- Красивая
- Не Bootstrap
- Нет jQuery
- Много компонентов
- Customization
- Theme
- On Trend
Cons
- Ionic
- Размер
- Old Browsers
- Все компоненты в одном файле
Angular Material v1.x
By Shuhratbek Mamadaliyev
Angular Material v1.x
- 2,330