我认为 :placeholder-shown
选择器非常酷。 它允许您在占位符存在时选择输入的占位符 (<input placeholder="...">
)。 也就是说,输入还没有任何值。 您可能会认为 input[value]
可以做到这一点,或者帮助匹配实际值,但它做不到。
这使得 :placeholder-shown
成为我们拥有的少数几个可以对用户发起的状态做出反应的 CSS 属性之一,加入了 :hover
及其同类、:checked
(复选框技巧!) 以及同样出色的 :focus-within
。
我们可以使用它的一种方法是检查**用户是否在搜索字段中输入了任何文本**。 如果是,则在视觉上显示搜索按钮(绝不隐藏辅助技术)。 如果否,则保持隐藏状态。 这只是一个有趣的“节省空间”技巧,与 浮动标签 非常相似。
因此,也许我们从一个语义搜索表单开始
<form action="#" method="GET" class="search-form">
<!-- Placeholders aren't labels! So let's have a real label -->
<label for="search" class="screen-reader-text">Search</label>
<input id="search" type="search" class="search-input" placeholder="Enter search terms...">
<button class="search-button">Search</button>
</form>
我们使用其中一个 特殊的仅屏幕阅读器类 在视觉上隐藏搜索标签,因为它将始终在视觉上隐藏。 但我们将通过将按钮推到表单外部并隐藏溢出来隐藏按钮。
.search-form {
/* we'll re-use this number, so DRYing up */
--searchButtonWidth: 75px;
overflow: hidden;
position: relative;
}
.search-input {
/* take full width of form */
width: 100%;
}
.search-button {
position: absolute;
/* push outside the form, hiding it */
left: 100%;
width: var(--searchButtonWidth);
}
然后诀窍是在占位符消失(用户已输入值)时将搜索按钮拉回
/* ... */
.search-input:not(:placeholder-shown) ~ .search-button {
/* pull back the negative value of the width */
transform: translateX(calc(-1 * var(--searchButtonWidth)));
}
.search-button {
position: absolute;
left: 100%;
width: var(--searchButtonWidth);
/* animate it */
transition: 0.2s;
}
最终效果如下
查看 Chris Coyier 的 CodePen
:placeholder-shown 显示按钮 (@chriscoyier)
在 CodePen 上。
我在 Liam Johnston 的一个 CodePen 中看到了这个想法。 好主意,Liam!
我知道完全使用 placeholder
属性是 值得怀疑的,因此您的使用情况可能会有所不同。 我承认我主要对它在 CSS 中的直接状态处理方面以及它如何使用(例如臭名昭著的复选框技巧)感到好奇。
支持度良好。 当 Edge 成为 Chromium 后,它就变得非常清晰了。
此浏览器支持数据来自 Caniuse,其中包含更多详细信息。 数字表示浏览器从该版本开始支持该功能。
桌面
Chrome | Firefox | IE | Edge | Safari |
---|---|---|---|---|
47 | 51 | 11* | 79 | 9 |
移动/平板电脑
Android Chrome | Android Firefox | Android | iOS Safari |
---|---|---|---|
127 | 127 | 127 | 9.0-9.2 |
太酷了
我曾经在一个周末项目中使用过这种技术来隐藏无效输入时的提交按钮(使用
input[pattern]
)。 不确定其辅助功能方面。演示:https://latestcommit.netlify.com/
使用
translateX(calc(-1 * var(--searchButtonWidth)))
而不是translateX(-100%)
的具体原因是什么? 转换函数中的百分比值相对于应用transform
的元素的尺寸。总的来说,在这种情况下,我可能会选择预处理器变量而不是 CSS 变量。 这将提高支持度并减少浏览器的负担。
感觉最好是强制一些宽度,比如容器内部的填充以腾出按钮的空间。 使用 -100% 会更简洁,但也以某种方式使它在使用变量时更清晰。
同意,如果您正在使用一个。
看起来很酷
您还可以使用输入上的
required
属性和 CSS 中的:valid
伪选择器来获得略微更好的浏览器支持示例
未经验证的、未经证实的即兴思考:将搜索输入标记为必需输入似乎有点冒险(或者至少令人困惑),因为它将如何呈现给屏幕阅读器用户。 任何人都对此有想法吗?