如何创建圆形内容滑块?

how to create round content slider?

谁知道如何制作这样的滑块?可能有一些插件,Google搜索没有提示任何东西..

通过单击箭头或图标本身 - 滑块旋转,单击的图标出现在顶部,相应地更改红色框中的内容。

执行此类操作的一种方法是使用 transform:rotateZ,如此 fiddle

所示

已更新以自动执行很多步骤

它的工作方式是定义一个 'dial',并在刻度盘内旋转“div.item”,使它们 space 在刻度盘周围均匀分布。然后它在每个 div 内旋转 '.icon',使它们看起来是直的。

<div id='dial'>
    <div id='item1'class='item'>
        <div class='icon'>1</div>
    </div>
    <div id='item2' class='item'>
        <div class='icon'>2</div>
    </div>
    ... 
</div>

通过应用以下 css。

它变成了一个看起来不错的表盘
#dial{
    width:500px;
    height:500px;
    border-radius:100%;
    border:1px solid black;
    position:relative;
}
.item{
    position:absolute;
    left:225px;
    top:10px;
    width:50px;
    height:50px;
    border:1px solid gray;
    border-radius:100%;
    text-align:center;
    transform-origin:25px 225px;
}
.icon{
    width:50px;
    height:50px;
    transform-origin:25px 25px;
}

重要的是定义项目的变换原点,因此它们围绕表盘的中心而不是它们自己的中心旋转。每个 individual item 和 div 的实际旋转是由脚本执行的。该脚本还会自动附加用于左右旋转表盘和跳转到项目的处理程序。

function dial(el){
    var $dial = $(el);
    var $items = $dial.find('.item');
    var amount = $items.length;
    var degStep = 360/amount;
    var startAngle = 0;

    this.rotateItems = function(){
        $items.each(function(i){
            var d = i*degStep+startAngle;
            $(this).css({transform:'rotateZ('+d+'deg)'})
            .find('.icon').css({transform:'rotateZ('+(-d)+'deg)'});
        });
    };

    this.rotateLeft = function(){
        startAngle -= degStep;
        this.rotateItems();
    }

    this.rotateRight = function(){
        startAngle += degStep;
        this.rotateItems();
    }

    this.jumpTo = function(a){
        startAngle = a;
        this.rotateItems();
    }
    this.init = function(){
        var that = this;
        this.rotateItems();
        $dial.find('.left').click(function(){
            that.rotateLeft();
        });
        $dial.find('.right').click(function(){
            that.rotateRight();
        });
        $items.each(function(i){
            var d = i*degStep;
            $(this).click(function(){
                that.jumpTo(-d);
            });
        });
        return this;
    }

};

编辑 根据您对活动图标和图标相关内容的请求。当我们旋转轮子时,我们现在确定活动索引如下:

 activeI = -startAngle/degStep%amount;
 if (activeI<0){activeI+=amount;}

直接跟踪活动索引可能同样容易或更容易,但这工作得很好

然后在我们的 rotateItems 循环中检查该项目是否有此索引,如果有,我们将其激活并更新内容

 if (i==activeI){
     $(this).addClass('activeItem');
     $dial.find('.content').text($(this).data('text')).css({backgroundColor:$(this).data('css')});

有很多方法可以从活动项目中获取内容,您可以像我一样使用数据属性,或者添加隐藏的 divs 和您复制的内容,或者您​​ ajax 基于项目索引的查询,或使用 javascript 数组.. 有很多方法可以做到,这真的取决于你想显示什么样的内容。

可以找到一种在包含内容的项目中使用隐藏 divs 的方法 here

所以项目是这样定义的

<div data-css='red' class='item'>
    <div class='icon'>1</div>
    <div class='dial-content'>
        <h1>this is a header 1</h1>
        <p>and here is more content</p>
    </div>
</div>

使用 css

不显示 .dial-content
.dial-content{
    display:none;
}

html 通过使用

从活动项目中复制
 $dial.find('.content')
     .html($(this).find('.dial-content').html())
     .css({backgroundColor:$(this).data('css')});

我喜欢 Pie Menu Generator (PMG). It's based on wheelnav.js,它使您能够通过从可用选项中进行选择来创建 SVG 旋转轮菜单,并在演示中查看结果。

此模块的主要缺点是它依赖于 raphael.js,当您只需要它用于菜单时,这有点矫枉过正。

更改 changeContent(item) 以显示您的内容。

工作演示:

var piemenu = new wheelnav('piemenu');
piemenu.sliceInitPathFunction = piemenu.slicePathFunction;
piemenu.initPercent = 0.1;
piemenu.wheelRadius = piemenu.wheelRadius * 0.83;
piemenu.createWheel();

var contentArea = document.getElementById('piemenuContent');

changeContent(0);

function changeContent(item) {

    var index = typeof item === 'number' ? item : item.wheelItemIndex;

    switch(index) {
        case 0:
            contentArea.innerHTML = '<img src="http://s.hswstatic.com/gif/singapura-cat.jpg" class="pieContent">';
        break;

        case 1:
            contentArea.innerHTML = '<iframe src="https://en.wikipedia.org/wiki/Pie_menu" class="pieContent"></iframe>';
        break;

        case 2:
            contentArea.innerHTML = '<video class="pieContent" autoplay><source src="http://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4"><source src="http://www.w3schools.com/html/mov_bbb.ogg" type="video/ogg">Your browser does not support HTML5 video.</video>';
        break;
    }
}
#piemenuWrapper { position: relative; width: 100vmax; height: 100vmax; }
#piemenuContent { position: absolute; top: 220px; right: 220px; bottom: 220px; left: 220px; overflow: hidden; }
.pieContent { width: 100%; height: 100%; }
#piemenu > svg { width: 100%; height: 100%; }
#piemenu { height: 100%; width: 100%; margin:auto; }
@media (max-width: 400px) { #piemenu { height: 300px; width: 300px; } }

[class|=wheelnav-piemenu-slice-basic] { fill: #497F4C; stroke: none; }
[class|=wheelnav-piemenu-slice-selected] { fill: #497F4C; stroke: none; }
[class|=wheelnav-piemenu-slice-hover] { fill: #497F4C;  stroke: none; fill-opacity: 0.77; cursor: pointer; }

[class|=wheelnav-piemenu-title-basic] { fill: #333; stroke: none; }
[class|=wheelnav-piemenu-title-selected] { fill: #fff; stroke: none; }
[class|=wheelnav-piemenu-title-hover] { fill: #222; stroke: none; cursor: pointer; }
[class|=wheelnav-piemenu-title] > tspan { font-family: Impact, Charcoal, sans-serif; font-size: 24px; }
<script src="http://wheelnavjs.softwaretailoring.net/js/raphael.min.js"></script>
<script src="http://wheelnavjs.softwaretailoring.net/js/raphael.icons.min.js"></script>
<script src="http://wheelnavjs.softwaretailoring.net/js/wheelnav.min.js"></script>
<div id='piemenuWrapper'>
<div id='piemenuContent'>
</div>
<div id='piemenu' data-wheelnav
 data-wheelnav-slicepath='DonutSlice'
 data-wheelnav-navangle='270'
 data-wheelnav-cssmode 
 data-wheelnav-init>
  <div data-wheelnav-navitemtext='0' onmouseup='changeContent(this);'></div>
  <div data-wheelnav-navitemtext='1' onmouseup='changeContent(this);'></div>
  <div data-wheelnav-navitemtext='2' onmouseup='changeContent(this);'></div>
  <div data-wheelnav-navitemtext='3' onmouseup='changeContent(this);'></div>
  <div data-wheelnav-navitemtext='4' onmouseup='changeContent(this);'></div>
  <div data-wheelnav-navitemtext='5' onmouseup='changeContent(this);'></div>
  <div data-wheelnav-navitemtext='6' onmouseup='changeContent(this);'></div>
  <div data-wheelnav-navitemtext='7' onmouseup='changeContent(this);'></div>
</div>
</div>