【问题标题】:Is it possible to toggle two CSS `:checked` pseudo-classes with one click?是否可以一键切换两个 CSS `:checked` 伪类?
【发布时间】:2015-03-29 06:21:43
【问题描述】:

请注意I am aware of this question,但我正在寻找专门的技术答案。

作为对自己的 CSS 挑战,我正在尝试仅使用 CSS 创建一个精美的 select 框。使用I've learned recently 的各种花哨技术,我已经走得很远了。

Codepen Here

  • 看起来不错
  • 完全可以风格化,
  • 点击后会在列表中打开(使用隐藏的复选框和:checked+label 选择器)
  • 允许占位符文本(使用 :checked 和负边距顶部)
  • 允许选择(使用嵌套单选按钮列表)
  • 并在选择和折叠时正确显示值(使用:checkedposition: absolute
  • 它甚至可以正确绑定javascript

这是使用类似于

的结构
input[type=checkbox]#selector
label[for=selector]
    ul
        li.item1
            input[type=radio]#item1
            label[for=item1] The First Item 

我只剩下一个问题,一旦展开,单击时关闭菜单无法正常工作。单击项目时,正常的选择框将关闭。在您单击选择框的边框附近之前,我的不会。

这是因为用户点击内部输入不会切换父标签的:checked 状态,他们需要点击输入以关闭选择框。

有什么方法可以同时切换单选按钮状态父状态?

【问题讨论】:

  • "...靠近项目的边界" 也直接在标志图像上 (FF)
  • 在我看来,options 标签与country-selector 标签重叠。选项标签可防止触发国家/地区选择器标签。我想这就是浏览器处理它的方式,并且没有办法解决(JS除外)......
  • @LinkinTED 看到我正在考虑做一些事情,我们使用 css 转换来摆动显示/隐藏一个透明元素,它将覆盖整个事情。我当时的想法是,我可能能够捕获两者的点击,但没有交易。
  • 你不应该在内联元素中使用块元素,这会在不同的浏览器上产生很多问题,就像你现在拥有的一样,我已经创建了好几个月的精美表单元素,我知道什么你正在处理,我知道如何解决你的问题,但是一些 html 和 css 修改最适用,如果你想知道如何,请告诉我,我会很乐意解释你并告诉你,没有问题! ^_^
  • 是的,请@Allan。这更像是一个个人 CSS 项目,所以我仍然感兴趣。

标签: css


【解决方案1】:

您可能有点过于复杂了。

为什么不将.country-selector 复选框更改为同一组中的单选按钮?然后它就具有您正在寻找的行为,而不会使其成为需要大量解决方法的情况。唯一需要考虑的是,如果用户在盒子仍然打开时提交,则提供一个空值,但无论如何,这与您现有的实现有关。

Codepen Example

翡翠

input#country-selector(type='radio', name="country")

SCSS

&>[type=checkbox]

变成

&>[type=radio]

我还对笔进行了一些样式更改,使其与更传统的选择下拉菜单保持一致。

非常有趣的想法。对此表示赞赏。

【讨论】:

  • 天哪,你是对的。效果很好!这可能需要提交给 html5weekly...
  • 去吧。我一直为拨动开关做过类似的事情,但从未真正想过将其扩展到选择选项。它的美妙之处在于它在功能上非常类似于select 控件的工作方式。易于重复使用会很高,并且样式的可能性基本上使它成为神话般的样式可访问的选择下拉菜单。再次,荣誉。做得很好。
  • 我喜欢这个想法,因为你让事情变得简单 +1,但我想指出你的代码中有一些验证错误,对应于你滥用标签:validator.w3.org/…
  • @ChaosClown 为什么我们不允许将块元素嵌套在内联元素中,但允许在内联元素上设置display: block(反之亦然)?恕我直言,一旦您可以从 CSS 随意将任何元素设置为块级或内联,那么不将块元素嵌套在内联内的规则就不再有意义。另外,如果您事先不知道内容是什么,则不能使用内联元素来包含它……这会促使您对所有内容都使用块级元素。
【解决方案2】:

编辑

Internet Explorer 将处理透明元素,例如 event-pointer:none;有一个必须添加背景颜色+不透明度:0。现在至少可以在 Internet Explorer 中打开它:http://codepen.io/anon/pen/EargxL

编辑 2

我终于找到了一种支持Internet Explorer的方法,它看起来有点糟糕,我改天重构它:p http://codepen.io/anon/pen/ogmqpq

请注意它不适用于大多数移动设备,因为不实现 :active pseudo-selector: http://www.quirksmode.org/css/selectors/mobile.html#link5

原创

简而言之,通过选中的选择器在不同的输入上一键触发两次切换几乎是不可能的。

如何将 :focus 伪选择器与 :active 结合使用。

<div class="dropDown">
    <div class="toggle" tabindex="0"></div>
    <ul class="list" tabindex="0">
        <li>
            <label>
                <input type="radio" name="myDropDown" value="someValue" checked="checked"/>
                <span>Item 1</span>
            </label>
        </li>
        <li>
            <label>
                <input type="radio" name="myDropDown" value="someValue"/>
                <span>Item 2</span>
            </label>
        </li>
        <li>
            <label>
                <input type="radio" name="myDropDown" value="someValue"/>
                <span>Item 3</span>
            </label>
        </li>
    </ul>
</div>

CSS:

ul {
    list-style:none;
}
input {
    display:none;
}
.dropDown {
    position:relative;
}
.dropDown .toggle {
    position:absolute;
    width:100%;
    height:100%;
    z-index:1;
    outline:none;
}
.dropDown > .toggle:focus {
    z-index:0;
}
.dropDown > .list {
    position:relative;
    outline:none;
}
.dropDown > .list:active {
    z-index:1;
}
.dropDown > .toggle:not(:focus) + .list:not(:active) input:not(:checked) + span {
    display:none;
}

现场示例http://codepen.io/anon/pen/emxJWr

注意: 这在 Internet Explorer 中不起作用,因为 :active 没有冒泡,我愿意接受任何建议!

【讨论】:

  • 哇,太好了,我将不得不研究一下,但这似乎是迄今为止最接近的事情。
【解决方案3】:

只是为了好奇 pointer-events:双击 input:checked + label 将允许您在此处关闭您喜欢的选择器:http://codepen.io/gc-nomade/pen/NPJaNa

.options {
      &>li{
        &:hover {
          background-color: blue;
        }
        input[name=country]:checked+label {
          position: static;
          pointer-events:none;}
      }
    }

【讨论】:

    【解决方案4】:

    更改 z-index 将允许用户单击切换下拉列表的标签区域。

    查看我更新的代码笔: codepen ex

      .country-selector {
      display: inline-block;
      border: 1px solid black;
      position: relative;
      overflow: hidden;
    
      &:before {
        content: "▾";
        position: absolute;
        right: 5px;
        top: 5px;
        z-index:-1;
      }
    

    更改了 .country-selector .options 边距并取消了 .country-selector padding-right。

    然后将 .country-selector:before 更改为 -1 的 z-index。

    不确定这是否适用于所有浏览器/设备,但似乎适用于 FF 和 chrome (OS x)。

    希望这会有所帮助:)

    【讨论】:

    • 我不明白,当我点击国家名称时它不会折叠,因此不会触发父复选框切换。仅供参考,您应该查看链接的降价语法
    • 他用它来绕过 SO 对发布链接而不是代码的限制。
    【解决方案5】:

    存在验证错误,使其无法正常工作:

    元素标签不得作为标签元素的后代出现。

    如果您放置跨度而不是内部标签,则一切正常。 您在父标签内也有多个输入字段,但这需要更大的修复,因为您需要使用它触发 country-selector 复选框。

    Working pen.

    【讨论】:

    • 但是输入元素永远不会被选中。 span 不支持 for 属性。我同意没有完全正确的验证,但就像我说的,这只是一个实验。
    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多