如何始终在移动设备和 iPad 上显示数字输入微调器

Posted

技术标签:

【中文标题】如何始终在移动设备和 iPad 上显示数字输入微调器【英文标题】:How to always display numerical input spinners on mobile and iPad 【发布时间】:2021-07-09 11:57:49 【问题描述】:

我有一些 html/CSS 可以在桌面上完美运行。

它也适用于移动设备,但输入字段上用于数字选择的向上和向下箭头不显示,迫使用户手动“输入”数字。客户已要求将这些数字微调箭头保留在移动视图上。

有很多关于how to hide/disable spinners 甚至a few 关于如何retain the spinners 的问题,但这些问题没有答案或不正确,遵循这些答案和建议并没有解决这个问题。

        @media only screen 

            input[type=number] 
               /* -moz-appearance: number-input; */   
            
 
            input[type=number]::-webkit-inner-spin-button,
            input[type=number]::-webkit-outer-spin-button 
                -webkit-appearance: inner-spin-button;
                /***
                 * Below tried and failed: 
                 ***/
                /* -moz-appearance: number-input; */ 
                /*-ms-appearance: inner-spin-button;*/
                /*appearance: auto;*/
                margin: 0;
                opacity: 1;
            
            
            #updQtyLoose47 
             /* basic styling */
            background: rgba(245, 235, 170, 0.75);
            border-radius: 0;
            border: none;
            border: solid 1px #dbdbdb;
            color: inherit;
            display: block;
            outline: 0;
            padding: 0.25rem 0 0.25rem 0.75rem;
            text-decoration: none;
            width: 100px;
            
        
<div>
<input type="number" name="Quantity[47]" value="0" class="qtyInputLoose" id="updQtyLoose47" min="0" max="8" >
</div>

平台:

iPad (ios 12.5)

浏览器:

谷歌浏览器和 Safari

尝试的解决方案:

不透明度设置为 1,但这不会显示微调器 (source)。 设置 moz-appearance: number-input;(和类似设置)不会显示微调器 (source)。 设置 -webkit-appearance: inner-spin-button; 不显示微调器 (source)。 在 HTML 输入元素上设置 inputmode="numeric" 不会显示微调器 (source)。

PC 上的 Firefox Inspector 上的 iPad 模拟器(物有所值)显示微调器按钮,而 Google Chrome Inspector 不显示微调器按钮。

有评论here那个

在 firefox 和 safari 中,它的默认功能是始终显示它。

Safari 12.1 似乎不再是这种情况

如何在网页的 iPad 显示屏上显示这些输入微调器按钮?

【问题讨论】:

在某些时候,对于像 input 这样的原生元素,要跨平台获得一致的结果是困难且棘手的。为什么不使用button 之类的this example 重新创建它? @johannchopin 是的,我希望避免在系统上添加一层 JS,但这似乎确实有效,我想我不得不承认 JS 是解决这个问题的方法。随意将代码粘贴到答案;-) 【参考方案1】:

您可以尝试在此处查看this example

【讨论】:

谢谢,但这并不能解决问题。我已经相应地更新了问题。 那么这个答案可能会根据您更新的问题对您有所帮助***.com/a/51747587/8461587【参考方案2】:

在某些时候,对于像input 这样的原生元素,要在整个平台上获得一致的结果是困难且棘手的。出于这个原因,我建议您使用一些 javascript 重新创建一个“伪造”本机行为的程序。这是一个非常基本的例子:

const input = document.querySelector('input[type=number]')

const increment = () => 
  input.value = Number(input.value) + 1

const decrement = () => 
  input.value = Number(input.value) - 1


document.querySelector('.spinner.increment').addEventListener('click', increment)
document.querySelector('.spinner.decrement').addEventListener('click', decrement)
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button 
  -webkit-appearance: none;
  margin: 0;


.number-input 
  position: relative;
  width: fit-content;


input 
  width: 60px;


.spinners 
  position: absolute;
  right: 0;
  top: 50%;
  display: flex;
  flex-direction: column;
  width: fit-content;
  margin: 1px;
  transform: translateY(-50%);


.spinner 
  font-size: 7px;
  border: none;
  padding: 0 1px;


.spinner:hover 
  background: lightgrey;
<div class="number-input">
  <input type="number" name="Quantity[47]" value="0" class="qtyInputLoose" min="0" max="8">
  <div class="spinners">
    <button class="spinner increment">&#9650;</button>
    <button class="spinner decrement">&#9660;</button>
  </div>
</div>

如果你需要更个性化的东西,只需稍微调整一下 css 和 html 结构:

const input = document.querySelector('input[type=number]')

const increment = () => 
  input.value = Number(input.value) + 1

const decrement = () => 
  input.value = Number(input.value) - 1


document.querySelector('.spinner.increment').addEventListener('click', increment)
document.querySelector('.spinner.decrement').addEventListener('click', decrement)
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button 
  -webkit-appearance: none;
  margin: 0;


.number-input 
  display: flex;


input 
  width: 40px;
  border: solid 1px lightgrey;
  border-radius: 0;
  text-align: center


.spinner 
  border: solid 1px lightgrey;


.spinner:hover 
  background: lightgrey;


.spinner:first-child 
  border-radius: 3px 0 0 3px;


.spinner:last-child 
  border-radius: 0 3px 3px 0;
<div class="number-input">
  <button class="spinner decrement">-</button>
  <input type="number" name="Quantity[47]" value="0" class="qtyInputLoose" min="0" max="8">
  <button class="spinner increment">+</button>
</div>

这是一个带有 JQuery 的版本:

const input = $('input[type=number]')

const increment = () => 
  input.val(Number(input.val()) + 1)

const decrement = () => 
  input.val(Number(input.val()) - 1)


$('.spinner.increment').click(increment)
$('.spinner.decrement').click(decrement)
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button 
  -webkit-appearance: none;
  margin: 0;


.number-input 
  display: flex;


input 
  width: 40px;
  border: solid 1px lightgrey;
  border-radius: 0;
  text-align: center


.spinner 
  border: solid 1px lightgrey;


.spinner:hover 
  background: lightgrey;


.spinner:first-child 
  border-radius: 3px 0 0 3px;


.spinner:last-child 
  border-radius: 0 3px 3px 0;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<div class="number-input">
  <button class="spinner decrement">-</button>
  <input type="number" name="Quantity[47]" value="0" class="qtyInputLoose" min="0" max="8">
  <button class="spinner increment">+</button>
</div>

【讨论】:

这可行,但在非 ipad 样式上,这会产生两组箭头 理想情况下,我会寻找具有 [-][number][+] 样式的东西,但如果它必须是 JS,那么我确信有很多选择可供我探索。我的问题实际上是关于原生 CSS 是否可以实现这种统一性 @Martin 我添加了一个带有[-][number][+] 设计的自定义示例;) js 脚本部分仍然相同。 @Martin 这个答案看起来不错,可以验证吗? :) 您好,是的,前几天我快速浏览了一下,它看起来确实很有希望,但我还不能回到这个项目,但我会回来的一两天,将整理这个松散的结局,再次感谢您的帮助:-)【参考方案3】:

当我意识到操作系统对输入的处理方式不同(弹出键盘而不显示箭头)时,我一直在寻找在 Mobile Chrome 上显示箭头。我遇到了这篇文章,我改进了代码,使您可以在同一页面中拥有许多按钮,但只有一个函数来管理每个按钮的增量/减量。最后一个示例如下图所示,适用于智能手机。

要添加第三个按钮,只需使用id='3' 输入,用id='pb3' 输入加号按钮,用id='mb3' 输入减号按钮 您无需更改任何其他内容

您可以使用onchange 事件或onkeyup 事件来调用imposeMinMax() 函数。取决于您的应用程序。 onkeyup 只有当你有一个 min0 时才能正常工作。

当用户按住按钮时,我还添加了自动增量输入。访问this link获取自动增量代码。

function imposeMinMax(el) /*this function delimits max and min*/
  if(el.value != "")
    if(parseInt(el.value) < parseInt(el.min))
      el.value = el.min;
    
    if(parseInt(el.value) > parseInt(el.max))
      el.value = el.max;
    
  


function modIn(inId)
  if(inId.charAt(0)=='p')                  /*p for plus*/
    var targetId = inId.match(/\d+/)[0];    /*just keep the number*/
    document.getElementById(targetId).value ++;
    imposeMinMax(document.getElementById(targetId));
   
  if(inId.charAt(0)=='m')                  /*m for minus*/
    var targetId = inId.match(/\d+/)[0];
    document.getElementById(targetId).value --;
    imposeMinMax(document.getElementById(targetId));
   
.signBut 
      width: 30px;
      margin-bottom: 5px;
    

.inNum width: 40px;
  
<!--    Bootstrap --> 
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

<div class='card'>
  <div class='card-body' >
    <h5 class='card-title'>TEMPERATURE</h5>
      <div class='container'>
        <div class='row'>
          <div class='col-auto' style="width: 40%;">
            <label >Temprerature:</label>
          </div>
          <div class='col-auto'>
            <button type="button" class="btn btn-danger btn-sm signBut" id='mb1' onclick='modIn(this.id)'>-</button>
            <input type="number" name='tempCalib' id='1' class='inNum' onchange='imposeMinMax(this)' value='0' max='6' min="-6" step="1">                 
            <button type="button" class="btn btn-danger btn-sm signBut" id='pb1' onclick='modIn(this.id)'>+   </button>&nbsp;°C
          </div>
        </div>
        <br>
        <div class='row'>
          <div class='col-auto' style="width: 40%;">
            <label>Hysteresis:</label>
          </div>
          <div class='col-auto'>
            <button type="button" class="btn btn-danger btn-sm signBut" id='mb2' onclick='modIn(this.id)'>-</button>
            <input type="number" name='tempHyst' id='2' class='inNum' onchange='imposeMinMax(this)' value="1" max="4" min="-4" step="1">                 
            <button type="button" class="btn btn-danger btn-sm signBut" id='pb2' onclick='modIn(this.id)'>+</button>&nbsp;°C
          </div>
         </div>
        </div>
       </div>
      </div>

【讨论】:

这看起来可能正是我正在寻找的,当我回到那个项目时,我会尝试你的代码。谢谢。 是的,基本上好处是您可以添加任意数量的按钮和输入。

以上是关于如何始终在移动设备和 iPad 上显示数字输入微调器的主要内容,如果未能解决你的问题,请参考以下文章

在桌面、ipad、移动设备上显示不同元素的媒体查询

当我在 iOS 上的网站上输入密码时,如何隐藏最后一位数字

如何始终使用网络的移动版本

为啥这个脚本不能在 android、iphone、ipad 等移动设备上运行?

行高在 iPhone 和 iPad 上的显示方式与在其他设备上不同

在移动设备上输入时,如何让我的 React TextField 打开数字键盘?