JSFiddle - React, Tailwind, and code Playground
HTML
<div class="container">
<div class="view list-view">
<ul class="list">
<li class="list-item">Item 1</li>
<li class="list-item">Item 2</li>
<li class="list-item">Item 3</li>
<li class="list-item">Item 4</li>
</ul>
</div>
<div class="view details-view">
<h1>
Details view for
<span class="item-name"></span>
</h1>
<button class="back-button">Back</button>
</div>
</div>
CSS
html,
body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
font-family: 'Helvetica', Arial, sans-serif;
}
.container {
width: 100%;
height: 100%;
max-width: 500px;
max-height: 600px;
overflow: hidden;
position: relative;
}
.view {
will-change: transform;
width: 100%;
position: absolute;
left: 0;
top: 0;
transition: transform 0.3s cubic-bezier(0.465, 0.183, 0.153, 0.946);
}
.list-view {
height: 100%;
width: 100%;
position: relative;
overflow: scroll;
-webkit-overflow-scrolling: touch;
}
.details-view {
transform: translateX(100%);
box-sizing: border-box;
padding: 30px;
}
.view-change .list-view {
transform: translateX(-100%);
}
.view-change .details-view {
transform: translateX(0);
}
.list {
list-style: none;
padding: 0;
margin: 0;
}
.list li {
box-sizing: border-box;
line-height: 50px;
padding: 0 30px;
border-bottom: 1px solid #ccc;
background: line-gradient(to bottom, #fff, #fafafa);
}
JavaScript
function onViewChange(evt) {
container.classList.toggle('view-change');
if (evt.currentTarget.classList.contains('list-item')) {
itemName.textContent = evt.currentTarget.textContent;
}
}
var container = document.querySelector('.container');
var itemName = document.querySelector('.item-name');
var backButton = document.querySelector('.back-button');
var listItems = document.querySelectorAll('.list li');
for (var i = 0; i < listItems.length; i++) {
listItems[i].addEventListener('click', onViewChange, false);
}
backButton.addEventListener('click', onViewChange);