Switcher
by evgkch
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.1/react-with-addons.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.1/JSXTransformer.js"></script>
<div id="app"></div>
SCSS
.slider-bar {
user-select: none;
.slider {
display: flex;
width: inherit;
align-items: center;
user-select: none;
.scale {
display: flex;
width: inherit;
align-items: center;
.bar {
display: flex;
position: absolute;
align-items: center;
justify-content: center;
height: 100%;
div {
width: 100%;
height: 2px;
background-color: rgb(220,220,220);
}
}
.scale-element {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
cursor: pointer;
height: 100%;
.scale-element-border {
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
z-index: 99;
div {
transition: all 0.2s;
background-color: rgb(220,220,220);
border-radius: 100%;
}
&:hover {
div {
background-color: rgb(190,190,190);
}
}
}
}
}
.switcher-border {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
transition: all 0.1s ease-out;
cursor: pointer;
position: absolute;
user-select: none;
z-index: 999;
.switcher {
background-color: rgb(29, 182, 119);
border-radius: 100%;
}
}
}
}
Babel + JSX
class Store {
constructor(storeID, data) {
this.storeID = storeID;
this.data = data || {};
}
update(state) {
let bufferStore = Object.assign({}, this.data, state);
this.data = bufferStore;
updateApp();
this.view();
}
view() {
console.log(this)
}
}
const options = (amount) => Array.from({ length: amount }, (v, k) => ({ value: k + 1, label: `Label ${k + 1}` }));
const updateApp = () => React.render(
<SliderBar options={options(5)} sliderWidth={500} switcherSize={15} value={3} />,
document.getElementById('app')
);
class SliderBar extends React.Component {
constructor(props) {
super(props);
this.ratio = 1.6;
this.sliderScale = this.props.options.length;
this.state = { value: 1, _isMouseDown: false };
}
componentDidMount() {
this.sliderElement = this.slider.getDOMNode().getBoundingClientRect();
this.setSwitcherValue(this.props.value);
}
componentWillUnmount() {
clearTimeout(this.asyncEvent);
}
onChange(value) {
// send data to server
return value;
}
setSwitcherValue(value) {
if (value !== this.state.value) {
this.setState({ value });
this.limitSendSpeed(this.onChange.bind(this), value, 500);
}
}
getSwitcherX(value) {
const switcherAbsoluteX = (value - 0.5) * this.props.sliderWidth / this.sliderScale;
const switcherCorrectiveX = -this.props.switcherSize * (1 - (this.ratio / 2));
return Math.floor(switcherAbsoluteX + switcherCorrectiveX);
}
limitSendSpeed(fn, arg, timeSpan) {
this.lastUpdate = new Date();
this.asyncEvent = setTimeout(() => {
if ((new Date()).getTime() - this.lastUpdate.getTime() >= timeSpan) {
fn(arg);
}
},
timeSpan
);
}
listenSlider(e) {
if (this.state._isMouseDown) {
/* eslint no-mixed-operators: ["error", {"allowSamePrecedence": true}] */
const relativeX = e.pageX - this.sliderElement.left;
const value = Math.ceil(this.sliderScale * relativeX /...