首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件CSS样式取决于复选框的偶数/奇数

条件CSS样式取决于复选框的偶数/奇数
EN

Stack Overflow用户
提问于 2018-04-10 01:55:08
回答 2查看 281关注 0票数 1

我试图在几个<input type="checkbox">上创建条件CSS样式,当校验标记的总数是偶数或奇数时。

这不是任何更大的项目的一部分,我只是把它当作一个思想实验。我在这里创建了一个工作演示:https://jsfiddle.net/gu4ur6us/

这可以按照预期的方式工作,并根据勾选的复选框数量显示evenodd。问题是,有160 :checked:not(:checked)选择器为5个复选框!有更好的办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-10 03:04:11

大多数前端工程师都会编写一个JavaScript例程,以便每次更改复选框时运行,计数所有选中的输入,并根据计数更改span内容。

但是,如果这不是一个选项,下面是您的CSS的更短的形式:

代码语言:javascript
复制
span:after, 
:checked~:checked~span:after, 
:checked~:checked~:checked~:checked~span:after {
  content: 'even';
}

:checked~span:after,
:checked~:checked~:checked~span:after, 
:checked~:checked~:checked~:checked~:checked~span:after {
  content: 'odd';
}
代码语言:javascript
复制
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">
<input type="checkbox">

<span></span>

如果希望将其限制在特定的情况下,只需将它们包装在父选择器中,并在父选择器中加上一个短的、特定的、类和前缀的父选择器+一个空格。

另外,如果JavaScript不是一个选项,您可以查看SCSS来编写一个函数,该函数需要一些有用的参数(即:复选框的数量、父项)并输出所有必要的CSS (上面的代码将是5个复选框的输出)。

我试过了。也许可以简化,但这里有一个粗略的版本:

https://jsfiddle.net/websiter/g0dpgvfp/

代码语言:javascript
复制
// =============================================== variables. change as needed.
$times: 21;
$selector: ':checked~';
$prefix:'';     // parent selector (prefix), if needed
$sufix: 'span:after';

// =============================================== functions.
@function make-selector($times, $selector, $prefix, $sufix) {
  $output: '';
  @for $i from 1 through $times {
      $output:#{$output}#{$selector};
  }
  @return #{$prefix}#{$output}#{$sufix}
}
@function two-by-two($times, $selector, $prefix, $sufix, $even) {
  $output: '';
  $i: 0;
  @while $i*2 < $times*2 - 1 {
    $output:#{$output}#{make-selector($i+$even, $selector, $prefix, $sufix)};
    @if $i*2 < $times*2 - 3 {
      $output:#{$output}#{','};
    }
    $i:$i+2;
  }
  @return $output;
}

// =============================================== output.
#{$prefix}#{$sufix},
#{two-by-two($times,$selector,$prefix,$sufix,0)} {
  content: 'even';
}
#{two-by-two($times,$selector,$prefix,$sufix,1)} {
  content: 'odd';
}

JavaScript版本或多或少是一个班轮,开发过程需要2分钟。而且,如果你问我的话,它要优雅得多。

我在上面写的文章可能会给新生留下深刻的印象,但与js版本相比,这是一个巨大的开发时间损失(除非有一个特定的不使用JavaScript的要求--包括政府、银行、支付门户在内的每个人今天都喜欢它)。另外,请注意,上面的标记结构缺乏灵活性(所有复选框都需要是兄弟),而使用JavaScript,我们可以轻松地从整个页面中计数复选框,就像人们在实际场景中所期望的那样。

票数 3
EN

Stack Overflow用户

发布于 2018-04-10 03:20:41

我猜我们说的是一个纯粹的CSS挑战,仅仅是为了lols (因为使用javascript计数和切换类将是我们对实际项目的选择),所以我们开始.

一个稍微少一些的重载(但仍然是荒谬的具体方法)将是有越来越多的重复css兄弟姐妹选择器,直到你的最大数量的复选框。

就像这样

代码语言:javascript
复制
input[type="checkbox"]:checked ~ span{ background:red }

input[type="checkbox"]:checked ~ input[type="checkbox"]:checked ~ span{ background:green }

input[type="checkbox"]:checked ~ input[type="checkbox"]:checked ~ input[type="checkbox"]:checked ~ span{ background:red }

诸若此类。

https://jsfiddle.net/gu4ur6us/23/

还远没有一个像样的方法:p会看我是否能找到一个更好的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49744110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档