我可以在CSS中产生onclick效果吗?


335

我有一个要在点击时更改的图像元素。

<img id="btnLeft">

这有效:

#btnLeft:hover {
    width:70px;
    height:74px;
}

但是我需要的是:

#btnLeft:onclick {
    width:70px;
    height:74px;
}

但是,显然,它不起作用。onclickCSS 可能有行为(即不使用JavaScript)吗?


7
:active在鼠标按下时起作用。根据您要尝试执行的操作,您可以使用CSS4伪类使其工作:target
bfavaretto

2
:target对于Selectors 4来说并不是什么新事物。自Selectors 3以来,该功能已可用,在撰写本文时,它已经是一年的建议。
BoltClock

Answers:


314

最接近的是:active

#btnLeft:active {
    width: 70px;
    height: 74px;
}

但是,这仅在按住鼠标按钮时才适用。应用样式并使之保持 onclick 的唯一方法是使用一些JavaScript。


@ Sparky672,几乎所有内容:caniuse.com/#feat=css-sel2(IE7也支持:active,但未列出,因为它不支持其他某些选择器)
jrajav 2012年

@Kiyura,除了IE 8及更高版本中的某些错误外,我猜得到了所有内容。
Sparky 2012年

13
这个答案已经过时了。有关仅CSS的解决方案,请参见TylerH的答案
Maximillian Laumeister

有一种比TylerH的复选框黑客更简单的纯CSS解决方案。
David Ljung麦迪逊·斯特拉里

348

截至2019年的答案:

仅使用CSS(而不是仅悬停在元素上或使元素处于活动状态,而您没有mouseUp)来模拟实际点击事件的最佳方法(实际上是唯一方法* )是使用复选框。它通过标签属性将a附加到元素上来工作。label<input type="checkbox">for=""

此功能具有广泛的浏览器支持:checked伪类为IE9 +)。

将相同的值应用于<input>的ID属性和随附<label>for=""属性:checked,由于单击标签会选中并取消选中该属性,因此您可以告诉浏览器在单击时使用伪类重新设置标签的样式。“关联” <input type="checkbox">

*您可以通过IE7 +中的:active:focus伪类模拟“选定”事件(例如,对于通常50px较宽的按钮,可以在active:时更改其宽度#btnControl:active { width: 75px; }),但是这些不是真正的“单击”事件。它们在元素被选中的整个过程中都是“活动的”(例如,通过使用Tabbing进行键盘操作),这与真正的点击事件有所不同,后者会触发操作-通常是- mouseUp


复选框黑客的基本演示(您所要求的基本代码结构):

在这里,我将标签放置在标记中输入之后的位置。这样一来,我可以使用相邻的兄弟选择器+键)来仅选择紧接我的#demo复选框的标签。由于:checked伪类适用于该复选框,#demo:checked + label因此仅在选中该复选框时才适用。

演示如何在点击时调整图像大小,这是您要的:

#btnControl {
    display: none;
}

#btnControl:checked + label > img {
    width: 70px;
    height: 74px;
}
<input type="checkbox" id="btnControl"/>
<label class="btn" for="btnControl"><img src="http://placekitten.com/200/140" id="btnLeft" /></label>

话虽这么说,但一些坏消息。由于一次只能将一个标签与一个表单控件相关联,所以这意味着您不能只将一个按钮放在<label></label>标签内并每天调用它。但是,我们可以使用一些CSS使标签的外观和行为与HTML按钮的外观和行为相当接近。

演示模仿按钮单击效果的功能,超出您的要求:

本演示中的大多数CSS只是用于设置label元素的样式。如果您实际上不需要按钮,并且任何旧元素都足够,那么您可以删除此演示中的几乎所有样式,类似于上面的第二个演示。

您还会注意到,其中有一个前缀属性-moz-outline-radius。不久前,Mozilla向Firefox添加了这个很棒的非规范属性,但是不幸的,WebKit的人们决定他们不会添加它。因此,对于那些使用Firefox的人来说,那一行CSS只是一个逐步的增强。


2
太棒了!但是,当单击输入/图像/按钮以外的其他位置时,是否还可以还原更改?我用您的示例创建了一个弹出字段,当访问者单击空白页面时,我希望它消失。谢谢!
mxmehl

1
@mxmehl如果您希望他们单击​​特定的位置,则可以使用另一个相邻的同级元素来完成此操作。但是,如果您希望仅通过单击屏幕上空白处的任何位置来还原它,则可能需要JavaScript事件侦听器。请记住,这是黑客行为,而不是创造“互动”体验的“最佳”方法。这就是JS的用途。如果您仅限于使用CSS,这就是这样做的方法。:-)
TylerH

5
这个解决方案仍然不错,但是当我读到“ 2017年答案”时,我期望的是真的很酷的东西(例如终于获得了广泛浏览器支持的CSS3功能),而不是自2011年以来就出现的宏伟的复选框黑客……有些令人失望。
Christallkeks

3
@Christallkeks如果CSS添加了某些内容(可能不会;交互性超出了CSS的用途),我将更新答案以包含它。就目前的情况而言,“ 2017年答案”标题是要让人们知道该答案是最新的答案,因此乍一看他们不会看待答案在2015年发布的事实,然后转到“哦,我想知道是否存在新功能”。
TylerH '17

1
@MuhammadSaqib是的,它应该可以在支持的任何移动浏览器上使用:checked
TylerH

78

您可以使用伪类:target模仿点击事件,让我举个例子。

#something {
  display: none;
}

#something:target {
  display: block;
}
<a href="#something">Show</a>
<div id="something">Bingo!</div>

外观如下:http : //jsfiddle.net/TYhnb/

需要注意的一点是,这仅限于超链接,因此,如果您需要在除链接之外的其他超链接上使用,例如按钮,则可能需要对其稍加修改,例如将超链接样式化为按钮。


8
我们如何扭转这种局面?
Ansyori 2013年

我以为您无法定位未显示的内容。
哈兹尔

38

如果您给元素一个,tabindex则可以使用:focus伪类来模拟点击。

的HTML

<img id="btnLeft" tabindex="0" src="http://placehold.it/250x100" />

的CSS

#btnLeft:focus{
    width:70px;
    height:74px;
}

http://jsfiddle.net/NaTj5/


2
这相当合理!当您使用tabindex=-1该项目时,它仍然可以聚焦,但只能通过鼠标而不是键盘来聚焦,在这种情况下效果更好。您也可以使用outline:0样式在聚焦时删除蓝色边框
Stefan Paul Noack

35

编辑:在OP澄清他想要什么之前回答。以下是类似于Javascript onclick的onclick,而不是:active伪类。

这只能通过Javascript或Checkbox Hack来实现

复选框hack本质上是让您单击标签,然后“选中”复选框,从而使您可以根据需要设置标签的样式。

演示


1
您还可以将输入内容包含在标签内,这样就不必使用id属性将它们绑定在一起。
堆叠

12

TylerH的回答很不错,我只需要对最后一个按钮版本进行更新即可。

#btnControl {
    display: none;
}

.btn {
    width: 60px;
    height: 30px;
    background: silver;
    border-radius: 5px;
    padding: 1px 3px;
    box-shadow: 1px 1px 1px #000;
    display: block;
    text-align: center;
    background-image: linear-gradient(to bottom, #f4f5f5, #dfdddd);
    font-family: arial;
    font-size: 12px;
    line-height:30px;
}

.btn:hover {
    background-image: linear-gradient(to bottom, #c3e3fa, #a5defb);
}

.btn:active {
    margin: 1px 1px 0;
    box-shadow: -1px -1px 1px #000;
    background-image: linear-gradient(to top, #f4f5f5, #dfdddd);
}

#btnControl:checked + label {
    width: 70px;
    height: 74px;
    line-height: 74px;
}
<input type="checkbox" id="btnControl"/>
<label class="btn" for="btnControl">Click me!</label>


不错:积极的风格;我想要的东西,但是在构建它们的外观时有点着急。
TylerH '16

9

一个纯正的CSS解决方案又如何呢?

在此处输入图片说明

.page {
  position: fixed;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
  background-color: #121519;
  color: whitesmoke;
}

.controls {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  width: 100%;
}

.arrow {
  cursor: pointer;
  transition: filter 0.3s ease 0.3s;
}

.arrow:active {
  filter: drop-shadow(0 0 0 steelblue);
  transition: filter 0s;
}
<body class="page">
  <div class="controls">
    <div class="arrow">
      <img src="https://i.imgur.com/JGUoNfS.png" />
    </div>
  </div>
</body>

@TylerH响应很好,但是解决方案非常复杂。对于那些只希望使用纯css实现简单的“ onclick”效果而又无需大量额外元素的人,我有一个解决方案。

我们将仅使用CSS过渡。您可能会对动画做类似的事情。

诀窍是更改转换的延迟,以使其在用户单击时持续。

.arrowDownContainer:active,
.arrowDownContainer.clicked {
  filter: drop-shadow(0px 0px 0px steelblue);
  transition: filter 0s;
}

在这里,我还添加了“ clicked”类,以便javascript也可以在需要时提供效果。我使用0px阴影过滤器,因为对于我的情况,它将以这种方式突出显示给定的透明图形蓝色。

我在这里0处有一个过滤器,因此它不会生效。释放效果后,我可以延迟添加过渡,以便提供良好的“单击”效果。

.arrowDownContainer {
  cursor: pointer;
  position: absolute;
  bottom: 0px;
  top: 490px;
  left: 108px;
  height: 222px;
  width: 495px;
  z-index: 3;
  transition: filter 0.3s ease 0.3s;
}

这使我可以进行设置,以便当用户单击按钮时,它突出显示为蓝色,然后逐渐淡出(当然,您也可以使用其他效果)。

尽管从某种意义上说,要突出显示的动画是即时的,所以您受到限制,但它仍然可以提供所需的效果。您可能会将此技巧与动画配合使用以产生更平滑的整体过渡。

在此处输入图片说明

在此处输入图片说明


FWIW的复杂性是建立持续点击效果所必需的。如果您只是想暂时做一些不保留其状态的操作,则此解决方案或其他许多解决方案都可以,我同意绝对不那么复杂。
TylerH

同意 总而言之,您需要最终结果,并且总是很高兴知道所有选择。对于那些肯定的人来说,这是一个很好的线索。大概值得一整篇中级文章来探讨它们,以及它们各自的好处!
布雷登·洛克威尔·纳皮尔

8

好的,这可能是一篇过时的文章...但是首先出现在Google上,并决定对此进行自己的混合。

首先,我将重点介绍

这样做的原因是,对于我显示的示例,它工作得很好,如果有人想要鼠标按下类型的事件,请使用 active

HTML代码:

<button class="mdT mdI1" ></button>
<button class="mdT mdI2" ></button>
<button class="mdT mdI3" ></button>
<button class="mdT mdI4" ></button>

CSS代码:

/* Change Button Size/Border/BG Color And Align To Middle */
    .mdT {
        width:96px;
        height:96px;
        border:0px;
        outline:0;
        vertical-align:middle;
        background-color:#AAAAAA;
    }
    .mdT:focus {
        width:256px;
        height:256px;
    }

/* Change Images Depending On Focus */
    .mdI1       {   background-image:url('http://placehold.it/96x96/AAAAAA&text=img1');     }
    .mdI1:focus {   background-image:url('http://placehold.it/256x256/555555&text=Image+1');   }
    .mdI2       {   background-image:url('http://placehold.it/96x96/AAAAAA&text=img2');     }
    .mdI2:focus {   background-image:url('http://placehold.it/256x256/555555&text=Image+2');   }
    .mdI3       {   background-image:url('http://placehold.it/96x96/AAAAAA&text=img3');     }
    .mdI3:focus {   background-image:url('http://placehold.it/256x256/555555&text=Image+3');   }
    .mdI4       {   background-image:url('http://placehold.it/96x96/AAAAAA&text=img4');     }
    .mdI4:focus {   background-image:url('http://placehold.it/256x256/555555&text=Image+4');   }

JS链接: http //jsfiddle.net/00wwkjux/

那么,为什么要在旧线程中发布此文档呢?好吧,因为此处的示例各不相同,并且我想向社区提供一个可行的示例。

正如线程创建者已经回答的那样,他们只希望效果在单击事件期间持续存在。现在,尽管这并不完全满足该需求,但它已经结束。鼠标按下时,active会进行动画处理,而您需要持续更长时间的任何更改都需要使用javascript完成。


1
对于任何人来说,无论如何都要切换?还是问太多了CSS大声笑?
DardanM 2015年

据我所知,焦点/活动/悬停与CSS差不多。
2015年

7

警告!下面的答案特别简单!:)

其实可以有一个变化是持续存在(如块/弹出窗口,出现和点击后撑可见)与尽管这里有很多(否则是正确的)答案,但 CSS(并且不使用复选框hack))因为您只需要在悬停时保持不变。

因此,请看一下Bojangles和TylerH的答案(如果它们适合您),但是如果您想要一个简单且仅CSS的答案,该答案将在单击后使块保持可见(甚至可以通过后续单击使块消失),然后看到这个解决方案。

我有一个类似的情况,我需要一个带有onClick的弹出式div,在其中我无法添加任何JS或更改标记/ HTML(这是一个真正的CSS解决方案),并且有一些警告是可能的。除非可以更改HTML(添加“ id”),否则您不能使用可以创建漂亮弹出窗口的:target技巧。

在我的情况下,弹出div包含在另一个div中,并且我希望弹出窗口显示在另一个div的顶部,这可以使用:active和:hover的组合来完成:

/* Outer div - needs to be relative so we can use absolute positioning */
.clickToShowInfo {
    position: relative;
}
/* When clicking outer div, make inner div visible */
.clickToShowInfo:active .info { display: block; }
/* And hold by staying visible on hover */
.info:hover {
    display: block;
}
/* General settings for popup */
.info {
    position: absolute;
    top: -5;
    display: none;
    z-index: 100;
    background-color: white;
    width: 200px;
    height: 200px;
}

示例(以及允许单击弹出窗口使其消失的示例)位于:

http://davesource.com/Solutions/20150324.CSS-Only-Click-to-Popup-Div/

我还在下面插入了一个代码片段示例,但是在stackoverflow沙箱中的位置很奇怪,因此我不得不将“单击此处”文本放在innerDiv之后,这通常是不需要的。

/* Outer div - needs to be relative so we can use absolute positioning */
	.clickToShowInfo {
		position: relative;
	}
	/* When clicking outer div, make inner div visible */
	.clickToShowInfo:active .info { visibility: visible; }
	/* And hold by staying visible on hover */
	.info:hover {
		visibility: visible;
	}
	/* General settings for popup */
	.info {
		position: absolute;
		top: -10;
		visibility: hidden;
		z-index: 100;
		background-color: white;
		box-shadow: 5px 5px 2px #aaa;
		border: 1px solid grey;
		padding: 8px;
		width: 220px;
		height: 200px;
	}
	/* If we want clicking on the popup to close, use this */
	.info:active {
		visibility: hidden;	/* Doesn't work because DCEvent is :active as well */
		height: 0px;
		width: 0px;
		left: -1000px;
		top: -1000px;
	}
<p />
<div class="clickToShowInfo">
	<div class="info">
		Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
	</div>
	Click here to show info
</div>
<p />


1
(关于:我们前面的评论讨论)info div在Firefox上无法通过mouseUp看到。尽管在其他浏览器(IE,Edge,Chrome)中,它仍然可以通过mouseUp保持可见状态,但是当鼠标从任何其他浏览器中移出包装时,它不会持久存在,从而阻止了它被视为真正的“ onclick”事件(例如持续变化)。
TylerH

2

我有以下鼠标悬停和鼠标单击代码,它可以正常工作:

//For Mouse Hover
.thumbnail:hover span{ /*CSS for enlarged image*/
    visibility: visible;
    text-align:center;
    vertical-align:middle;
    height: 70%;
    width: 80%;
    top:auto;
    left: 10%;
}

当您单击图像时,此代码将其隐藏:

.thumbnail:active span {
    visibility: hidden;
}

2

我遇到了一个问题,该元素在悬停时必须变为红色,而在悬停时必须单击时变为蓝色。要使用CSS实现此目的,您需要例如:

h1:hover { color: red; } 
h1:active { color: blue; }

<h1>This is a heading.</h1>

我努力了一段时间,直到发现CSS选择器的顺序是我遇到的问题。问题是我切换了位置并且活动的选择器不起作用。然后我发现:hover先走再走:active


-3

你可以使用:target

一般目标

:目标

或按类别名称过滤

.classname:目标

或按ID名称过滤

#idname:target

<style>

#id01:target {      
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      height: 100%;
      display: flex;
      align-items: center;
      justify-content: center;
}

.msg{
    display:none;
}

.close{     
    color:white;        
    width: 2rem;
    height: 2rem;
    background-color: black;
    text-align:center;
    margin:20px;
}

</style>


<a href="#id01">Open</a>

<div id="id01" class="msg">    
    <a href="" class="close">&times;</a>
    <p>Some text. Some text. Some text.</p>
    <p>Some text. Some text. Some text.</p>
</div>

2
:target已经发布了一个显示如何使用的答案,因此不再需要一个。此外,发问者询问如何具有“ onclick”效果,而不是显示/隐藏其他元素。
艾森(Ason)

同样,这比“ onclick”效果更像是“加载”效果。
TylerH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.