【问题标题】:jquery: Create hidden element + slideTogglejquery:创建隐藏元素+ slideToggle
【发布时间】:2012-04-24 13:06:52
【问题描述】:

我有一个包含许多 p 的 div。情况如下:

<div id="container">
    <p>blabla</p>
    <p>blabla</p>
    <p id="my_id">blabla</p>
    <p>blabla</p>
    <p>blabla</p>
    <p>etc...</p>
</div>

如您所见,很多废话。我想将&lt;a href&gt;read more&lt;/a&gt; 附加到&lt;p#my_id&gt;。 阅读更多链接之后的所有&lt;p&gt; 都应该被隐藏。单击链接后,它必须淡出,所有&lt;p&gt; 应作为一个对象滑入。

所以我猜下面的&lt;p&gt; 必须被包裹在一个隐藏的 div 中,稍后会滑入。

我希望我的想法很清楚。

提前致谢。

【问题讨论】:

  • 你喜欢在它后面加上&lt;a href&gt;hide more&lt;/a&gt; 链接吗?
  • 鉴于您当前的结构,您不能将所有&lt;p&gt; 的幻灯片作为一个幻灯片。将所有这些“额外的”&lt;p&gt; 添加到父元素中
  • @HardikPatel;不需要这样的链接。谢谢。 @塔伦;这就是为什么我想在滑动之前使用 jQuery 包装它们......

标签: jquery slidetoggle wrapall


【解决方案1】:

哇,终于,感谢你们,我破解了它! 通过添加:

position: relative

到父容器,跳转已经完全消失了!

var the_more = $( '<div id="the_more">' ).hide();
$('DIV#container').css("position", "relative");
$('DIV#container p').css("margin", "0px").css("padding", "10px 0px");
$('DIV#container p#inbetween ~ p').wrapAll( the_more );
$('<a href="#yje_more">read more</a>').appendTo('DIV#container p#inbetween').click( function(e){ e.preventDefault(); $(this).fadeOut(1000, function() { $(this).remove()} ); $('#the_more').slideToggle(1000); } );

感谢大家的帮助和耐心!

【讨论】:

    【解决方案2】:

    解决方案 1:

    function do_slidedown(element){
      $(element).slideDown("slow", function(e){
        if($(element).next().length > 0){
          do_slidedown($(element).next());
        }
      });
    }
    
    $(document).ready(function() {
        $('#my_id ~ p').hide();
        $('#my_id').append("<a id='read_more' href='#'>read more</a>")
        $('#my_id').find("a#read_more").live("click", function(){
           $(this).hide();  // for remove link
           do_slidedown($('#my_id ~ p').first())
        });
    });
    

    如果您想一一打开每个&lt;p&gt;,请使用以下代码...

    解决方案 2:

    $(document).ready(function() {
        $('#my_id ~ p').hide();
        $('#my_id').append("<a class='read_more' href='#'>read more</a>")
        $("a.read_more").live("click", function(){
           $(this).hide()
           $next_para = $(this).closest("p").next();
           if($next_para.next().length > 0) { $next_para.append("<a class='read_more' href='#'>read more</a>") }
           $next_para.slideDown();
        });
    });
    

    重建您的解决方案: 我认为跳跃是因为&lt;p&gt; 的自动边距,请查看以下内容。

    var the_more = $( '<div id="the_more">' ).hide();
            $('DIV#container p').css("margin", "0px").css("padding", "10px 0px");
            $('DIV#container p#inbetween ~ p').wrapAll( the_more );
            $('<a href="#yje_more">read more</a>').appendTo('DIV#container p#inbetween').click( function(e){ e.preventDefault(); $(this).fadeOut(1000, function() { $(this).remove()} ); $('#the_more').slideToggle(1000); } );
    

    【讨论】:

    • 哇,'~p' 部分对我来说是新的,但看起来很棒!然而,这些段落仍然独立地为每个段落设置动画......
    • 其他&lt;p&gt;要一一打开吗?嗯?
    • 这是我需要的动画类型的代表:jsfiddle.net/MYezw/1 谢谢。
    • @knalpiap - 刚刚在我上面的回答中编辑了 解决方案 1,希望你会喜欢它!
    • 不是我想象的代码方向,但工作起来就像一个魅力:jsfiddle.net/D9hFy(基于解决方案 1)在技术上,这在上一个之后的每个段落实际上仍然没有消失吗?
    【解决方案3】:

    这是你想要的吗?

    jQuery

    $(document).ready(function() {
        $('#my_id>div').hide();
        $('<a href="#" id="read-more-link">Read More</a>').appendTo('#my_id');
        $('#read-more-link').click(function(e) {
            e.preventDefault();
            $(this).fadeOut();
            $('#my_id>div').slideToggle();
        });
    });
    

    HTML

    <div id="container">
      <div id="my_id">
        <p>blabla</p>
        <div>
          <p>This is some hidden content</p>
          <p>This is some more hidden content</p>
        </div>
      </p>
    </div>
    

    jsFiddle Demo

    【讨论】:

    • 谢谢。对于最终结果动画,是的,但是被 slideToggled 的 div 必须使用 jQuery 附加/包装......可见结果应该是这样的:jsfiddle.net/MYezw/1 但是应该使用 jQuery 创建 div。
    【解决方案4】:

    试试这个:

    var $afterP = $("#my_id").nextAll("p").hide();
    var $readMore = $("<a></a>").attr("href", "#").addClass("read-more").text("Read more").appendTo("#my_id");
    
    $("#container").on('click', '.read-more', function() {
        $afterP.slideToggle();
    });
    

    这将隐藏#my_id 之后的所有p 元素,并且文件#my_id 中的about 出现在什么位置无关紧要。

    Example fiddle

    【讨论】:

      【解决方案5】:

      你可以给你想要隐藏的元素一个类,并使用 CSS 默认隐藏它们,然后在点击链接后显示它们。

      jsFiddle Demo

      CSS

      .read-more-content {
        display: none;
      }
      

      jQuery

      $(document).ready(function() {
          $('#read-more-link').click(function(e) {
              e.preventDefault();
              $(this).fadeOut();
              $('.read-more-content').slideToggle();
          });
      });
      

      HTML

      <div id="container">
        <p id="my_id">
          blabla <a href="#" id="read-more-link">Read More</a>
        </p>
        <p class="read-more-content">This is some hidden content</p>
        <p class="read-more-content">This is some more hidden content</p>
      </div>
      

      如果您只想依靠 jQuery 来附加锚点并隐藏“阅读更多内容”,您可以执行以下操作:-

      jsFiddle Demo 2

      jQuery

      $(document).ready(function() {
          $('.read-more-content').hide();
          $('<a href="#" id="read-more-link">Read More</a>').appendTo('#my_id');
          $('#read-more-link').click(function(e) {
              e.preventDefault();
              $(this).fadeOut();
              $('.read-more-content').slideToggle();
          });
      });
      

      HTML

      <div id="container">
        <p id="my_id">
          blabla
        </p>
        <p class="read-more-content">This is some hidden content</p>
        <p class="read-more-content">This is some more hidden content</p>
      </div>
      

      希望对你有帮助

      【讨论】:

      • 谢谢,但我希望在单个动画中插入隐藏的段落,就好像它是一个对象一样。您的解决方案分别为每个段落提供了一个幻灯片切换。除此之外,在这种情况下,我无法在链接后面的段落中添加类...再次感谢。
      • 在这种情况下,您可以将所有要显示的段落包装在 &lt;div&gt; 中,然后将 .slideToggle() 包装在 &lt;div&gt;
      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2011-01-25
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      相关资源
      最近更新 更多