JSFiddle - React, Tailwind, and code Playground
by stanney
HTML
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css">
<div class="span3 bs-docs-sidebar">
<ul id="nav-odd" class="nav nav-list bs-docs-sidenav">
<li ng-click="back()">
<a href="#" ng-show="menuLevel == 1">All Categories</a>
<a href="#" ng-show="menuLevel > 1">
<i class="icon-arrow-left right"></i>
<span ng-bind="menuTitleOdd"></span>
</a>
</li>
<li ng-repeat="item in menuDataOdd" ng-click="clickMenu($index)">
<a href="">
<span ng-repeat="(name, value) in item" ng-bind="name"></span>
</a>
</li>
</ul>
<ul id="nav-even" class="nav nav-list bs-docs-sidenav">
<li ng-click="back()">
<a href="#">
<i class="icon-arrow-left right"></i>
<span ng-bind="menuTitleEven"></span>
</a>
</li>
<li ng-repeat="item in menuDataEven" ng-click="clickMenu($index)">
<a href="">
<span ng-repeat="(name, value) in item" ng-bind="name"></span>
</a>
</li>
</ul>
</div>
CSS
.bs-docs-sidebar {
position: relative;
}
.nav {
background-color: white;
width: 100%;
position: absolute;
left: 0;
top: 0;
-webkit-transition-duration: 250ms;
-webkit-transition-timing-function: ease-out;
}
.nav.fadehidden {
opacity: 0;
visibility: hidden;
-webkit-transition-duration: 0ms;
}
.nav.small {
opacity: 0;
-webkit-transform: scale(0.4);
-webkit-transition-duration: 40ms;
}
.nav.big {
opacity: 0;
-webkit-transform: scale(1.5);
-webkit-transition-duration: 40ms;
}
.nav.normal-big {
opacity: 0;
-webkit-transform: scale(1.5);
}
.nav.normal-small {
opacity: 0;
-webkit-transform: scale(0.4);
}
.right {
dislpay: inline;
float: right
}
JavaScript
angular.module('myApp', [])
.controller('myCtrl', ['$scope',
function($scope) {
var navOdd = document.getElementById('nav-odd'),
navEven = document.getElementById('nav-even'),
ngNav = {};
ngNav.Odd = angular.element(navOdd),
ngNav.Even = angular.element(navEven);
ngNav.Even.addClass('fadehidden'); // 一開始先隱藏 nav Even
navOdd.addEventListener('webkitTransitionEnd', onTransitionEnd);
navEven.addEventListener('webkitTransitionEnd', onTransitionEnd);
$scope.menuLevel = 1;
$scope.parity = 'Odd';
$scope.menuDataOdd = [{
'Devices': {
'icon': 'url',
'sub': [{
'Mobile Phones': {
'icon': 'url',
'sub': [{
'hTC': {}
}, {
'Apple': {}
}, {
'Samsung': {}
}]
}
}, {
'Televisions': {}
}, {
'Cameras': {}
}]
}
}, {
'Magazines': {}
}, {
'Store': {}
}, {
'Credits': {}
}];
$scope.menuData1 = [$scope.menuDataOdd[0], $scope.menuDataOdd[1], $scope.menuDataOdd[2], $scope.menuDataOdd[3]];
$scope.clickMenu = function(index) {
var title = Object.keys(this.item)[0];
//替換標題&替換 list
if (this.item[title].sub) {
// 退場效果
$scope.parity = ($scope.menuLevel % 2 == 0) ? 'Even' : 'Odd';
ngNav[$scope.parity].addClass('normal-big');
// 資料繫結
$scope.menuLevel++;
$scope.parity = ($scope.menuLevel % 2 == 0) ? 'Even' : 'Odd';
$scope['menuTitle' + $scope.parity] = title;
$scope['menuData' + $scope.parity] = this.item[title].sub;
$scope['menuData' + $scope.menuLevel] = this.item[title].sub;
// 進場準備
...