有没有办法在HTML5 datalist选项上应用CSS样式?

n0n*_*tan 62 css html5 option html-datalist

我想修改显示我的datalist的不同选项列表的方式.是否可以在其上应用一些CSS属性?

<input list="languages" id="language_id">
<datalist id="languages">
      <option value="html">HTML</option>
      <option value="java">Java</option>
      <option value="perl">Perl</option>
      <option value="php">PHP</option>
      <option value="ruby-on-rails">Ruby on Rails</option>
</datalist>
Run Code Online (Sandbox Code Playgroud)

我试过了

option {
    background: red;
}
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.

adr*_*ift 62

select元素一样,datalist元素在样式上几乎没有灵活性.如果这是您的问题,那么您无法设置任何建议的术语.

浏览器为这些元素定义自己的样式.

  • 这太伤心了 (79认同)
  • 我希望有一种方法可以一致地改变原生元素的样式,例如数据列表和选择 (9认同)
  • 相关:Firefox供应商特定的CSS扩展列表(包括例如占位符,但没有像datalist一样):https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Mozilla_Extensions (3认同)

Orh*_*han 10

我在有人这样做的地方找到了这个codepen:https://codepen.io/sidd_dev/pen/qBRWNQQ ?editors=1010

在此输入图像描述

我用它测试了

  • Chrome 108.0.5359.99(官方版本)(64 位)
  • 火狐浏览器 107.0.1(64 位

您应该检查https://caniuse.com/?search=datalist了解有关浏览器支持的更多详细信息。

input.onfocus = function () {
  browsers.style.display = 'block';
  input.style.borderRadius = "5px 5px 0 0";  
};
for (let option of browsers.options) {
  option.onclick = function () {
    input.value = option.value;
    browsers.style.display = 'none';
    input.style.borderRadius = "5px";
  }
};

input.oninput = function() {
  currentFocus = -1;
  var text = input.value.toUpperCase();
  for (let option of browsers.options) {
    if(option.value.toUpperCase().indexOf(text) > -1){
      option.style.display = "block";
  }else{
    option.style.display = "none";
    }
  };
}
var currentFocus = -1;
input.onkeydown = function(e) {
  if(e.keyCode == 40){
    currentFocus++
   addActive(browsers.options);
  }
  else if(e.keyCode == 38){
    currentFocus--
   addActive(browsers.options);
  }
  else if(e.keyCode == 13){
    e.preventDefault();
        if (currentFocus > -1) {
          /*and simulate a click on the "active" item:*/
          if (browsers.options) browsers.options[currentFocus].click();
        }
  }
}

function addActive(x) {
    if (!x) return false;
    removeActive(x);
    if (currentFocus >= x.length) currentFocus = 0;
    if (currentFocus < 0) currentFocus = (x.length - 1);
    x[currentFocus].classList.add("active");
  }
  function removeActive(x) {
    for (var i = 0; i < x.length; i++) {
      x[i].classList.remove("active");
    }
  }
Run Code Online (Sandbox Code Playgroud)
fieldset {
  border: 1px solid blue;
  width: 360px;
  border-radius: 5px;
}

legend, label{
  color: blue; 
  font-size: 24px;
  font-family: sans-serif;
}

input {
  font-size: 18px;
  padding: 5px;
  height: 35px;
  width: 350px;
  border: 1px solid blue;
  outline: none;
  border-radius: 5px;
  color: blue;
/*   border-bottom: none; */
}
datalist {
  position: absolute;
  background-color: white;
  border: 1px solid blue;
  border-radius: 0 0 5px 5px;
  border-top: none;
  font-family: sans-serif;
  width: 350px;
  padding: 5px;
  max-height: 10rem;
  overflow-y: auto
  
}

option {
  background-color: white;
  padding: 4px;
  color: blue;
  margin-bottom: 1px;
   font-size: 18px;
  cursor: pointer;
}

option:hover,  .active{
  background-color: lightblue;
}
Run Code Online (Sandbox Code Playgroud)
  <fieldset>
    <legend>
      Datalist Form
    </legend>
    <label>Select Browser</label>
    <input  autocomplete="off" role="combobox" list="" id="input" name="browsers" placeholder="Select your fav browser">
  <!-- Its important that you keep list attribute empty to hide the default dropdown icon and the browser's default datalist -->

  <datalist id="browsers" role="listbox">
    <option value="Internet Explorer">Internet Explorer</option>
  <option value="Chrome">Chrome</option>
  <option value="Safari">Safari</option>
    <option value="Microsoft Edge">Microsoft Edge</option>
    <option value="Firefox">Firefox</option><option value="Microsoft Edge">Microsoft Edge</option>
    <option value="Firefox">Firefox</option><option value="Microsoft Edge">Microsoft Edge</option>
    <option value="Firefox">Firefox</option><option value="Microsoft Edge">Microsoft Edge</option>
    <option value="Firefox">Firefox</option><option value="Microsoft Edge">Microsoft Edge</option>
    <option value="Firefox">Firefox</option><option value="Microsoft Edge">Microsoft Edge</option>
    <option value="Firefox">Firefox</option><option value="Microsoft Edge">Microsoft Edge</option>
    <option value="Firefox">Firefox</option><option value="Microsoft Edge">Microsoft Edge</option>
    <option value="Firefox">Firefox</option><option value="Microsoft Edge">Microsoft Edge</option>
    <option value="Firefox">Firefox</option><option value="Microsoft Edge">Microsoft Edge</option>
    <option value="Firefox">Firefox</option>
  </datalist>
<!--     <br>
    <br>
    <label for="pwd"> Password </label>
    <input id="pwd" type="password">
     -->
  </fieldset>
Run Code Online (Sandbox Code Playgroud)

  • “这里是一个说明它如何可能的字面示例”主要只是使用 JavaScript 重新创建选择/下拉行为 - 此时“datalist”和“option”元素可以很容易地成为 span 或 div...您可以看到缺乏本机功能的示例,例如点击外部处理等。 (7认同)
  • 我只是想强调_为什么_其他 100 票答案声称使用简单或本机解决方案是不可能的。我不认为我不提供自己的解决方案会以任何方式使我的陈述背后的真相无效。这就像在听拳击评论员或教练的批评或建议之前要求他们展示他们的拳击生涯统计数据一样。选择这个解决方案的人应该意识到它的缺点,仅此而已。 (6认同)
  • 有趣的是,有 100 票赞成说这是不可能的答案,而只有 2 票赞成说“这是一个字面上的例子,说明它是如何可能的”。我知道存在细微差别,但仍然如此。 (2认同)