Javascript 滑动面板,如何复制它们?

Javascript 滑动面板,如何复制它们?,javascript,jquery,html,panel,spotify,Javascript,Jquery,Html,Panel,Spotify,我可能在这里深陷其中,我对JavaScript和jQuery还不熟悉, 但我想尝试创建一个类似spotify的面板系统 请看这张图片: 在Spotify player网站上,当您单击艺术家或歌曲/专辑等内容时, 如果您单击其他内容,它将在屏幕右侧的最顶部面板中滑动, 一个新的面板将出现在它的位置,前面的面板将被添加到我称之为屏幕左侧的面板堆栈中 以下是Spotify: 我想了解如何在JavaScript/jquery中实现这一点,是否有人可以分享一些输入 我试过的:() 我知道我的尝试很糟糕

我可能在这里深陷其中,我对JavaScript和jQuery还不熟悉, 但我想尝试创建一个类似spotify的面板系统

请看这张图片:

在Spotify player网站上,当您单击艺术家或歌曲/专辑等内容时, 如果您单击其他内容,它将在屏幕右侧的最顶部面板中滑动, 一个新的面板将出现在它的位置,前面的面板将被添加到我称之为屏幕左侧的面板堆栈中

以下是Spotify:

我想了解如何在JavaScript/jquery中实现这一点,是否有人可以分享一些输入

我试过的:()

我知道我的尝试很糟糕,这就是我来这里的原因

var idx = 0;
var panels = [];
var numpanels = 0;

function panel () {
    this.id = 0;
    this.active = false;
    this.container = {};
}

var panelmgr = new function () {
    this.Create = function (lpPanel) {

        //set all current panels to inactive 
        //and then push them left
        for (var i = 0; i < panels.length; i++) {
            panels[i].active = false;
            panels[i].container.css("left", "10%");
        }

        //set the newest panel to Active and Top Most
        lpPanel.container.css("z-index", 10000);
        lpPanel.container.css("left", "25%");

        //setup some info for the new panel
        lpPanel.id = numpanels++;
        lpPanel.active = true;

        //add it to array
        panels.push(lpPanel);
    };
}

$(".box").click(function (e) {            
    var id = $(this).attr("id");
    var selected = -1;

    //find the panel we've selected and retrieve the index
    for (var i = 0; i < panels.length; i++) {
        if (id == panels[i].container.attr("id")) {
            selected = I;
            break;
        }                    
    }

    //do we have a valid selected panel?
    if (selected >= 0) {

        //Make all panels not selected
        for (var i = 0; i < panels.length; i++) {
            panels[i].active = false;
            panels[i].container.css("left", "10%");
        }

        //now make the panel we selected 
        //the top most panel
        panels[selected].active = true;
        panels[selected].container.css("z-index", 10000);
        panels[selected].container.css("left", "25%");
    }



});

$(document).ready(function () {

    var p1 = new panel();
    var p2 = new panel();
    var p3 = new panel();
    var p4 = new panel();
    var p5 = new panel();

    p1.container = $("#panel1");
    p2.container = $("#panel2");
    p3.container = $("#panel3");
    p4.container = $("#panel4");
    p5.container = $("#panel5");

    panelmgr.Create(p1);
    panelmgr.Create(p2);
    panelmgr.Create(p3);
    panelmgr.Create(p4);
    panelmgr.Create(p5);
});
var idx=0;
var面板=[];
var numpanels=0;
功能面板(){
此参数为0.id;
this.active=false;
this.container={};
}
var panelmgr=新函数(){
this.Create=函数(lpPanel){
//将所有当前面板设置为非活动
//然后向左推
对于(变量i=0;i=0){
//使所有面板未选中
对于(变量i=0;i
检查此
小提琴

做css的事情。我不是这方面的高手

您的CSS::

.sidebar{
    width:10%;
    background-color:#000;
    color:#FFF;
    height:800px;
    float:left;

}
.box{
    width:7%;
    float:left;
    height:800px;
    background-color:red;
    border:1px solid #000;
}
.active{
    width:64%;
    float:right !important;
     -webkit-transition: all 1s ease-in-out;
-moz-transition: all 1s ease-in-out;
-o-transition: all 1s ease-in-out;
transition: all 1s ease-in-out;
}
你的Html代码
边栏


检查此
小提琴

做css的事情。我不是这方面的高手

您的CSS::

.sidebar{
    width:10%;
    background-color:#000;
    color:#FFF;
    height:800px;
    float:left;

}
.box{
    width:7%;
    float:left;
    height:800px;
    background-color:red;
    border:1px solid #000;
}
.active{
    width:64%;
    float:right !important;
     -webkit-transition: all 1s ease-in-out;
-moz-transition: all 1s ease-in-out;
-o-transition: all 1s ease-in-out;
transition: all 1s ease-in-out;
}
你的Html代码
边栏


您可能不应该更改CSS。基本上,您需要两个div,一个包含“面板”列表,另一个包含单个“面板”的详细视图。我将此问题分解为若干子问题:

1) 从服务器获取面板对象列表,并动态填充左div,很可能是包含面板信息的子div。换句话说,在页面加载时,需要运行一些代码,在列表中循环并在左侧div中添加div,每个面板一个div,这些片段的CSS应该处理它们的布局和所有内容。一个简单的开始可能是为列表中的每个项目添加一个按钮,或者添加一个图像,等等

2) 事件处理程序,以便当您单击列表中的面板时,它会将详细视图加载到右侧的div中。这也可能会从列表中删除该面板,或以某种方式对其进行视觉更改(将其灰显)或其他任何操作

3) 如果项目已加载到右div中,则在右div中显示详细信息,如果未加载,则执行其他默认操作


简化所有这些的一种方法可能是将面板和详细视图作为预构建页面,并将它们加载到iFrame之类的主页中。

您可能不应该更改CSS。基本上,您需要两个div,一个包含“面板”列表,另一个包含单个“面板”的详细视图。我将此问题分解为若干子问题:

1) 从服务器获取面板对象列表,并动态填充左div,很可能是包含面板信息的子div。换句话说,在页面加载时,需要运行一些代码,在列表中循环并在左侧div中添加div,每个面板一个div,这些片段的CSS应该处理它们的布局和所有内容。一个简单的开始可能是为列表中的每个项目添加一个按钮,或者添加一个图像,等等

2) 事件处理程序,以便当您单击列表中的面板时,它会将详细视图加载到右侧的div中。这也可能会从列表中删除该面板,或以某种方式对其进行视觉更改(将其灰显)或其他任何操作

3) 如果项目已加载到右div中,则在右div中显示详细信息,如果未加载,则执行其他默认操作


简化所有这些的一种方法可能是将面板和详细视图作为预构建页面,并将它们加载到iFrame之类的主页中。

简而言之,您的原始代码存在一些问题。下面是我试图使当前代码集正常工作的尝试(底部有改进建议。请参阅,了解如何在不更改大部分原始代码的情况下正常工作的代码。我还修改了原始代码以使用css tra
$(function(){
    $(".box").click(function(){
        $(".box").removeClass("active");
        $(this).addClass("active");
    }); 
});
//Increment height
var ii = 0;
for (var i = 0; i < panels.length; i++) {
    if(panels[i].active == false){
        panels[i].container.css("top", ii*30+"px");
        ii++;
    }
}
panels[i].container.css("z-index", "1");
<div id="panel5" class="box">
    <div class="panelTitle">Panel 4</div>
    <div class="contents">Stuff to display</div>
</div>
//Make all panels not selected
for (var i = 0; i < panels.length; i++) {
    //other code emitted for space...
    //hide the contents
    panels[i].container.find(".contents").css("display","none");
}

//now make the panel we selected 
//the top most panel
panels[selected].active = true;
panels[selected].container.css("z-index", 2);
panels[selected].container.css("left", "25%");
panels[selected].container.css("top","0px");
//it's active, so display the contents
panels[selected].container.find(".contents").css("display","block");
transition: all 1s;
-webkit-transition: all 1s;
-moz-transition: all 1s;
-o-transition: all 1s;
function Panel (jobj) {
    if(typeof jobj === "undefined") throw new ReferenceError("Bad value passed to constructor");
    if(typeof jobj.id === "undefined") throw new ReferenceError("Missing an id");
    this.id = 0;
    this.active = false;
    if(typeof jobj.title === "undefined") throw new ReferenceError("Missing panel title");
    this.title = jobj.title;
    //set to passed value, or if doesn't exist, default to empty array;
    this.tracks = jobj.tracks || [];
}
var DiscoverPanel = function(jsonObj){
    if(typeof jsonObj === "undefined")throw new ReferenceError("Expecting a JSON object but received none");
    var panel = new Panel(jsonObj);
    if(typeof jsonObj.genre === "undefined") throw new ReferenceError("Missing genre!")
    panel.genre = jsonObj.genre;
    return panel;
}
<ul id="stack"></ul>
<div id="current"></div>
//there are plenty of ways to generate the id within the constructor if hard coding
//it bugs you, your post showed a means of doing so.
var p1 = new Panel({title:"Panel 1",id:"p1"});
var p2 = new Panel({title:"Panel 2",id:"p2"});
var dp = new DiscoverPanel({title:"discover",id:"dp",genre:"rock"});
//etc.
var pn = new Panel({title:"Panel n"});
var panels = [p1,p2,dp,...,pn];
$(document).ready(function () {
    generateList();
}
function generateList(){
    var stack = document.getElementById("stack");
    stack.innerHTML = "";
    panels.forEach(function(panel){
        var item = document.createElement("li");
        item.setAttribute("id",panel.id)
        item.innerHTML = panel.title;
        item.onclick = function(){
            //load this specific panel to the current
            loadCurrent(panel);
            //regenerate the stack
            generateList();
        }
        stack.appendChild(item);
    });
}
function loadCurrent(panel){
    panel.active = true;
    var cur = document.getElementById("current");
    //Figured table was a good example, but you could get as creative as you want
    //using floats, divs, etc. Could also check the types and handle different types of panels
    var table = document.createElement("table");
    panel.tracks.forEach(function(track){
        var row = document.createElement("tr");
        var td = document.createElement("td");
        td.innerHTML = track.number;
        row.appendChild(td);
        //repeat for whatever other values you have for a track
        //you'd likely add a play function or something of that sort to each.
        table.appendChild(row);
    });
    table.appendChild(cur);
}
display: none