【问题标题】:Changing html tag structure on window resizing在调整窗口大小时更改 html 标记结构
【发布时间】:2015-07-09 08:35:45
【问题描述】:

我想在调整浏览器窗口大小时将 html 标记结构重建为新结构。有谁知道我如何从第一个结构到第二个结构。我需要这个用于响应式个人项目。也许有一个 JavaScript 调整大小事件,我不知道......

<div class="wrapper">
    <div class="slide">
        <div class="item"></div>
        <div class="item"></div>
    </div>
    <div class="slide">
        <div class="item"></div>
        <div class="item"></div>
    </div>
</div>

<div class="wrapper">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
</div>

【问题讨论】:

  • CSS 媒体查询 - 为您服务。
  • 媒体查询可以改变 DOM 结构?
  • 如果你一开始就有一个合适的 DOM 结构,那么使用媒体查询来做大部分事情就足够了。如果你真的需要改变 dom,总是有 javascript,但在大多数情况下它确实不是最好的工具。
  • 在这种情况下,它不适用于媒体查询。
  • 否,但它可以转换内容,使其显示完全不同。请参阅stackoverflow.com/a/21192082/1662973 的一些示例。它在画廊甚至您试图显示较少内容的地方非常受欢迎,即完整的细节与仅摘要。我相信您的内容的拆分应该适合这一点。另见ie.microsoft.com/testdrive/HTML5/CSS3MediaQueries/Default.html

标签: javascript jquery html css dom


【解决方案1】:

您可以在窗口上监听resize 事件,然后在窗口低于特定大小时重新构建您的 HTML。将元素从第一个结构移动到第二个结构并不是什么大问题,但挑战在于再次恢复它。你怎么知道哪个.item属于哪个.slide

一种方法是在创建列表时在单独的data- 属性中跟踪每个.item 的父级:

function makeList() {
    var $slides = $('.slide'),
        $items = $();

    // For each slide set a data-attribute on all its child .item's 
    $slides.each(function(i) {
        var $item = $(this).children('.item');

        $item.attr('data-slide', i+1);
        $items = $items.add($item);
    });

    // Append all items directly to the wrapper
    $('.wrapper').html($items).attr('data-structure', 'list');
}

我为.wrapper 设置了一个数据属性,所以我们知道它已经转换为一个列表。否则在每次调整大小时都会触发它,您只需要一次(直到它调整回您想要幻灯片的位置)。

当您再次需要幻灯片时,请遍历所有 .items 并保留幻灯片编号列表。对于您遇到的每个新的data-slide 号码,制作一张新幻灯片并将其添加到总列表中;

function makeSlides() {
    var $slides = $(),
        slideNumbers = [],
        $currentSlide = $();

    $('.item[data-slide]').each(function() {
        var $item = $(this),
            slideNumber = $item.attr('data-slide');

        // if the slide number wasn't in the array yet push the current slide into $slides and create a new one
        if(slideNumbers.indexOf(slideNumber) < 0) {
            $slides = $slides.add($currentSlide);
            $currentSlide = $('<div class="slide" />');

            slideNumbers.push(slideNumber);
        }
        $currentSlide.append($item);
    });

    // add the last currentSlide
    $slides = $slides.add($currentSlide);

    // place all slides in the wrapper
    $('.wrapper').html($slides).attr('data-structure', 'slides');
}

最后你绑定 resize 事件并在需要时触发这些函数:

$(window).resize(function(e) {
    var currentStructure = $('.wrapper').attr('data-structure');

    if(window.innerWidth < 600) {
        if( currentStructure !== 'list') {
            makeList();
        }
    } else {
        if( currentStructure !== 'slides') {
            makeSlides();
        }
    }
});

jsFiddle 演示:http://jsfiddle.net/gktLnw31/3/

我确实认为这可能会更有效率,但这只是一个概念证明。希望它能给你一些见解。

【讨论】:

    【解决方案2】:

    我最好看一下foundation,因为它已经默认包含响应式设计,而不是尝试通过代码动态更改它

    【讨论】:

    • 这是一个特殊的问题。我想解决在调整大小时重写 DOM 的问题。我需要这个用于 jquery 滑块..
    • 那么也许你可以使用 jquery.resize() 看看api.jquery.com/resize
    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多