单击后如何更改 li 元素的背景?

Posted

技术标签:

【中文标题】单击后如何更改 li 元素的背景?【英文标题】:How can I change the background of my li element upon clicking it? 【发布时间】:2020-05-18 14:31:02 【问题描述】:

我看到了这个帖子:html <ul> | Change particular <li> color onclick and other <li> in the same <ul> to default color

它看起来像我要找的东西;但我对如何在 Rails 应用程序(也使用 react/redux)中做同样的事情感到有点困惑。在我迄今为止工作过的 Rails 应用程序中,我还没有在其中看到任何 jquery,所以我不确定在哪里/如何实现相同的想法。任何帮助表示赞赏!

我考虑过为 li 元素使用onClick 事件,然后创建一个函数来向单击的元素添加一个类/从所有其他 li 元素中删除该类,但我不确定这是否开启正确的轨道。

// 这是我渲染 ul 元素的组件

import React from 'react';
import TrackIndexItem from './track_index_item';

const TrackDetail = ( tracks ) => (
  <ul>
     tracks.map(track => <TrackIndexItem key= track.id  track=track />)  
  </ul>
);

export default TrackDetail;

// 这是我渲染 li 元素的组件

import React from 'react';

const TrackIndexItem = ( track ) => ( 
  <li>
    <div className="track-info">
      <i className="music-note-icon"></i>
      <div className="track-text">
        <p>track.title</p> 
        <p>track.artist • track.album</p>
      </div>
    </div>
  </li>
);

export default TrackIndexItem;

// 这是我的 li 元素的 CSS:

li 
        display: flex;
        flex-direction: row;
        padding: 0 20px;

        .track-info 
          display: flex;
          flex-direction: column;
          position: relative;

          .music-note-icon 
            position: absolute;
            content: image_url('music-note-icon.png');
            width: 10px;
            height: 15px;
            top: 20px;
          

          .track-text 
            margin-left: 25px;

            p 
              font-family: 'ProximaNova-Regular';
            

            p:first-of-type 
              font-size: 18px;
              color: $white;
            

            p:last-of-type 
              font-size: 16px;
              color: $gray;
              margin-top: -15px;
            
          
        
      

【问题讨论】:

我会使用.addClass().removeClass()。例如,如果该类被称为“单击”,您可以将其从任何拥有它的 li 元素中删除,然后将其添加到被单击的元素中。 啊,好吧,我也是这么想的。将它们放入我使用 li 标签的 onClick 事件调用的函数中是否是个好主意? 你可以这样做。我认为只需将其包含在 Click 回调的匿名函数中就很容易了。 您也可以在创建&lt;li&gt; 标签时将onClick() 添加到您的JSX。我已将其添加到下面的示例中。 【参考方案1】:

匿名函数示例

$(function() 
  $("li").click(function(e) 
    $(".clicked").removeClass();
    $(this).addClass("clicked");
  );
);
.clicked 
  border: 1px solid #CCC;
  border-radius: 3px;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ol>
  <li>
    <div className="track-info">
      <i className="music-note-icon"></i>
      <div className="track-text">
        <p>track.title</p>
        <p>track.artist • track.album</p>
      </div>
    </div>
  </li>
  <li>
    <div className="track-info">
      <i className="music-note-icon"></i>
      <div className="track-text">
        <p>track.title</p>
        <p>track.artist • track.album</p>
      </div>
    </div>
  </li>
  <li>
    <div className="track-info">
      <i className="music-note-icon"></i>
      <div className="track-text">
        <p>track.title</p>
        <p>track.artist • track.album</p>
      </div>
    </div>
  </li>
</ol>

这专门选择所有clicked 类项,删除该类,然后将其添加到目标元素。

【讨论】:

嗯,有道理;对于匿名函数,我应该把它放在我的应用程序(哪个文件)中?我猜它不应该在 HTML 或 CSS 中。我会将它放在与呈现 li 元素的组件相同的文件中吗? @Karen 在你的 HTML 中,或者如果你有一个要加载的 javascript 文件,那也可以。【参考方案2】:

这是我同时创建的纯 JS 版本。它也可以在 CodePen 上找到:https://codepen.io/edlucas/pen/LYEwjxO

由于您使用的是 React,您可以做一些与代码示例不同的操作,并直接在 JSX 中添加 onClick()。

const TrackIndexItem = ( track ) => ( 
  <li onClick=e => highlight(e)>
    ...
  </li>
);

在这种情况下,您可以将选择器移动到高亮函数中(这些变量将被使用的唯一剩余位置)。

function highlight(e) 
    const list = document.getElementById('trackList');
    const items = list.querySelectorAll('li');

    targetItem = e.target;
    ...

这些函数都可以添加到您的 TrackIndexItem 组件文件中。 removeClass()addClass() 足够通用,可以移动到包含帮助程序/实用程序函数的文件并导入到您的 TrackIndexItem 文件中,如果您愿意的话。

工作代码sn-p:

// Using pure JS, no jQuery
const list = document.getElementById('trackList');
const items = list.querySelectorAll('li');

items.forEach((item) => 
	item.onclick = (e) => highlight(e);
);

function highlight(e) 
	targetItem = e.target;
	
	// Remove the class from all items
	items.forEach((item) => 
		removeClass(item, 'active');
	);
	
	// Add the class to the "clicked" item
	addClass(targetItem, 'active');


function removeClass(item, classVal) 
	classList = item.className.split(' ');
	item.className = classList.filter(item => item !== classVal).join(' ');


function addClass(item, classVal) 
	classList = item.className.split(' ');
	
	// Only add the class if it's not in the list
	if (!classList.includes(classVal)) 
		classList.push(classVal);
	
	item.className = classList.join(' ');
li 
	width: 100px;
	padding: 5px;
	margin-bottom: 5px;


li.bordered 
	border: 1px solid green;


li.active 
	background-color: yellow;
<html>
	<body>
		<ul id="trackList">
			<li class="bordered test">Test 1</li>
			<li class="bordered">Test 2</li>
			<li class="bordered">Test 3</li>
		</ul>
	</body>
</html>

【讨论】:

啊,谢谢你的澄清!我试试看! 我还没有尝试过,但我会尽快通知您/接受答案!被其他几个错误卡住了啊哈

以上是关于单击后如何更改 li 元素的背景?的主要内容,如果未能解决你的问题,请参考以下文章

如何在按钮单击时更改地图元素的高度?

Selenium webdriver在页面更改后获取元素

jQuery:单击链接后向li元素添加类,并取消选择所有其他类

将鼠标悬停在 li 上时如何更改所有字体颜色

css 背景图像的简单CSS旋转。可用于元素状态更改(打开,单击,悬停等)

单击 Mapbox 中的地图标记后更改其他 HTML 元素?