New Menu friendly for Mobile

This commit is contained in:
tmshv committed 2017-05-31 21:49:42 +03:00
1 parent ee3ee74650
commit ffba68c4b6
7 files changed
+268 -15

No files matched your search

+15 -4
View File
@@ -9,6 +9,10 @@ const selectedClassName = flag => flag
? 'selected'
: ''
const hmenuCurClassName = flag => flag
? 'HMenu__item--cur'
: ''
const MenuItem = ({active, text, url}) => (active
? <span>{text}</span>
: <a href={itemUrl(url)}>{text}</a>
@@ -17,16 +21,23 @@ const MenuItem = ({active, text, url}) => (active
const Menu = ({items}) => {
const content = items.map((item, index) => (
<li key={index}
className={`${item.color} ${selectedClassName(item.highlighted)}`}
className={`HMenu__item ${hmenuCurClassName(item.highlighted)} ${item.color} ${selectedClassName(item.highlighted)}`}
>
<MenuItem {...item}/>
{!doDrawSubmenu(item) ? null :
{!doDrawSubmenu(item) ? null : (
<Submenu key={index} items={item.items}/>
}
)}
</li>
))
return (
<menu className="main-menu">{content}</menu>
<menu className="main-menu HMenu" data-toggle-width="900">
<div className="HMenu__toggle">
<a href="#">✕</a>
</div>
{content}
</menu>
)
}
+119
View File
@@ -0,0 +1,119 @@
const body = document.querySelector('body')
function isFolded(element) {
return element.classList.contains('HMenu--folded')
}
function isUnfolded(element) {
return element.classList.contains('HMenu--unfolded')
}
function isOpen(element) {
return element.classList.contains('HMenu--open')
}
function isClosed(element) {
return element.classList.contains('HMenu--closed')
}
function foldMenu(element) {
element.classList.remove('HMenu--unfolded')
element.classList.add('HMenu--folded')
return element
}
function unfoldMenu(element) {
element.classList.remove('HMenu--folded')
element.classList.add('HMenu--unfolded')
return element
}
function openMenu(element) {
body.classList.add('no-scroll')
element.classList.remove('HMenu--closed')
element.classList.add('HMenu--open')
return element
}
function closeMenu(element) {
body.classList.remove('no-scroll')
element.classList.remove('HMenu--open')
element.classList.add('HMenu--closed')
return element
}
function toggleMenu(element) {
if (isOpen(element)) {
closeMenu(element)
} else {
openMenu(element)
}
}
function createToggle() {
return `
<div>
<a class="HMenu__toggle" href="#">✕</a>
</div>
`
}
function getToggleWidth(element) {
const value = element.dataset.toggleWidth
if (value) return Number(value)
return 700
}
function runHmenu() {
const menus = [...document.querySelectorAll('.HMenu')]
function initMenus() {
const w = body.clientWidth
return menus
.map(menu => {
const toggle = menu.querySelector('.HMenu__toggle')
toggle.addEventListener('click', e => {
e.preventDefault()
toggleMenu(menu)
})
const toggleWidth = getToggleWidth(menu)
const foldedState = w < toggleWidth
if (foldedState) {
return foldMenu(menu)
} else {
return unfoldMenu(menu)
}
})
.map(menu => closeMenu(menu))
}
function handleMenus() {
const w = body.clientWidth
return menus.map(menu => {
const toggleWidth = getToggleWidth(menu)
const foldedState = w < toggleWidth
if (foldedState && !isFolded(menu)) {
return foldMenu(menu)
} else if (!foldedState && isFolded(menu)) {
return unfoldMenu(menu)
} else {
return menu
}
})
}
initMenus()
window.addEventListener('resize', handleMenus)
}
runHmenu()
-2
View File
@@ -1,8 +1,6 @@
@import "../variables";
.main-menu {
white-space: nowrap;
font-size: $normal-font-size;
list-style: none;
+1 -9
View File
@@ -1,16 +1,8 @@
@import "../variables";
.navigation {
-webkit-overflow-scrolling: touch;
width: 100%;
z-index: 100;
overflow-x: scroll;
position: fixed;
top: 0;
white-space: nowrap;
background-color: rgba(255, 255, 255, 0.95);
background-color: white;
&__body {
display: flex;
+130
View File
@@ -0,0 +1,130 @@
.no-scroll {
overflow: hidden;
}
.HMenu {
display: flex;
flex-direction: row;
align-items: center;
width: 100%;
height: 100%;
position: relative;
list-style: none;
}
.HMenu li {
margin: 0 1em .5em 0;
}
.HMenu--folded.HMenu--closed {
justify-content: center;
}
.HMenu--folded.HMenu--closed .HMenu__item{
display: none;
}
.HMenu--folded .HMenu__item.HMenu__item--cur{
display: block;
}
.HMenu__toggle {
position: absolute;
top: 0;
left: 0;
display: flex;
align-items: center;
height: 3em;
font-size: 1rem;
}
.HMenu--unfolded {
margin-left: 1em;
}
.HMenu--unfolded .HMenu__toggle {
display: none;
}
.HMenu--folded.HMenu--open {
display: flex;
align-items: center;
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
//background-color: rgba(169, 144, 97, 0.95);
background-color: rgba(255, 255, 255, 0.95);
flex-direction: column;
text-align: center;
overflow-y: auto;
font-size: 1.5rem;
/*transition: opacity 0.5s ease-in-out;*/
/*-webkit-transition: opacity 0.5s ease-in-out;*/
}
._HMenu--folded li:last-child {
margin-bottom: 2em;
}
.HMenu__item {
max-width: 10em;
}
.HMenu__toggle {
padding: 0 .5em;
}
.HMenu__toggle a {
text-decoration: none;
border: none;
}
.HMenu__toggle a:hover {
font-weight: bold;
}
+1
View File
@@ -39,6 +39,7 @@
@import "footer";
@import "kazimir/video";
@import "hmenu";
// THEMES
+2
View File
@@ -114,6 +114,8 @@
{{{content}}}
<script src="app.js"/>
<script>
function initDisqus() {
const script = document.createElement('script')