有没有办法在 HTML5 数据列表选项上应用 CSS 样式?

Posted

技术标签:

【中文标题】有没有办法在 HTML5 数据列表选项上应用 CSS 样式?【英文标题】:Is there a way to apply a CSS style on HTML5 datalist options? 【发布时间】:2012-11-21 12:32:46 【问题描述】:

我想修改数据列表中不同选项列表的显示方式。是否可以在其上应用一些 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>

我试过了

option 
    background: red;

但它似乎不起作用。

【问题讨论】:

Is it possible to style the drop-down suggestions when using html5 datalist?的可能重复 【参考方案1】:

select 元素一样,datalist 元素在样式方面的灵活性很小。如果您的问题是这样,则您无法为任何建议的术语设置样式。

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

【讨论】:

相关:Firefox 供应商特定的 CSS 扩展列表(包括例如占位符,但与 datalist 类似):developer.mozilla.org/en-US/docs/Web/CSS/Reference/… 我希望有一种方法可以一致地改变原生元素的样式,例如数据列表和选择【参考方案2】:

您可以使用 Jquery 创建替代数据列表

$(document).on('dblclick', 'input[list]', function(event)
    event.preventDefault();
        var str = $(this).val();
    $('div[list='+$(this).attr('list')+'] span').each(function(k, obj)
            if($(this).html().toLowerCase().indexOf(str.toLowerCase()) < 0)
                $(this).hide();
            
        )
    $('div[list='+$(this).attr('list')+']').toggle(100);
    $(this).focus();
)

$(document).on('blur', 'input[list]', function(event)
        event.preventDefault();
        var list = $(this).attr('list');
        setTimeout(function()
            $('div[list='+list+']').hide(100);
        , 100);
    )

    $(document).on('click', 'div[list] span', function(event)
        event.preventDefault();
        var list = $(this).parent().attr('list');
        var item = $(this).html();
        $('input[list='+list+']').val(item);
        $('div[list='+list+']').hide(100);
    )

$(document).on('keyup', 'input[list]', function(event)
        event.preventDefault();
        var list = $(this).attr('list');
    var divList =  $('div[list='+$(this).attr('list')+']');
    if(event.which == 27) // esc
        $(divList).hide(200);
        $(this).focus();
    
    else if(event.which == 13) // enter
        if($('div[list='+list+'] span:visible').length == 1)
            var str = $('div[list='+list+'] span:visible').html();
            $('input[list='+list+']').val(str);
            $('div[list='+list+']').hide(100);
        
    
    else if(event.which == 9) // tab
        $('div[list]').hide();
    
    else 
        $('div[list='+list+']').show(100);
        var str  = $(this).val();
        $('div[list='+$(this).attr('list')+'] span').each(function()
          if($(this).html().toLowerCase().indexOf(str.toLowerCase()) < 0)
            $(this).hide(200);
          
          else 
            $(this).show(200);
          
        )
      
    )
* 
  scrollbar-width: thin;
    scrollbar-color: #BBB #EEE;


*::-webkit-scrollbar 
  width: 10px;


*::-webkit-scrollbar-track 
  background: #C0C3C6;


*::-webkit-scrollbar-thumb 
  background-color: #888;
  border-radius: 10px;
  border: 3px solid #C0C3C6;


table 
    width: 400px;
    margin: 0 auto;
    background: #EEE;
    font-family: Arial;
    padding: 10px 30px;
  border-radius: 5px;
  box-shadow: 0 5px 5px -5px #000;
    --border: 1px solid #ABC;

table td 
  padding-bottom: 10px;

table h4 
  text-align: center;
  color: #567;
  border: 1px solid #567;
  border-radius: 3px;
  padding: 15px 0;

input 
    padding: 10px;
    font-size: 1em;
    width: calc(100% - 20px);
    border: var(--border);
    border-radius: 3px;

input[list]:focus 
    outline: none;

input[list] + div[list] 
    display: none;
    position: absolute;
    width: 100%;
    max-height: 164px;
    overflow-y: auto;
    max-width: 330px;
    background: #FFF;
    border: var(--border);
    border-top: none;
  border-radius: 0 0 5px 5px;
  box-shadow: 0 3px 3px -3px #333;
    z-index: 100;

input[list] + div[list] span 
    display: block;
    padding: 7px 5px 7px 20px;
    color: #069;
    text-decoration: none;
    cursor: pointer;

input[list] + div[list] span:not(:last-child) 
  border-bottom: 1px solid #EEE;

input[list] + div[list] span:hover 
    background: rgba(100, 120, 140, .2);


table .instructions 
  font-size: .9em;
  color: #900;

table .instructions b 
  color: #123;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<table >
    <tr>
        <td> <h4>DATALIST STYLING ALTERNATIVE</h4> </td>
    </tr>
    <tr>
        <td>
            <div>Programming languages</div>
            <input type="text" name="language" list="list-language">
            <div list="list-language">
                <span>CSharp</span>
                <span>Delphi</span>
                <span>Flutter</span>
                <span>Java</span>
                <span>Java Script</span>
                <span>PHP</span>
                <span>Python</span>
                <span>Ruby</span>
                <span>SAP</span>
                <span>Visual Basic</span>
            </div>
        </td>
    </tr>
    <tr>
        <td>
            <div>Cities</div>
            <input type="text" name="cities" list="list-cities">
            <div list="list-cities">
                <span>Athens</span>
                <span>Beijing</span>
                <span>Berlin</span>
                <span>Cairo</span>
                <span>Lisbon</span>
        <span>London</span>
        <span>Mexico City</span>
                <span>Moscow</span>
                <span>New York</span>
                <span>Rio de Janeiro</span>
                <span>Rome</span>
                <span>Tokyo</span>
            </div>
        </td>
    </tr>
  <tr>
    <td>
      <div class='instructions'>
        <b>INSTRUCTIONS:</b><hr>
        <p><b>Double click on the input:</b><br>Show/hide the datalist.</p>
        <p><b>Press esc on the input:</b><br>Hides datalist if visible.</p>
        <p><b>Onkeypress in the input:</b><br>Displays the datalist filtering according to the entered string.</p>
        <p><b>On pressing enter:</b><br>Ff there is only 1 element in the datalist, this value will be loaded into the input.</p>
      </div>
    <td>
  </tr>
</table>

【讨论】:

你为什么使用基于表格的布局? 最初的问题是如何应用样式而不是替代方案。【参考方案3】:

编辑: 在查看了其他几个库后,我发现 react-datalist-input 提供了与数据列表交互的最简单方法,包括 react、样式和功能。

您可以通过

访问样式
.datalist-input  

下面是一个简单的代码sn-p:

const DataListWrapper = styled.div`
    display: flex;
    justify-content: center;
    align-items: center;
    margin-top: 6px;

    .datalist-input 
        width: 50%;
        color: black;
    
`;

const SomeComponent = () => 
    return (
        <DataListWrapper>
            <ReactDataList
                forcePoly
                placeholder="Search Something..."
                list="my_list"
                options=options
                onOptionSelected=(e) => foo(e)
            />
        </DataListWrapper>
    );
;

旧答案: (注意:react-datalist 没有得到维护,它的一些依赖项已被弃用)

使用 react 时,您可以使用样式设置选项和数据列表本身

react-datalist

https://www.npmjs.com/package/react-datalist

您可以使用 CSS 或 styled-components 访问这些

.react-datalist  
.react-datalist-option

这是一个使用 styled-components 的简单代码 sn-p:

    const DataListWrapper = styled.div`
          display: flex;
          justify-content: center;
          align-items: center;
          margin-top: 6px;
    
          .datalist-input 
              width: 50%;
              color: black;
          
    `;
    
    const SomeComponent = () => 
        return (
            <>
                <DataListWrapper>
                    <DataListInput
                        placeholder="Search Something..."
                        items=items
                        onSelect=DoSomething
                    />
                </DataListWrapper>
            </>
        );
    ;

【讨论】:

【参考方案4】:

尝试:

input[list]

  background: red;

【讨论】:

在 Firefox 30 中,input[list] 设置文本框的样式,而不是列表的样式。在 IE 11 中,它设置了文本框 列表的样式。 这对改变数据列表的背景颜色不起作用,但可以用于改变输入的背景颜色

以上是关于有没有办法在 HTML5 数据列表选项上应用 CSS 样式?的主要内容,如果未能解决你的问题,请参考以下文章

刷新列表视图数据库

有没有办法获取设备上安装的应用程序列表,它能够共享和接收文本数据

如何删除 HTML5 音频标签中的下载选项?

在任务管理器的应用程序选项卡中获取正在运行的任务列表

解决 CS0006 未能找到元数据文件

有没有办法在 HTML5 视频上使用 DRM?