【问题标题】:How to stick two unrelated elements together?如何将两个不相关的元素粘在一起?
【发布时间】:2014-11-27 04:00:08
【问题描述】:

我正在开发一个界面,我需要将两个不相关的元素粘在一起的东西。嗯,最重要的元素将是“老板”,另一个称为“员工”的元素将跟随“老板”并相应地改变它的位置。

这是标记:

<div class="boss"></div>
<div class="employee"></div>
<div class="boss"></div>
<div class="employee"></div>
<div class="boss"></div>
<div class="employee"></div>
<div class="boss"></div>
<div class="employee"></div>

这是我写的 jQuery:

$('.boss').each(function( i, obj ){

        var Pos = $(this).position();
        var ModuleWidth = $(this).outerWidth();

        $(this).next('.employee').position({
                my: 'right top',
                at: 'right top',
                of: $(this)
        });

});

所以我正在遍历所有 .boss 类并将所有 .employees 与 boss 的右上方对齐。他们应该永远坚持。但是,如果我在 chrome 开发人员工具中从老板那里编辑 html,.boss 元素将变得越来越小并且 .employee 不会相应地重新定位其自身。我想让 .employee 总是重新定位自己。

稍后更新:

http://screencast.com/t/F0RO7ODF 是我正在寻找的那种行为。灰色框是 BOSS,橙色框是 EMPLOYEE。这两个元素有一个包装器,我实际上正在移动包装器。但我想要一个没有包装的解决方案。注意:风琴盒的位置无关紧要。

【问题讨论】:

  • 嗯,你为什么不把它们包起来?当然,它们不会移动,因为位置不是基于元素位置,而是基于文档。您需要调用代码来重新计算位置。
  • 我不太明白你在说什么。但我不想添加另一个元素来包装它们,因为这会严重污染 HTML。我需要一个完整的 jQuery 解决方案。
  • 发布您的 css - 甚至更好 - 一个小提琴,所以我们能够了解您通过布局实现的目标。
  • 这里真正的问题是什么?在开发工具中进行编辑,这不是真正的问题,除非您希望您的用户做同样的事情。
  • 添加另一个元素会污染HTML?真的吗?添加标记来定义结构如何污染它?

标签: javascript jquery html css positioning


【解决方案1】:

我知道这已经得到解答,但这里有一个替代方案,它不使用两个元素之间的任何层次结构(即使这可能不是最佳做法):

HTML:

<div class="boss"></div>
<div class="employee"></div>

<div class="boss"></div>
<div class="employee"></div>

JS:

$.fn.invisible = function() {
    return this.css("visibility", "hidden");
};
$.fn.visible = function() {
    return this.css("visibility", "visible");
};

$(".boss").draggable({
    stop:function(e) {
        var employee_horizontal_position= $(this).offset().left+$(this).width();
        var employee_vertical_position= $(this).offset().top-$(this).height();   

        $(this).next().visible();
        $(this).next().offset({top: employee_vertical_position, left: employee_horizontal_position});
    }
});

$(".boss").on("drag", function(e){
    $(this).next().invisible();
});

CSS:

.boss{
    height: 100px;
    width: 300px;
    background-color: grey;
    float:left;
    margin-top:100px;
}

.boss:hover{
    cursor:pointer;
}

.employee{
    height: 300px;
    width: 100px;
    background-color: orange;
    float:left;
}

JSFIDDLE 示例: http://jsfiddle.net/ktxo4f6s/2/

我试图在老板被拖动时隐藏员工,如您的截屏视频所示。

【讨论】:

  • 很好的例子,但与多个老板/员工元素不同。
  • 如果我有评分,我可能会 +100 你的回答谢谢伙计,非常感谢,救生员就在这里。我会尝试改进您的解决方案,以便为多个老板工作:) 谢谢。
  • 太棒了,很高兴能帮上忙。通过使用 next() 函数更新了使用多个元素的答案,但我不知道这是否是最好的方法。如果您的员工不总是 DOM 上的老板之后的下一个元素,它就会崩溃。
  • @carlosHT next() 如果老板有多个员工,则将不起作用,因为它只抓住紧随其后的单个元素,而没有其他元素。还建议使用.css('visibility', 'hidden') 而不是hide(); 来防止弹跳。要解决多个员工的问题,请使用nextAll('.employee'),但需要重新计算位置和 css 以考虑左浮动。这就是分层方法更容易开发的地方。
  • .employee 可以是具有多个 lis 的 ul,例如,这不是问题
【解决方案2】:

n 通常,当希望元素相互关联时,它们应该在一个元素中组合在一起。 要表示层次结构,最好还开发您的 html 以尊重您希望表示的层次结构。 这将强制执行您在移动 Boss 元素时在视频中显示的行为。

对于这个特定的示例,它还可以扩展为部门或角色。 参见 JSFiddle 例如:http://jsfiddle.net/9dw5dvqw/

更新:http://jsfiddle.net/en85bm9h/

HTML

<ul class="bosses">
    <li class="boss">
        <span class="boss-name"></span>
        <ul class="employees">
           <li class="employee">
               <span class="employee-name"></span>
           </li>
           <li class="employee">
               <span class="employee-name"></span>
           </li>
        </ul>
    </li>
    <li class="boss">
        <span class="boss-name"></span>
        <ul class="employees">
           <li class="employee">
               <span class="employee-name"></span>
           </li>
           <li class="employee">
               <span class="employee-name"></span>
           </li>
        </ul>
    </li>
</ul>

CSS

*{ margin: 0; padding: 0; }
body,
html{ height: 100%; }
ul{ list-style: none; overflow: hidden; float: left; }
li{ overflow: hidden; }

.bosses{ width: 100%; height: 100%; }
.boss{ margin: 20px 5px 20px 0; float: left; }
.boss-name{ display: block; background-color: #eee; float: left; width: 120px; height: 80px; cursor: move; }
.employees{ float: left; width: 50px; height: 120px; background-color: red; }

【讨论】:

  • 我想我会使用层次结构的方法。我的一个朋友刚刚向我展示了一些应用程序,这些应用程序可以完成我需要它们在没有层次结构的情况下执行的操作 :) 查看 moqups.com 以了解我的意思。工作区中的元素与其控制面板之间没有层次结构。
  • 虽然这可能不是最佳实践。这就是我一般使用这个词的原因。为什么让它比它必须的更难阅读和开发(KISS)?除非您需要会破坏层次结构的功能,否则我建议使用这种方法。让我知道,我可以为您提供不同的方法。或查看@carlosHT 的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2011-09-18
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多