在现有的同级 html 元素下移动和定位元素

Posted

技术标签:

【中文标题】在现有的同级 html 元素下移动和定位元素【英文标题】:move & position an element under an existing sibling html element 【发布时间】:2018-04-11 16:23:06 【问题描述】:

我正在尝试将<li> 定位到与页面上最后一个<li> 完全相同的位置。我正在使用 jQuery .position() 函数。

当您在1000ms 超时后在我的<li> 上向左滑动/拖动时,我想将<li> 移动到我最后一个<li> 项目"stackPos" 的位置

我设置了最后一个元素:

$('ul.feed li').last().addClass('stack');

获取它的位置:

var stackPos = $('ul.feed li.stack').position();

设置超时后的位置:

setTimeout(function()
   $(this).css(top: stackPos.top, left: stackPos.left);
, 1000);

超时后我可以设置一个console.log(),它会触发但位置不会更新。

完整的代码和演示 - https://jsfiddle.net/myz3czro/32/

$( document ).ready(function() 

$('ul.feed li').first().addClass('top');
$('ul.feed li').last().addClass('stack');    
var touch = $('ul.feed li.top').offset().left;
    var pullLeftLimit = touch - 15;
var stackPos = $('ul.feed li.stack').position();
console.log('Stack Of Cards at: ' + stackPos.left + ' top: ' + stackPos.top);

$($('.content ul li').get().reverse()).each(function(i, el) 
  $(el).css('z-index', i + 1);
  var degrees = Math.floor((Math.random() * 20) - 10);
  $(el).css(
    '-webkit-transform' : 'rotate('+degrees+'deg)',
    '-moz-transform' : 'rotate('+degrees+'deg)',  
    '-ms-transform' : 'rotate('+degrees+'deg)',  
    '-o-transform' : 'rotate('+degrees+'deg)',  
    'transform' : 'rotate('+degrees+'deg)',  
    'zoom' : 1
    );
);

$( function() 
  $( ".draggable" ).draggable(
    axis: "x",
    drag: function( event, ui )   
      var newTouch = $('ul.feed li.top').offset().left;

      if(pullLeftLimit > newTouch)
        $(this).addClass('swipe');
        setTimeout(function()
          $(this).css(top: stackPos.top, left: stackPos.left);
        , 1000);
      
    
  );
);

$(function()
  $( ".cover" ).on( "swipe", swipeHandler );   
  function swipeHandler( event )
    $( this ).parent().addClass( "swipe" );
  
);    

function stackMe()
    console.log('test');


  );

【问题讨论】:

【参考方案1】:

我认为setTimeout 函数存在一个小错误,但除此之外,为了获得更好的性能,我会选择draggable.stop 处理程序来处理卡片重新定位。

最后,核心重定位函数如下所示:

$(function() 
  $(".draggable").draggable(
    axis: "x",
    stop: function(event, ui) 
      var self = this;
      setTimeout(function() 
        var stack = [];
        $(".content ul li").each(function(i, el) 
          stack.push($(el).css("z-index"));
        );
        stack.unshift(stack.pop());
        $(".content ul li").each(function(i, el) 
          $(el).css('z-index', stack[i]);
        );
        $(self).removeClass('swipe').css(
          top: stackPos.top,
          left: stackPos.left
        );
      , 1000);
    ,
    drag: function(event, ui) 
      var newTouch = $('ul.feed li.top').offset().left;
      if (pullLeftLimit > newTouch) 
        $(this).addClass('swipe');
      
    
  );
);

通过使用您的卡片命名约定,z-index 将旋转如下:

Card a: z-index 5 --> will be 1
Card b: z-index 4 --> will be 5
Card c: z-index 3 --> will be 4
Card d: z-index 2 --> will be 3
Card e: z-index 1 --> will be 2

...等等。

【讨论】:

以上是关于在现有的同级 html 元素下移动和定位元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jquery 或 css 中定位下一个或同级元素?

总结 css html

selenium如何定位下一个同级节点

网页设计中的定位都有哪些?

JavaScript demo—移动文字

相对定位