【问题标题】:Figured borders for text input with css使用 css 进行文本输入的图形边框
【发布时间】:2014-04-06 12:09:18
【问题描述】:

我需要像这样设置文本输入的样式

要求是:

  1. 流体宽度(延伸到容器宽度)
  2. 焦点时边框颜色发生变化
  3. 错误时边框颜色变化

有没有一些简单的方法可以用 css 做到这一点?

我现在想出来的东西比较复杂,需要js,而且运行起来不太顺利-

<div class="inpt"><input type="text" /></div>

jQuery(".inpt").delegate("*", "focus blur", function() {
    var elem = jQuery(this);
    var elem2 = jQuery(this).parent();
    setTimeout(function() {
        elem2.toggleClass("focused", elem.is(":focus"));
    }, 0);
});

http://jsfiddle.net/4sKV9/

我必须将输入包装在一个 div 中,并使用 :before 和 :after 上的图像设置该 div 的样式
显然 :active 在这种情况下不适用于 div ,因此我必须使用脚本切换某些类。

我觉得一定有一些我缺少的简单解决方案。 有人可以提出更好的建议吗?

【问题讨论】:

    标签: html css


    【解决方案1】:

    此解决方案使用 jQuery 来检测对 &lt;input&gt; 的关注,并在父容器上添加/删除 .focused 类。

    左右箭头均由带有 2 个 &lt;span&gt; 元素和 :before / :after 的 CSS 组成。

    输入是响应式的并适应其容器的宽度。

    FIDDLE

    HTML:

    <div class="inpt"> 
        <span class="left arrow"></span>
        <input type="text" /> 
        <span class="right arrow"></span>
    </div>
    

    CSS:

    .inpt {
        position:relative;
        margin:5%;
        width:50%;
    }
    .left, .right {
        position: absolute;
        top:14px;
    }
    .right {
        right:0;
    }
    .arrow:after, .arrow:before {
        top: 50%;
        border: solid transparent;
        content:" ";
        height: 0;
        width: 0;
        position: absolute;
        pointer-events: none;
    }
    .arrow:after {
        border-color: rgba(255, 255, 255, 0);
        border-width: 12px;
        margin-top: -12px;
    }
    .arrow:before {
        border-color: rgba(220, 228, 228, 0);
        border-width: 15px;
        margin-top: -15px;
    }
    .left:after, .left:before {
        right: 100%;
    }
    .left:after {
        border-right-color: #fff;
    }
    .left:before {
        border-right-color: #dce4e4;
    }
    .right:after, .right:before {
        left: 100%;
    }
    .right:after {
        border-left-color: #fff;
    }
    .right:before {
        border-left-color: #dce4e4;
    }
    .focused input {
        border-color: #afddda;
    }
    .focused .right:before {
        border-left-color: #afddda;
    }
    .focused .left:before {
        border-right-color: #afddda;
    }
    input {
        border-top: 2px #dce4e4 solid;
        border-bottom: 2px #dce4e4 solid;
        border-left:none;
        border-right:none;
        padding:2px 10px 0px;
        height: 29px;
        display: block;
        outline: 0;
        width: 100%;
        margin: 6px 0;
        box-sizing:border-box;
    }
    

    jQuery

    $('input').focus(function () {
        $(this).parent().addClass('focused');
    });
    
    $('input').blur(function () {
        $(this).parent().removeClass('focused');
    });
    

    【讨论】:

    • 你能改变箭头的角度吗?
    • @Andrey 你的意思是让它们不那么宽吗?
    • 我的意思是让它们像我原始问题中的图像一样。我必须遵循设计。
    • @Andrey 很抱歉这么久,我还有其他事情要做这里是小提琴:jsfiddle.net/webtiki/N36WS
    • web-tiki 感谢您的意见。此解决方案并不完美,但我会将其标记为已接受,因为似乎找不到更好的解决方案。仅提及缺点 - 1. 两个额外的跨度; 2. 边框看起来有点变形(尤其是当您放大浏览器时)。无论如何,再次感谢!
    【解决方案2】:

    编辑:你确实需要 JS。 :before 和 :after 不能应用于输入字段。请参阅 web-tiki 的答案。

    在这种情况下你不需要 Javascript。 :focus 在 CSS 中是一个有效的伪类。看看这个article about :focus

    input:focus {
        border-color: red;
    }
    

    借助伪类 :before 和 :after 你也可以create arrows in pure css

    【讨论】:

    • 你不明白问题是什么,你还没有研究我的小提琴。我已经使用过:before 和:after。但是您必须知道 :before 和 :after 元素不适用于输入。所以我不得不将它们应用到包装器 div。但是您不能在 div 上应用 :focus 或 :active ,而是将其应用于输入。但是样式与包装器 div 相关联,因此您需要一些 js 来检查输入是否具有焦点,然后在包装器 div 上切换类。这就是我所做的并且有效,但我仍在寻找更优雅的解决方案。
    • 你建议的css箭头没有用,因为你只能用它们做45度。
    • 你是对的:之前和之后,我的错误。但是您可以制作小于或大于 45 度的 CSS 箭头。
    猜你喜欢
    • 2023-01-25
    • 2012-11-05
    • 1970-01-01
    • 2020-11-08
    • 2018-07-24
    • 2013-08-10
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多