【问题标题】:Move placeholder above the input on focus将占位符移到焦点上的输入上方
【发布时间】:2017-07-03 04:13:17
【问题描述】:

我正在寻找将占位符文本移动到焦点输入上方的 css 代码。我找到了这个代码here。这段代码很完美,但我的输入标签被包裹在<span> 中,因此一般的同级选择器不起作用。任何想法如何编辑这个CSS?

<div>
  <span class='blocking-span'>
  <input type="text" class="inputText" />
  </span>
  <span class="floating-label">Your email address</span>
</div>

【问题讨论】:

  • 使用当前布局的 CSS 无法做到这一点。
  • 如果您也展示您的 CSS,以便我们了解它的渲染方式,我们或许可以提出解决方案
  • css 在描述中的原始链接上。
  • 你能把floating-label移到blocking-span内的输入之后吗?
  • blocking-span 类有什么作用? ...display: block?

标签: html css


【解决方案1】:

在这种情况下,您可以使用 CSS 伪选择器 :placeholder-shown 来检测何时将假占位符移开。请参见下面的示例:

label {
  margin:20px 0;
  position:relative;
  display:inline-block;
}
  
span {
  padding:10px;
  pointer-events: none;
  position:absolute;
  left:0;
  top:0;
  transition: 0.2s;
  transition-timing-function: ease;
  transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);
  opacity:0.5;
}

input {
  padding:10px;
}

input:focus + span, input:not(:placeholder-shown) + span {
  opacity:1;
  transform: scale(0.75) translateY(-100%) translateX(-30px);
}

/* For IE Browsers*/
input:focus + span, input:not(:-ms-input-placeholder) + span {
  opacity:1;
  transform: scale(0.75) translateY(-100%) translateX(-30px);
}
<label>
  <input placeholder=" ">
  <span>Placeholder Text</span>
</label>

【讨论】:

  • 我建议设置字体大小而不是 scale(0.75) 和 translateX(-30px)
  • input:not(:placeholder-shown) + span 有什么作用?我最近重新创建了这个效果,不需要添加那行。不清楚它在做什么。正如@lynx 建议的那样,字体大小是更好的解决方案,否则在添加多个输入时 x 翻译全部关闭
【解决方案2】:

使用给定的链接 CSS 等,只需将 floating-label 移动到 blocking-span 内。

通过在div 上使用position: relativefloating-label 仍将重新定位,就好像它在blocking-span 之外一样

div {
  position: relative; /*  make label relate to div  */
  padding-top: 10px;  /*  make space for label      */
}
.inputText {
  font-size: 14px;
  width: 200px;
  height: 25px;
}
.floating-label {
  position: absolute;
  pointer-events: none;
  left: 15px;
  top: 18px;
  transition: 0.2s ease all;
}
input:focus ~ .floating-label,
input:not(:focus):valid ~ .floating-label {
  top: -6px;
}
<div>
  <span class='blocking-span'>
    <input type="text" class="inputText" required/>
    <span class="floating-label">Your email address</span>
  </span>
</div>

【讨论】:

  • 我应该为 textarea 做什么? @LGSon
【解决方案3】:

如果您更改html 结构,那么您的参考示例是可行的,但如果您不想更改html 结构,那么您需要编写小jQuery。你可以检查一下。

$(function(){
  $('.blocking-span input').on('focus', function(){
    $(this).parents('.parents-elm').addClass('foucs-content'); // When focus the input area
  });
  $(document).mouseup(function(e){
		if($(e.target).parents('.blocking-span input').length==0 && !$(e.target).is('.blocking-span input')){
			$('.parents-elm').removeClass('foucs-content');
		}
	});
});
div{
  position: relative;
}
.blocking-span{
  display: block;
}
.blocking-span input{
  border: 1px solid #eaeaea;
  height: 80px;
  padding-top: 30px;
  padding-left: 20px;
  padding-right: 20px;
  width: 100%;
}
.floating-label{
  display: inline-block;
  font-size: 15px;
  left: 20px;
  line-height: 20px;
  position: absolute;
  top: -webkit-calc(50% - 10px);
  top: -moz-calc(50% - 10px);
  top: calc(50% - 10px);
  transition: top 0.3s ease-in-out 0s;
}
.foucs-content .floating-label{
  top: 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="parents-elm">
  <span class='blocking-span'>
  <input type="text" class="inputText" />
  </span>
  <span class="floating-label">Your email address</span>
</div>

【讨论】:

    【解决方案4】:

    我使用了联系表格 7,它给了我这个额外的跨度。但我已经找到了如何阻止这个额外跨度的解决方案。有一个过滤器可以删除此联系表格 7 跨度。这是link.

    【讨论】:

    • 嗯,这些信息对解决方案很重要......当我们不了解所有事实时,这很难提供帮助
    猜你喜欢
    • 2021-02-15
    • 2019-11-27
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-09-27
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多