悬停改变颜色

Posted

技术标签:

【中文标题】悬停改变颜色【英文标题】:on hover change color 【发布时间】:2016-10-26 18:43:51 【问题描述】:

只是尝试在 CSS 中练习悬停和下拉菜单。在下面的代码中,我希望每当子下拉 div .li(带有 Home1 文本的绿色 div)悬停在上面时,ul(红色)的背景颜色应该变为蓝色。

非常感谢您的帮助。

html, body 
  margin: 0px;
  height: 100%;
  width: 100%;
  left: 0px;
  top: 0px;
  background-color: rgba(0,0,0,1);
  padding: 0px;


* 
  box-sizing: border-box;


a 
  color: rgba(0,0,0,1);
  text-decoration: none;
  /* [disabled]background-color: rgba(255,0,0,1); */
  display: block;


li 
  display: block;
  width: 100px;
  background-color: rgba(0,255,0,1);
  border: thin solid rgba(0,0,0,1);
  position: relative;
  margin-right: auto;
  margin-left: auto;
  /* [disabled]left: 0px; */
  /* [disabled]top: 0px; */
  margin-top: 5px;
  /* [disabled]float: left; */
  list-style-type: none;


a:hover 
  color: rgba(255,0,0,1);


.wrapper 
  height: 600px;
  max-width: 960px;
  margin-left: auto;
  left: 0px;
  top: 0px;
  background-color: rgba(204,204,204,1);
  margin-right: auto;
  position: relative;
  padding: 0px;
  margin-top: 0px;


.content 
  position: relative;
  box-sizing: border-box;
  height: 100%;
  max-height: 200px;
  max-width: 600px;
  background-color: #FFF;
  margin-right: auto;
  margin-left: auto;
  margin-top: 0px;
  left: 0px;
  right: 0px;
  font-size: 32px;
  text-align: center;
  border: 3px solid rgba(0,0,0,1);
  border-radius: 15px 15px 0px 0px;
  width: 100%;


.content-small 
  max-width: 100px;
  height: 100%;
  max-height: 50px;
  background-color: rgba(0,255,204,1);
  position: relative;
  margin-right: auto;
  margin-left: auto;
  border: 3px solid rgba(0,0,0,1);
  top: 5px;
  margin-top:10px;


.content-small:hover + .dropdown 
  visibility: visible;    


.dropdown:hover 
  visibility: visible;


ul 
  position: relative;
  background-color: rgba(255,0,0,1);
  max-width: 500px;
  list-style-type: none;
  margin-left: auto;
  margin-right: auto;
  height: auto;
  padding: 0;
  margin-top: 0px;


.dropdown 
  max-width: 500px;
  /* [disabled]max-height: 100px; */
  position: relative;
  margin-right: auto;
  margin-left: auto;
  top: 0px;
  margin-top: 5px;
  visibility: hidden;
  list-style-type: none;
  text-align: center;
  background-color: rgba(153,153,153,1);
<div class="wrapper">
  <div class="content">
    <div class="content-small">
      Home
    </div>
    <div class="dropdown">
      <ul>
        <li><a href="">Home1</a></li>
        <li><a href="">Home2</a></li>
      </ul>
    </div>
  </div>
</div>

【问题讨论】:

【参考方案1】:

我认为 javascript 是这里的简单解决方案。

如果要设置父元素的颜色,CSS 没有可用的当前选择器。

$('.dropdown li').mouseenter(function()
  $(this).parent().css('background-color', 'blue');
);

$('.dropdown li').mouseleave(function()
  $(this).parent().css('background-color', 'red');
);
html,body 
    margin: 0px;
    height: 100%;
    width: 100%;
    left: 0px;
    top: 0px;
    background-color: rgba(0,0,0,1);
    padding: 0px;
    


*
    box-sizing:border-box;


a 
	color: rgba(0,0,0,1);
	text-decoration: none;
	/* [disabled]background-color: rgba(255,0,0,1); */
	display: block;


li 
	display: block;
	width: 100px;
	background-color: rgba(0,255,0,1);
	border: thin solid rgba(0,0,0,1);
	position: relative;
	margin-right: auto;
	margin-left: auto;
	/* [disabled]left: 0px; */
	/* [disabled]top: 0px; */
	margin-top: 5px;
	/* [disabled]float: left; */
	list-style-type: none;


a:hover 
	color: rgba(255,0,0,1);





.wrapper 
    height: 600px;
    max-width: 960px;
    margin-left: auto;
    left: 0px;
    top: 0px;
    background-color: rgba(204,204,204,1);
    margin-right: auto;
    position: relative;
    padding: 0px;
    margin-top: 0px;



.content 
    position: relative;
    box-sizing: border-box;
    height: 100%;
    max-height: 200px;
    max-width: 600px;
    background-color: #FFF;
    margin-right: auto;
    margin-left: auto;
    margin-top: 0px;
    left: 0px;
    right: 0px;
    font-size: 32px;
    text-align: center;
    border: 3px solid rgba(0,0,0,1);
    border-radius: 15px 15px 0px 0px;
    width: 100%;


.content-small 
    max-width: 100px;
    height: 100%;
    max-height: 50px;
    background-color: rgba(0,255,204,1);
    position: relative;
    margin-right: auto;
    margin-left: auto;
    border: 3px solid rgba(0,0,0,1);
    top: 5px;
  margin-top:10px;


.content-small:hover + .dropdown
    visibility: visible;    


.dropdown:hover
	visibility: visible;


ul 
	position: relative;
	background-color: rgba(255,0,0,1);
	max-width: 500px;
	list-style-type: none;
	margin-left: auto;
	margin-right: auto;
	height: auto;
	padding: 0;
	margin-top: 0px;


.dropdown 
	max-width: 500px;
	/* [disabled]max-height: 100px; */
	position: relative;
	margin-right: auto;
	margin-left: auto;
	top: 0px;
	margin-top: 5px;
	visibility: hidden;
	list-style-type: none;
	text-align: center;
	background-color: rgba(153,153,153,1);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="wrapper">
	<div class="content">
	  <div class="content-small">
		Home
        </div>
	<div class="dropdown">
      <ul>
<li><a href="">Home1</a></li>
<li><a href="">Home2</a></li>
		</ul>
      </div>
     
</div>

</div>

【讨论】:

我只想坚持CSS @pure_coder 你不能在 CSS 中接近父元素,只能接近子元素和邻居。【参考方案2】:

如果您坚持使用纯 CSS 解决方案,您可以考虑巧妙地设计和定位 :pseudo 元素。

CSS

.dropdown li 
    width: 100%;
    background: transparent;
    border: 0px;
    position: relative;
    z-index: 9;


.dropdown li a 
    max-width: 100px;
    display: block;
    margin: auto;
    background-color: rgba(0,255,0,1);
    border: thin solid rgba(0,0,0,1);
    z-index: 9;
    position: relative;


.dropdown li:hover 
    background: blue;
    z-index: 8;


.dropdown li:hover:before 
    position: absolute;
    content: "";
    background: blue;
    top: -100px;
    bottom: -100px;
    left: 0;
    width: 100%;


.dropdown ul 
    overflow: hidden;

/* Start Added Styles */

.dropdown li 
    width: 100%;
    background: transparent;
    border: 0px;
    position: relative;
    z-index: 9;


.dropdown li a 
    max-width: 100px;
    display: block;
    margin: auto;
    background-color: rgba(0,255,0,1);
    border: thin solid rgba(0,0,0,1);
    z-index: 9;
    position: relative;


.dropdown li:hover 
    background: blue;
    z-index: 8;


.dropdown li:hover:before 
    position: absolute;
    content: "";
    background: blue;
    top: -100px;
    bottom: -100px;
    left: 0;
    width: 100%;


.dropdown ul 
    overflow: hidden;


/* End Added Styles */

html,body 
    margin: 0px;
    height: 100%;
    width: 100%;
    left: 0px;
    top: 0px;
    background-color: rgba(0,0,0,1);
    padding: 0px;
    


*
    box-sizing:border-box;


a 
	color: rgba(0,0,0,1);
	text-decoration: none;
	/* [disabled]background-color: rgba(255,0,0,1); */
	display: block;


li 
	display: block;
	width: 100px;
	background-color: rgba(0,255,0,1);
	border: thin solid rgba(0,0,0,1);
	position: relative;
	margin-right: auto;
	margin-left: auto;
	/* [disabled]left: 0px; */
	/* [disabled]top: 0px; */
	margin-top: 5px;
	/* [disabled]float: left; */
	list-style-type: none;


a:hover 
	color: rgba(255,0,0,1);





.wrapper 
    height: 600px;
    max-width: 960px;
    margin-left: auto;
    left: 0px;
    top: 0px;
    background-color: rgba(204,204,204,1);
    margin-right: auto;
    position: relative;
    padding: 0px;
    margin-top: 0px;



.content 
    position: relative;
    box-sizing: border-box;
    height: 100%;
    max-height: 200px;
    max-width: 600px;
    background-color: #FFF;
    margin-right: auto;
    margin-left: auto;
    margin-top: 0px;
    left: 0px;
    right: 0px;
    font-size: 32px;
    text-align: center;
    border: 3px solid rgba(0,0,0,1);
    border-radius: 15px 15px 0px 0px;
    width: 100%;


.content-small 
    max-width: 100px;
    height: 100%;
    max-height: 50px;
    background-color: rgba(0,255,204,1);
    position: relative;
    margin-right: auto;
    margin-left: auto;
    border: 3px solid rgba(0,0,0,1);
    top: 5px;
  margin-top:10px;


.content-small:hover + .dropdown
    visibility: visible;    


.dropdown:hover
	visibility: visible;


ul 
	position: relative;
	background-color: rgba(255,0,0,1);
	max-width: 500px;
	list-style-type: none;
	margin-left: auto;
	margin-right: auto;
	height: auto;
	padding: 0;
	margin-top: 0px;


.dropdown 
	max-width: 500px;
	/* [disabled]max-height: 100px; */
	position: relative;
	margin-right: auto;
	margin-left: auto;
	top: 0px;
	margin-top: 5px;
	visibility: hidden;
	list-style-type: none;
	text-align: center;
	background-color: rgba(153,153,153,1);
<div class="wrapper">
	<div class="content">
	  <div class="content-small">
		Home
        </div>
	<div class="dropdown">
      <ul>
<li><a href="">Home1</a></li>
<li><a href="">Home2</a></li>
		</ul>
      </div>
     
</div>

</div>

您可能需要相应地调整值以满足您的要求。

免责声明 这有点小技巧,你有责任彻底测试它。此答案的目的是展示您需要达到的程度才能仅使用 CSS 来实现这一目标。

虽然,@randy 说父元素不能通过逻辑 CSS 样式以这种方式接近是正确的。如果您不愿意像上面那样探索打破常规的替代方案,那么 javascript 确实是您唯一的解决方案。

【讨论】:

看起来不错。相反,ul:hover background-color: rgba(0,0,204,1); 我上面的第一个代码怎么样? @pure_coder “我希望每当子下拉 div .li(带有 Home1 文本的绿色 div)悬停在...”,就像你所说的那样,我的印象是您专门指的是列表项的a 元素(“...with Home1 text”)。以您上面提到的方式应用 background-color 更改绝对是最简单的解决方案,但如果这对您有用,那么您应该这样做。 我现在明白你在说什么了。但是在上面的代码中,正如我所提到的,只要鼠标悬停在li 项目(home1,home2)上,ul 应该将颜色从红色变为蓝色,但是当鼠标离开 li 项目和悬停ul 项目(蓝色背景)ul 颜色应该变回红色。上面的代码中不会发生这种情况。 @pure_coder 我希望您在最初的问题中明确表示:) 尽管我理解这一点,但当时您可能认为这很明显。如果您希望ul 以您期望的方式切换回红色,您可以随时从上面的代码中推断并调整它以满足您的需求(如果您有兴趣或有时间)。但您似乎已经接受了 javascript 解决方案——这可能是您的最佳选择,也是最快和最干净的。只有 CSS 的替代品,在这样的范围内总是会受到一点限制。

以上是关于悬停改变颜色的主要内容,如果未能解决你的问题,请参考以下文章

SVG悬停矩形改变颜色

字形图标在悬停时改变颜色加上文本链接

将鼠标悬停在地图上时,如何使地图的区域改变颜色?

text SVG在悬停时改变颜色

(Tailwind - DaisyUI) 有没有办法改变下拉项目的悬停和活动颜色?

在WordPress自定义css中悬停时背景颜色不会改变