我想在已知宽度的文本输入(隐藏溢出)中将一行动态占位符文本从头到尾过渡
现在,我知道对于常规容器div来说,我可以利用转换来转换正确的长度...
对于一个长度为100px的容器,我可以使用transform: translateX(calc(100px - 100%)
div {
width: 100px;
border: 2px solid green;
margin: 10px;
padding: 5px;
}
div {
white-space: nowrap;
overflow: hidden;
}
span {
display: inline-block;
animation: 4s scrollText forwards;
}
@keyframes scrollText {
to {
transform: translateX(calc(100px - 100%));
}
}
<div><span>some really really really long text here</span></div>
我想知道是否可以使用placeholder pseudo element使用占位符文本实现上述效果。
所以我尝试了以下操作:
input {
width: 100px;
border: 2px solid green;
margin: 10px;
padding: 5px;
}
input::placeholder {
color: red;
animation: 4s scrollText;
transform: translateX(0);
}
@keyframes scrollText {
from {
transform: translateX(0);
}
to {
transform: translateX(calc(100px - 100%));
}
}
<input type="text" placeholder="some really really really long text here">
...但是由于占位符伪元素
上可用属性的限制,以上代码段不起作用所有适用于::first-line pseudo-element的属性 应用于:: placeholder伪元素。
很遗憾,transform
1 没有出现在that list中。
所以我想知道是否还有另一种方法可以实现-可能具有占位符伪元素支持的其他属性。
transform
属性似乎在没有calc函数和动画的情况下在Chrome上确实可以工作。
input {
width: 100px;
border: 2px solid green;
margin: 10px;
padding: 5px;
}
input::placeholder {
color: red;
transform: translateX(-50%);
}
<input type="text" placeholder="some really really really long text here">
答案 0 :(得分:1)
您可以使用额外的包装程序对此进行模拟,而无需在输入元素上实际使用占位符:
input {
width: 100px;
border: 2px solid green;
padding: 5px;
vertical-align:top;
background:transparent; /* a transparent background to show the pseudo element */
}
.input {
display:inline-block;
margin: 10px;
position:relative;
z-index:0;
overflow:hidden;
}
.input:before {
content:attr(placeholder);
position:absolute;
left:5px;
top:5px;
white-space:nowrap; /* no line break */
color: red;
pointer-events:none; /* avoid any interaction */
animation: 4s scrollText forwards;
z-index:-1;
}
@keyframes scrollText {
to {
transform: translateX(calc(100px - 100%));
}
}
/* hide the before on focus */
.input:focus-within:before{
visibility:hidden;
}
/* add background to hide the before when there is text and no focus*/
input:not(:placeholder-shown) {
background:#fff;
}
<div class="input" placeholder="some really really really long text here">
<input type="text" placeholder=" "> <!-- needs an empty placeholder for :placeholder-shown -->
</div>