【问题标题】:Jquery - How to alternate an :Odd :Even pattern every 4 <Divs>?Jquery - 如何每 4 个 <Divs> 交替一个 :Odd :Even 模式?
【发布时间】:2011-04-03 05:28:04
【问题描述】:

我正在尝试在布局中制作图案(请参阅附件进行可视化) 问题是使用 :odd :even 不起作用。

我试图通过使用“for 循环”和 if 语句来使其工作,但显然 jquery 不会以这种方式做这些事情。或者也许我应该在文档准备声明之外做它?我厌倦了它,但它不起作用。

如何做到这一点?

编辑:重要提示... 这些方块在一页上最多 8 个,并在 Wordpress 中生成,每个方块都是一个帖子。所以不幸的是,我无法按照建议将事物分成几行。

css:

.thumb_container {
width:274px;
height: 274px;
float: left;
position: relative;
background-color: white;
}

 .thumb_container:nth-child(4n+1) { clear:both; background-color: green } /* green just to see if its working */

jQuery tweek 文件 (http://baked-beans.tv/bb/wp-content/themes/bakedbeans/js/jquery.site.tweeks.js)

    $(".thumb_container:nth-child(8n+2), .thumb_container:nth-child(8n+4), .thumb_container:nth-child(8n+5), .thumb_container:nth-child(8n+7)")
.css({"background-color":"#333333"});

HTML点击HTML链接

【问题讨论】:

  • 显示您的 .thumb_container 元素 (HTML)。此外,您的代码实际上每次都会更改所有元素的样式。

标签: jquery css layout grid for-loop


【解决方案1】:
var i = 1;
$('#wrapper > div').each(function()
{
    var isEvenRow = Math.ceil(i / 4) % 2 == 0; // 4 is number of columns
    var isCellAlternate = i % 2 == isEvenRow ? 0 : 1;

    if ( isCellAlternate ) {
        $(this).css("background-color", "#000");
    } else {
        $(this).css("background-color", "#ccc");
    }
    i++;
});​

或可读性较差但较短的版本:

var i = 1;
$('#wrapper > div').each(function() {
    if (i % 2 == (Math.ceil(i / 4) % 2 == 0) ? 0 : 1) $(this).css("background-color", "#000");
    else $(this).css("background-color", "#ccc");
    i++;
});​

基本上你每行更改备用单元格的测试。

【讨论】:

  • 谢谢谢谢谢谢!无论是否缺少嵌套在划船 div 中的 div,这都有效。 :-)
【解决方案2】:

你可以这样做

$("#wrapper > :nth-child(8n+1), #wrapper > :nth-child(8n+3), #wrapper > :nth-child(8n+6), #wrapper > :nth-child(8n+8)").addClass('dark');

使用此 HTML:

<div id="wrapper">
    <div></div>
    ... 16 divs
<div>

还有这个 CSS:

#wrapper {
    width: 160px;
    border: 1px solid #999;
    overflow: hidden;
}

#wrapper div {
    width: 40px;
    height: 40px;
    float: left;
    background-color: #fff;
}

#wrapper .dark {
    background-color: #f5f5f5;
}

在此处使用包装器有助于您无需为每个 div 添加一个类,而且您绝对不需要两个不同的类或颜色 - 只需定义一个“默认”颜色,然后用添加的颜色覆盖它班级。哦,:odd、:even 和 nth-child 选择器适用于它们附加到的元素 - 在您的情况下,.thumb_container 元素。 .thumb_container &gt; :even 可以工作,以供将来参考。

在此处查看实际代码:http://jsfiddle.net/HjMrx/

【讨论】:

  • 您的示例似乎不适用于 Google Chrome。乍一看不知道为什么。
  • @Andy - 嗯?可以的,我刚测试过。哪一部分不工作?
  • 同样不在 Safari 中,真的很奇怪。我在 Mac 上。
【解决方案3】:

不确定您的标记是如何进行的,但您可以使用:nth-child(n) 选择器来实现棋盘格效果。我已经为您设置了一个示例here。我不确定它的效率如何,尽管它对于 4x4 网格来说似乎足够快。

$("div:nth-child(8n+2),div:nth-child(8n+4),div:nth-child(8n+5),div:nth-child(8n+7)")
    .css({"background-color":"white"});​

这会在每 8 个 div (8n) 的第 2、第 4、第 5 和第 7 个重复模式。如果您有不同大小的网格,则必须调整这些选择器(并添加到它们)。

如果您使用的是表格,那就更简单了 - example:

$("tr:odd > td:even, tr:even > td:odd").css({"background-color":"white"});​

如果您愿意使用包装 div,您可以使用 rows 技术,将每 4 个 div 包装在一个外部 div 中并使用:

<div class="row"><div>1</div><div>2</div><div>3</div><div>4</div></div>
<div class="row"><div>1</div><div>2</div><div>3</div><div>4</div></div>
<div class="row"><div>1</div><div>2</div><div>3</div><div>4</div></div>
<div class="row"><div>1</div><div>2</div><div>3</div><div>4</div></div>
$(".row:odd &gt; div:even, .row:even &gt; div:odd").css({"background-color":"white"});​

【讨论】:

  • 最新的表格使用是什么,使用 em 是不是很“淘气”,我们都应该使用 div,以免被 CSS 警察处决?只是好奇...
  • 我也不知道为什么,但它不起作用。我想我不了解它,我在 JS Fiddler 中对其进行了调整,它按照我认为应该的方式工作,但是当我把它放在我的网站上时它没有。 baked-beans.tv/bb
  • @RGBK:是的,最好不要使用表格进行布局。您可以使用包装 div 实现相同的效果,我为您添加了一个示例,您可以在 jsfiddle.net/rFxgJ 看到它的实际效果。当然,然后你会被判断为患有“精神分裂症”。
  • @RGBK 虽然说实话,除非你有内容要放入div 或表格单元格或其他任何东西,但使用背景图像应该更容易实现这一点。
  • @RGBK:看起来是因为您的内容没有分开。从视觉上看,您有一个 4x4 网格,但您的标记将其分为 1x4、2x4 和另一个 1x4。所以你必须对网格应用不同的选择器。如果你给它们一个像“row”这样的类,那么使用包装器 div 示例可能是最简单的。
【解决方案4】:

另一种方法是[未验证功能但演示逻辑]:

 $('div').click(function(e){
  $tester=$(this).children('div.Other').size();
        for(var $j=0;$j<$tester;$j=$j+1){
                      if($j%2==0){
              $(this).children().eq($j).css(...);
                      }else{
                              $(this).children().eq($j).css(...);
                      }
        }

 });

【讨论】:

    【解决方案5】:

    嗨,这一切都让我精神崩溃。

    关于 Stack Overflow,我不明白的是,尽管它是天才,但你不能只为同一个问题展示新的替代方案......就像当你回答时,你不能只在其中放入新的代码示例如果你是他问这个问题的人?!我在这里做错了什么。

    所以现在我正在回答我的问题,但实际上不是,我只是以一种新的方式展示问题。

    所以无论如何,我正在尽一切可能尝试这个,没有运气,真的很感谢这里的一些帮助。在此处查看有问题的页面http://baked-beans.tv/bb

    它应该像这个线程的第一篇文章所示那样制作一个网格,但它并没有像它应该的那样交替。

    :nth-child(4n+4) 在我使用 jsfiddler 时有效,但在 wordpress 中无效,这就是难题。为什么 wordpress 会搞砸呢?

        function oddRow() {
            $(".thumb_container:odd").css("background-color", "#f00");
            $(".thumb_container:even").css("background-color", "#fff");
    
        };
    
        function evenRow() {
            $(".thumb_container:odd").css("background-color", "#fff");
            $(".thumb_container:even").css("background-color", "#f00");
        };
    
    
    $('.thumb_container').each(function(i) {
    
         i=(i+1);
    
         if (i%4==0 ){
    
            if (switchMe == false){
            switchMe = true;
            }
    
            else if (switchMe == true){
            switchMe = false;
            }
         }
    
         if (switchMe == false){
            oddRow();
            $(this).css("background-color", "#000");
    
         } else if (switchMe == true){
            evenRow();
            $(this).css("background-color", "#000");
    
         }
    
    });
    

    【讨论】:

      【解决方案6】:

      这可以在 2 行 jquery 中完成。

      这是我为此使用的 HTML 格式:

      <div id="container">
      <div class="row">
          <div></div>
          <div></div>
          <div></div>
          <div></div>
      </div>
      <div class="row">
          <div></div>
          <div></div>
          <div></div>
          <div></div>
      </div>
      </div>
      

      CSS:

      #container {
              width: 816px;
              margin: 0 auto;
          }
          #container .row div {
              width: 100px;
              height: 100px;
              float: left;
              background: #fff;
              border: 1px solid black;
          }
          .dark {
              background: #000 !important;
          }
      

      jquery:

      $(document).ready(function() {
              $("#container .row:nth-child(even) div:nth-child(even)").addClass("dark");
              $("#container .row:nth-child(odd) div:nth-child(odd)").addClass("dark");
      });
      

      这告诉它为每个偶数行上的每个偶数 div 设置一个暗类,并在奇数行的奇数 div 上设置该类。

      【讨论】:

      • 嗨,布赖恩,感谢您的回复,但这就是全部……我没有像您在 html 中显示的那样按 div 分隔行的奢侈! :-( 我只有一系列原始 div 可供使用。这就是两难境地...
      • 抱歉,在您的原始帖子中遗漏了这一点。
      猜你喜欢
      • 1970-01-01
      • 2011-12-21
      • 2012-08-20
      • 2013-08-07
      • 2022-01-05
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 2016-01-04
      相关资源
      最近更新 更多