React lava lamp menu
react DOM manipulation
by Oleh Kotsubko
HTML
<div id="app"></div>
SCSS
body {
background: #20262E;
}
.list {
position: relative;
padding-left: 5px;
max-width: 200px;
border: 1px solid;
&__item {
&.active {
a {
color: #C52B2E;
}
}
a {
color: #fff;
text-decoration: none;
font-family: sans-serif;
padding: 5px 15px;
display: block;
}
}
}
#lava-stick {
position: absolute;
left: 0;
top: 0;
width: 3px;
height: 28px;
background: #C52B2E;
transition: .3s ease;
}
React
class LavaMenu extends React.Component {
constructor(props) {
super(props)
this.state = {
items: [
{ id:1, text: "item 1", isActive: true},
{ id:2, text: "item 2", isActive: false},
{ id:3, text: "item 3", isActive: false},
{ id:4, text: "item 4", isActive: false},
{ id:5, text: "item 5", isActive: false}
]
}
this.stick = React.createRef();
}
clickHandler=(e)=>{
alert(e.target.parentNode.className);
}
containerMouseOutHandler=(e)=>{
let targetContainer = e.target.closest('.list');
let targetContainerOffset = targetContainer.offsetTop;
}
itemMouseEnterHandler=(e)=>{
let target = e.target;
let targetOffset = target.closest('.list__item').offsetTop;
this.refs.stick.style.top = targetOffset + 'px';
}
render(){
return (
<div>
<div className="spacer">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Temporibus fuga magni fugit deserunt facilis officiis soluta rem quas inventore obcaecati ea, provident laudantium qui! Doloribus quibusdam dolorem, fugit asperiores quisquam.</div>
<ul className="list" onMouseOut={() => this.containerMouseOutHandler()}>
<li id="lava-stick" ref="stick" />
{this.state.items.map(item => (
<li key={item.id} onClick={this.clickHandler} onMouseEnter={this.itemMouseEnterHandler} className={`list__item ${item.isActive ? 'active' : ''}`}><a href="#">{item.text }</a></li>
))}
</ul>
</div>
)
}
}
ReactDOM.render(<LavaMenu />, document.querySelector("#app"))