【问题标题】:Center radio button with input field带输入字段的中心单选按钮
【发布时间】:2020-12-03 18:37:26
【问题描述】:

我有一些自定义单选按钮。最后一个选项应该是带有输入字段的单选按钮。 如您所见,在 de Codepen 示例中,单选按钮未与输入字段垂直居中对齐。 我已经尝试了从计算顶部到显示 flex 的所有方法。

Codepen:https://codepen.io/monsmado/pen/RwarYEG

<form>
    <label>Do you have an elevator?</label>
    <div class="custom-control custom-radio">
        <input type="radio" id="elevatorYes" name="elevator" class="custom-control-input">
        <label class="custom-control-label" for="elevatorYes">Yes</label>
    </div>
    <div class="custom-control custom-radio">
        <input type="radio" id="elevatorNo" name="elevator" class="custom-control-input">
        <label class="custom-control-label" for="elevatorNo">No</label>
    </div>
    <div class="custom-control custom-radio">
        <input type="radio" id="elevatorOther" name="elevator" class="custom-control-input">
        <label class="custom-control-label" for="elevatorOther">
        <input type="text" class="form-control" name="elevator" placeholder="Other">
        </label>
    </div>
</form>

【问题讨论】:

    标签: html css twitter-bootstrap bootstrap-4


    【解决方案1】:

    在这种情况下添加这个 CSS

    .form-group:nth-child(4) .custom-control-label:after, .form-group:nth-child(4) .custom- control-label:before{
     margin-top: 0.5em
    }
    

    我在你的 codepen 中将解决方案发给你

    https://codepen.io/r0binxp/pen/qBZbJaZ

    【讨论】:

    • 这就是我要说的!感谢您的示例和您的帮助。
    • 当你改变字体大小时这会崩溃(尽管其他行也是如此)
    【解决方案2】:

    好吧,一个快速解决您的情况的方法可能是覆盖自定义单选按钮的当前顶部值并将其设置为25% (因为它的实际高度是您输入的50%,所以@ 987654324@ 将正好放在中间)。另外,请注意,父元素上的 display flex 不会按预期工作,因为自定义单选在 ::before pseudo-element 内退出,因此它不会获得 flex 属性。

    .custom-control-label[for=monthsOther]::before,
    .custom-control-label[for=monthsOther]::after {
      top: 25%;
    }
    <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet" />
    <form>
      <label>How many months?</label>
      <div class="custom-control custom-radio">
        <input type="radio" id="monthsYes" name="months" class="custom-control-input">
        <label class="custom-control-label" for="monthsYes">1-2</label>
      </div>
      <div class="custom-control custom-radio">
        <input type="radio" id="monthsNo" name="months" class="custom-control-input">
        <label class="custom-control-label" for="monthsNo">3-5</label>
      </div>
      <div class="custom-control custom-radio">
        <input type="radio" id="monthsOther" name="months" class="custom-control-input">
        <label class="custom-control-label" for="monthsOther">
            <input type="text" class="form-control" name="months" placeholder="Other">
            </label>
      </div>
    </form>

    注意:请记住,由于单选按钮本身及其检查操作背景是在 ::before::after 伪元素中定义的,因此您需要同时覆盖它们。

    【讨论】:

    • 我明白了。谢谢(你的)信息。我会尝试其他一些解决方案,甚至可能会提供它自己的类,以便能够为最后一个选项定位单选按钮。
    【解决方案3】:

    这似乎是一种改变表单元素外观的非常老套的方法。最初的问题是缺少任何 CSS 代码(这是所有问题出现的地方),但链接的 codepen 确实显示了根本原因。正确对齐绝对定位的元素将非常困难,尤其是当您开始考虑从左到右或更大的字体大小时。此外,在标签内使用::before 创建单选按钮的视觉表示会导致挫败感,并最终成为一个糟糕的解决方案。

    正确的解决方案可能是在收音机和标签上都使用vertical-align: middlevertical-align: baseline。但是当元素绝对定位时,这些将不起作用。

    【讨论】:

    • 我正在使用带有自定义字段的引导程序 4.5。因此,如果它是“hacky”,我将把它留给 Bootstrap 的开发人员。我已经尝试过使用弹性和垂直对齐方式,但正如你提到的,它使用 ::before 和 ::after 伪元素来设置单选按钮的样式。
    • 对我来说疯狂的是单选按钮视觉来自标签而不是单选按钮元素本身。如果没有引导程序,当字体大小增加时,单选按钮不会变大。使用引导程序,它们的大小会增加,但位置并不一致。如果您最终编写了大量自定义代码来处理这些正常情况,那么除了不必要的战斗之外,我不确定您从框架中得到了什么。文本框在标签元素内也有点奇怪;它甚至不能在 chrome 中正常工作;收音机没有被选中,但点击时会突出显示。
    • 我不知道这有什么问题。甚至材料设计也使用相同的原则:materializecss.com/radio-buttons.htmlmaterial.io/components/selection-controls 也许这是 Bootstrap 中的错误或错误,它们没有正确对齐。在标签元素中放置文本框是为了使其与我在生产中更改的单选按钮保持一致。
    • 我不会通过材料设计;我认为他们正在向后弯腰,以使我个人和专业认为在视觉和实用性上客观上都是糟糕的设计。围绕输入控件的 Web 样式肯定存在弱点。或者,您可以制作您自己认为合适的 Web 组件,而不必在输入控件的约束内工作;但是,如果您想将可访问性与其他内容结合起来,您将承担一项艰巨的任务。
    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2013-02-04
    • 2018-08-17
    相关资源
    最近更新 更多