Реализация определения размера устройства в AngularJS
Идея описана здесь — https://blog.bullgare.com/2013/12/%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%82%D0%B8%D0%BF%D0%B0-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0-%D0%B2-js-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-media/.
Т.е. через media-queries
задавать параметры, которые определят размеры устройства, по этим параметрам менять z-index
. Затем создать в js
-файле такой элемент скрытым и считывать его z-index
в любой момент.
Особенно это удобно делать в css
-препроцессорах, чтобы параметризовать параметры media-queries
. Тогда изменения внешнего вида сайта через css
будут происходить одновременно с изменением функциональности js
-приложения.
Единственный минус — надо синхронизировать значения z-index
-ов между scss
и js
, но меняются они не часто.
Ниже приведу пример реализации на scss
.
_variables.scss
1 |
$smallScreenWidth: 450px; |
_device_detector.scss
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
.__device_detector__ { $valDefault: 1; $valSmall: 10; position: absolute; top: -999em; left: -999em; z-index: $valDefault; @include media("max-width: #{$smallScreenWidth}") { z-index: $valSmall; } @include media("max-height: #{$smallScreenWidth}") { z-index: $valSmall; } } |
utils.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
... /** * This service is for getting device's type according to it's width/height */ .factory('DeviceDetectorService', [function DeviceDetectorService() { var deviceTypes = { 1: 'default', 10: 'small' }, className = '__device_detector__', el; return { /** * Inserts 'div' element into DOM */ init: function init() { el = document.createElement('div'); el.className = className; document.body.appendChild(el); }, /** * Gets device's type by media query */ getType: function getType() { var defaultType = deviceTypes[1]; if (! el || ! ('getComputedStyle' in window)) { return defaultType; } var id = parseInt(window.getComputedStyle(el).getPropertyValue('z-index'), 10); return deviceTypes[id] || defaultType; } }; }]); |
app.js
1 2 3 4 5 6 7 |
.run(['$rootScope', 'DeviceDetectorService', function ($rootScope, DeviceDetectorService) { // инициализация DeviceDetectorService.init(); // и сразу пример использования $rootScope.isSmallDeviceOnInit = 'small' === DeviceDetectorService.getType(); }]) |
При необходимости можно отслеживать изменение размеров окна, после чего оповещать об этом. Но в моём приложении этим занимается другой сервис, и тут не место его описывать.
Similar Posts
- None Found
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.