【问题标题】:How swap elements in grid on click without reloading DOM如何在不重新加载 DOM 的情况下单击时交换网格中的元素
【发布时间】:2019-09-16 06:18:34
【问题描述】:

https://codepen.io/anon/pen/QPYppp?&editable=true

jQuery.fn.swap = function(b) {
  b = jQuery(b)[0];
  var a = this[0],
    a2 = a.cloneNode(true),
    b2 = b.cloneNode(true),
    stack = this;

  a.parentNode.replaceChild(b2, a);
  b.parentNode.replaceChild(a2, b);

  stack[0] = a2;
  return this.pushStack(stack);
};

function changeVideos() {
  $('.wrap-grid > div:nth-child(n + 2)').click(function() {
    $('.wrap-grid > div:nth-child(1)').swap($(this));
    $(this).off();
    changeVideos();
  })
};
changeVideos();
*,
::after,
::before {
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}

.main-content .container>.row> :first-child {
  padding-left: 0;
}

.main-content .container>.row> :last-child {
  padding-right: 0;
}

.wrap-grid {
  width: 100%;
  display: grid;
  grid-gap: 10px;
  grid-auto-columns: 1fr 1fr;
  grid-template-areas: "a b" "a c" "a d";
  margin-bottom: 20px;
}

.wrap-grid>div {
  position: relative;
}

.wrap-grid iframe {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
}

.wrap-grid>* {
  width: 100%;
  background: #fff;
}

.wrap-grid> :nth-child(n + 2) iframe {
  pointer-events: none;
}

.wrap-grid> :nth-child(1) {
  grid-area: a;
  padding-top: 56.25%;
}

@media (max-width: 991.98px) {
  .wrap-grid {
    grid-template-areas: "a" "b" "c" "d";
  }
  .wrap-grid>* {
    height: 255px;
  }
  .wrap-grid> :nth-child(1) {
    height: 255px;
  }
  .main-content .container>.row> :first-child,
  .main-content .container>.row> :last-child {
    padding-left: 0;
    padding-right: 0;
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrap-grid">
  <div><iframe width="560" height="315" src="https://www.youtube.com/embed/Bey4XXJAqS8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
  <div><iframe width="560" height="315" src="https://www.youtube.com/embed/Bey4XXJAqS8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
  <div><iframe width="560" height="315" src="https://www.youtube.com/embed/Bey4XXJAqS8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>
  <div><iframe width="560" height="315" src="https://www.youtube.com/embed/Bey4XXJAqS8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div>

</div>

我试图将右侧的三个元素之一与左侧的元素交换。与示例相同,我尝试与 jquery 交换,但这是重新加载 dom 元素并且它们正在闪烁。有没有办法通过在flexbox 中操作order 之类的属性来做到这一点,或者使用grid 布局。

【问题讨论】:

  • 第一注;不要包含指向代码笔的链接。还要在您的问题中包含逻辑。不要让那些想要帮助的人更难帮助你。第二注;如果您只是想移动元素,请不要克隆它们。只需移动它们。

标签: javascript jquery css flexbox css-grid


【解决方案1】:

您可以使用纯 JavaScript 访问和设置他们的 flexbox order

document.getElementById('your-id').style.order = 2
document.getElementById('your-id').style.order // returns "2"

或 jQuery:

$('#your-id').css('style', 2)
$('#your-id').css('style') // returns "2"

【讨论】:

  • 改变他们的样式顺序真的会改变他们在 DOM 中的位置吗?
  • 我问这个是因为逻辑使用nth-child 选择器,否则可能会受到影响。
  • 这不起作用,可能是因为布局是网格并且左元素现在具有属性grid-area: a
  • Flexbox order 不会改变它们在 DOM 中的位置,只会改变它们的显示方式。
【解决方案2】:

一件事是您正在为视频制作 iframe 并将视频加载到 iframe 中,当您移动它时必须重新加载。

我建议修改代码以便加载基本图像,因为与完整的 youtube 视频相比,它们不需要时间来重新加载。

youtube 视频的封面图片是

 <img class="youtube-thumb" src="//i.ytimg.com/vi/' + id + '/hqdefault.jpg">

对于您的视频,它将是:

   <img class="youtube-thumb" src="//i.ytimg.com/vi/Bey4XXJAqS8/hqdefault.jpg">

【讨论】:

  • 感谢您的回答,但我需要准确移动视频
  • 您将通过视频获得这一点。现在,如果您使用封面图像,它会保留在用户缓存中,并且不必发出请求。有几种方法可以交换图像以播放 vid btw...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
相关资源
最近更新 更多