一个jQuery和CSS/CS3驱动的圆形滑块,允许您从排列成圆形的一副牌中选择一张牌。
1.将尽可能多的卡片添加到滑块中。
<div class="slider">
<div class="slider-inner">
<div class="slider-origin">
<div class="slider-item">1</div>
<div class="slider-item">2</div>
<div class="slider-item">3</div>
<div class="slider-item">4</div>
<div class="slider-item">5</div>
...
</div>
</div>
</div>
2.将样式应用于卡片滑块。
.slider-origin {
background-color: #bd2cbd;
border-radius: 50%;
display: inline-block;
position: relative;
}
.slider-inner {
display: inline-block;
}
.slider-item {
width: 74px;
height: 100px;
background-color: rgba(128,0,128,0.4);
box-shadow: 0 0 3px 1px rgba(0,0,0,0.1);
border-radius: 3px;
position: absolute;
bottom: 200%;
left: 50%;
margin-left: -37px;
cursor: pointer;
transform-origin: center 175%;
-webkit-transform-origin: center 175%;
-ms-transform-origin: center 175%;
-moz-transform-origin: center 175%;
transition: transform 0.5s;
-webkit-transition: transform 0.5s;
-ms-transition: transform 0.5s;
-moz-transition: transform 0.5s;
text-align: left;
color: #fff;
padding: 7px;
box-sizing: border-box;
-moz-user-select: -moz-none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
.slider-item.active {
background-color: purple;
cursor: default;
}
.slider-item:not(.active):hover {
background-color: #540554;
}
3.在文档末尾加载最新的jQuery JavaScript库。
<script src="/path/to/cdn/jquery.min.js"></script>
4.在jQuery之后添加以下JS片段。就是这样。
$(document).ready(function () {
// helpful variables
var slider = $('.slider');
var sliderInner = slider.find('.slider-inner');
var sliderOrigin = slider.find('.slider-origin');
var sliderItems = slider.find('.slider-item');
var itemsLength = sliderItems.length;
var calcDeg = 270 / itemsLength;
var clickDown = false;
var mouseMove = false;
var moveFrom = null;
var moveTo = null;
var extraDeg = 0;
var currentItem = sliderItems.eq(0);
// slider origin width & height = half of item height
sliderOrigin.width(sliderItems.outerHeight() / 2);
sliderOrigin.height(sliderItems.outerHeight() / 2);
// slider inner width & height = item height * 3.5
sliderInner.width(sliderItems.outerHeight() * 3.5);
sliderInner.height(sliderItems.outerHeight() * 3.5);
var sliderInnerWidth = sliderInner.outerWidth();
var sliderInnerOffset = sliderInner.offset();
sliderOrigin.css('margin-top', (sliderInner.height() / 2) - (sliderOrigin.height() / 2));
// calc rotation positioning
function rotationPosition(exceptIndex) {
exceptIndex = exceptIndex | 0;
var i = 1;
sliderItems.each(function (e) {
var $this = $(this);
extraDeg = exceptIndex > itemsLength / 2 ? 360 : 0;
if (e === exceptIndex) {
$this.addClass('active').css('transform', 'rotate(' + extraDeg + 'deg)');
} else {
$this.css('transform', 'rotate(' + ((i * calcDeg) + 45) + 'deg)');
i++;
}
});
}
rotationPosition();
// click event on item
var clickedItemIndex = null;
function sliderItemsClickEvent() {
sliderItems.mousedown(function (e) {
if (clickedItemIndex == null && e.which == 1) {
clickedItemIndex = $(this).index();
}
});
sliderItems.mouseup(function () {
var $this = $(this);
if (clickedItemIndex === $this.index()) {
currentItem = $this;
pushIndex($this.index());
}
});
}
sliderItemsClickEvent();
// push index of the activated item
function pushIndex(index) {
sliderItems.removeClass('active');
rotationPosition(index);
}
// clickDown = true if mousedown on slider
sliderInner.mousedown(function (e) {
clickDown = true;
moveFrom = e.pageX;
});
// clickDown = false if mouseup on any place in the page
$(document).mouseup(function (e) {
clickDown = false;
setTimeout(function () {
clickedItemIndex = null;
}, 505);
// setTimeout(function(){clickDown = false;}, 505);
if (mouseMove) {
mouseMove = false;
moveto = e.pageX;
swipe(moveFrom, moveto);
}
});
// calc mouse move on sliderInner div
sliderInner.mousemove(function (e) {
if (clickDown) {
if (!mouseMove) {
mouseMove = true;
}
var offsetX = e.pageX - sliderInnerOffset.left;
var move = moveFrom - sliderInnerOffset.left;
var motionDeg = ((offsetX - move) / sliderInnerWidth) * (calcDeg * 2);
extraDeg = currentItem.index() > itemsLength / 2 ? 360 : 0;
sliderInner.find('.slider-item.active').css('transform', 'rotate(' + (motionDeg + extraDeg) + 'deg)');
}
});
function swipe(from, to) {
var distance = Math.abs(from - to); // mouse move distance
var rightDir = from < to;
if (distance > sliderInnerWidth / 4) {
navigate();
} else {
currentItem.css('transform', 'rotate(' + (currentItem.index() > itemsLength / 2 ? 360 : 0) + 'deg)');
}
function navigate() {
if (rightDir) {
var nextIndex = currentItem.next().index();
pushIndex(nextIndex != -1 ? nextIndex : 0);
} else {
var prevIndex = currentItem.prev().index();
pushIndex(prevIndex != -1 ? prevIndex : sliderItems.length - 1);
}
currentItem = sliderInner.find('.slider-item.active');
}
}
});