CSS'de onclick etkisi yapabilir miyim?


335

Tıklamada değiştirmek istediğim bir resim öğem var.

<img id="btnLeft">

Bu çalışıyor:

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

Ama ihtiyacım olan şey:

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

Ancak, açıkça işe yaramıyor. onclickCSS'de davranışa sahip olmak (yani JavaScript kullanmadan) mümkün müdür ?


7
:activefare kapalıyken çalışır. Ne yapmaya çalıştığınıza bağlı olarak, CSS4 sözde sınıfını kullanarak çalışmasını sağlayabilirsiniz :target.
bfavaretto

2
:targetSeçiciler 4 için yeni değildir. Yazma sırasında zaten bir yıl için bir tavsiye olan Seçiciler 3'ten beri mevcuttur.
BoltClock

Yanıtlar:


314

En yakın alacağınız :active:

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

Ancak bu, stili yalnızca fare düğmesi basılı tutulduğunda uygulanır. Bir stili uygulamanın ve uygulamanızı tek tıklamanın tek yolu biraz JavaScript kullanmaktır.


@ Sparky672, Hemen hemen her şey: caniuse.com/#feat=css-sel2 (IE7 destekliyor: aktif de ama diğer seçicilerin bazılarını desteklemediği için listelenmiyor)
jrajav

@Kiyura, sanırım IE 8 ve üstü bazı hatalar dışında her şey .
Sparky

13
Bu cevap eski. Bunun için yalnızca CSS çözümü için TylerH'nin cevabına bakın .
Maximillian Laumeister

TylerH'nin onay kutusu korsanlığından çok daha kolay bir CSS çözümü var.
David Ljung Madison Stellar

348

2019 itibarıyla cevap:

Yalnızca bir CSS kullanarak gerçek bir tıklama etkinliğini simüle etmenin en iyi yolu (aslında tek yol *) (yalnızca bir öğenin üzerine gelmek veya bir öğeyi aktif hale getirmek değil, mouseUp'ın olmadığı yerlerde ) onay kutusu kesmek kullanmaktır. Etiketin özelliği aracılığıyla labelbir <input type="checkbox">öğeye a ekleyerek çalışır for="".

Bu özellik geniş tarayıcı desteğine sahiptir ( :checkedsözde sınıf IE9 + 'dır).

Bir aynı değeri uygula <input>'ın kimlik özelliği ve beraberindeki <label>' ın for=""özniteliği ve birlikte tıklamasında etiket yeniden stiline tarayıcı söyleyebilir :checkedsözde sınıfı, aslında sayesinde bir etiket tıklayarak kontrol edeceğini ve işaretini kaldırın "ilişkili" <input type="checkbox">.

* Sen yoluyla bir "seçilmiş" olayı simüle edebilirsiniz :activeveya :focus(normalde var bir düğme için örneğin IE7 + içinde sözde sınıfı 50px, sen ise onun genişliğini değiştirebilirsiniz geniş active: #btnControl:active { width: 75px; }), ancak bu doğru değildir olayları "tıklama". Öğenin seçildiği süre boyunca (örneğin Tab, klavyenizle bing yaparak) "canlı" olurlar; bu, gerçek bir tıklama etkinliğinden biraz farklıdır ve bu da - genellikle - bir eylem başlatır mouseUp.


Onay kutusu kesmek için temel demo (sorduğunuz şey için temel kod yapısı):

Burada, işaretlememdeki girişten hemen sonra etiketi konumlandırdım. Bu, yalnızca onay kutumu hemen takip eden etiketi seçmek için bitişik kardeş seçiciyi ( +anahtar) kullanabilmem için geçerlidir #demo. Yana :checkedsözde sınıfı onay kutusunun için geçerlidir, #demo:checked + labelonay kutusu işaretlendiğinde geçerli olur.

Tıklamadaki bir görüntüyü yeniden boyutlandırma demosu, sorduğunuz şey budur:

#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>

Bununla birlikte , bazı kötü haberler var. Bir etiket aynı anda yalnızca bir form denetimiyle ilişkilendirilebildiğinden , <label></label>etiketlerin içine bir düğmeyi bırakıp bir gün diyemeyeceğiniz anlamına gelir . Ancak, biz olabilir etiket görünmesi ve nasıl bir HTML düğme görünümünü ve çalışma oldukça yakın davranmaya bazı CSS kullanabilirsiniz.

İstediğiniz şeyin üstünde ve ötesinde bir düğme tıklama efektini taklit etmek için demo:

Bu demoda yer alan CSS'nin çoğu yalnızca etiket öğesini biçimlendirmek içindir. Aslında bir düğmeye ihtiyacınız yoksa ve herhangi bir eski öğe yeterli olursa, bu demodaki yukarıdaki tüm demolara benzer neredeyse tüm stilleri kaldırabilirsiniz.

Ayrıca orada önceden eklenmiş bir mülküm olduğunu fark edeceksiniz -moz-outline-radius. Bir süre önce, Mozilla bu muhteşem spesifik olmayan özelliği Firefox'a ekledi, ancak WebKit'teki insanlar maalesef eklemeyeceklerine karar verdiler . Bu yüzden bu CSS hattının Firefox kullanan insanlar için sadece aşamalı bir gelişme olduğunu düşünün.


2
Müthiş! Ancak, girdi / resim / düğme yerine başka bir yeri tıkladığınızda da değişiklikleri geri almanın bir yolu var mı? Örneğinizi bir açılır pencere alanı oluşturmak için kullandım ve ziyaretçiler boş sayfayı tıkladığında kaybolmasını istiyorum. Teşekkürler!
mxmehl

1
@mxmehl Belirli bir noktayı tıklatmalarını istiyorsanız, muhtemelen başka bir bitişik kardeş öğesiyle yapabilirsiniz. Ancak, ekranda boş olan herhangi bir yeri tıklayarak geri dönmesini istiyorsanız, muhtemelen JavaScript olay dinleyicilerine ihtiyacınız olacaktır. Unutmayın, bu bir hack'tir ve "interaktif" bir deneyim yaratmanın "en iyi" yolu değildir; JS bunun için . Yalnızca CSS kullanmakla kısıtlıysanız bunu nasıl yapacağınız açıklanmaktadır. :-)
TylerH

5
Bu çözüm hala güzel, ancak "2017 yanıtı" nı okuduğumda , 2011'den beri var olan büyük eski onay kutusu kesmek değil, gerçekten harika bir şey bekliyordum (nihayet geniş tarayıcı desteği kazandıran bir CSS3 özelliği gibi) ... .
Christallkeks

3
@Christallkeks CSS bir şey eklerse (muhtemelen olmayacak; etkileşim CSS'nin amacının kapsamı dışındadır), yanıtı eklemek için güncelleyeceğim. "2017 yanıtı" başlığı, insanların bu cevabın en güncel cevap olduğunu bilmelerini sağlamaktır, bu yüzden bir bakışta cevabın 2015'te yayınlandığı gerçeğine bakmayacaklar ve "oh , Henüz yeni bir özellik olup olmadığını merak ediyorum ".
TylerH

1
@MuhammadSaqib Evet, destekleyen herhangi bir mobil tarayıcıda çalışmalıdır :checked.
TylerH

78

:targetTıklama etkinliğini taklit etmek için sözde sınıfı kullanabilirsiniz , size bir örnek vereyim.

#something {
  display: none;
}

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

Şöyle görünüyor: http://jsfiddle.net/TYhnb/

Unutulmaması gereken bir şey, bu sadece köprü ile sınırlıdır, bu nedenle bir düğme gibi köprüden başka bir şey kullanmanız gerekiyorsa, bir düğme gibi görünmek için bir köprü biçimlendirme gibi biraz kesmek isteyebilirsiniz.


8
Eylemi nasıl tersine çevirebiliriz?
Ansyori

Görüntülenmeyen bir şeyi hedefleyemeyeceğinizi düşündüm.
Hazior

38

Öğeye bir verirseniz, bir tıklamayı simüle etmek tabindexiçin :focussözde sınıfı kullanabilirsiniz.

HTML

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

CSS

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

http://jsfiddle.net/NaTj5/


2
bu oldukça iyi çalışıyor! tabindex=-1öğeyi kullandığınızda hala odaklanabilir, ancak yalnızca fare ile değil, klavye ile değil, bu durumda daha iyidir. outline:0odaklandığınızda mavi kenarlığı kaldırmak için bir stil de kullanabilirsiniz
Stefan Paul Noack

35

Düzenleme: OP ne istediğini açıklamadan önce cevapladı. Aşağıdaki, :activesözde sınıf değil, javascripts'e benzer bir onclick içindir .

Bu yalnızca Javascript veya Checkbox Hack ile yapılabilir

Onay kutusu kesmek esasen bir etiketi tıklatmanızı sağlar, bu da bir onay kutusunu "kontrol eder" ve etiketi istediğiniz gibi şekillendirmenizi sağlar.

gösteri


1
Ayrıca girdilerinizi etiketin içine dahil edebilirsiniz, böylece idbunları birbirine bağlamak için nitelikleri kullanmak zorunda kalmazsınız .
yığın

12

TylerH gerçekten iyi bir cevap verdi ve ben sadece son düğme versiyonuna bir güncelleme vermek zorunda kaldım.

#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>


Güzel: aktif stiller; ne için gittiğimi, ama onların görünümünü oluştururken biraz koştu.
TylerH

9

Keskin olmayan bir CSS çözümüne ne dersiniz?

resim açıklamasını buraya girin

.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 harika bir yanıtı var ama oldukça karmaşık bir çözüm. Ben sadece bir sürü ekstra eleman olmadan saf css ile basit bir "onclick" etkisi isteyen sizin için bir çözüm var.

Sadece css geçişlerini kullanacağız. Muhtemelen animasyonlara benzer şeyler yapabilirsiniz.

Hile, geçişin gecikmesini, kullanıcı tıkladığında sürecek şekilde değiştirmektir.

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

Burada "tıkladı" sınıfı da eklemek böylece javascript de gerekirse etkisi sağlayabilir. Benim durumum için verilen şeffaf grafik mavisini bu şekilde vurgulayacağından 0px gölge filtresi kullanıyorum.

Burada 0s bir filtre var böylece etkili olmayacak. Efekt bırakıldığında, geçişi gecikmeli olarak ekleyebilirim, böylece hoş bir "tıklanmış" efekt sağlar.

.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;
}

Bu, kullanıcı düğmeyi tıkladığında maviyi vurgulayıp yavaşça sönecek şekilde ayarlamama izin veriyor (elbette başka efektler de kullanabilirsiniz).

Burada vurgulanacak animasyonun anlık olmasıyla sınırlı olsanız da, yine de istenen efekti sağlar. Daha akıcı bir geçiş sağlamak için bu hileyi animasyonla kullanabilirsiniz.

resim açıklamasını buraya girin

resim açıklamasını buraya girin


FWIW, kalıcı bir tıklama efekti oluşturmak için gerekli olan karmaşıklıktır . Sadece geçici olarak durumunu korumayan bir şey yapmak istiyorsanız, bu veya diğer birçok çözüm iyi ve kesinlikle daha az karmaşık kabul ediyorum.
TylerH

Kabul. Sonuçta ihtiyacınız olan her şey ve tüm seçenekleri bilmek her zaman iyidir. Bu kesin olanlar için harika bir konu. Muhtemelen her bir orta makale ve her birinin faydaları üzerinde değer!
Braden Rockwell Napier

8

Tamam, bu belki eski bir yazı ... ama ilk google sonuç oldu ve bu konuda kendi karışımı yapmaya karar verdi ..

İLK ODAK KULLANACAK

Bunun nedeni, bir fare aşağı tip olayı istiyorsa aktif olarak kullanmak istediğim örnek için güzel çalışıyor olmasıdır

HTML KODU:

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

CSS KODU:

/* 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 FIDDLE LINK: http://jsfiddle.net/00wwkjux/

Peki neden bu eski bir iş parçacığında gönderiyorum, iyi çünkü burada örnekler değişir ve çalışan bir örnek olan topluluğa bir geri vermeyi düşündüm.

İş parçacığı oluşturucu tarafından zaten yanıtlandığı gibi, efektin yalnızca tıklama etkinliği sırasında sürmesini istiyorlar. Şimdi bu ihtiyaç için tam olmasa da, yakın. fare kapalıyken etkin olarak hareket eder ve en son yapmanız gereken değişikliklerin javascript ile yapılması gerekir.


1
Herkes okuyan için, yine de geçiş yapmak için? Yoksa bu çok css lol soran mı?
DardanM

Bildiğim kadarıyla, odak / aktif / vurgulu css ile elde edebileceğiniz kadar yakın .. Bir seçenek ile süslü bir şey yapmak mümkün olabilir / kod türü seçin .. Ama henüz denemedim / gerekli değil
Kızgın 84

7

Uyarı! Aşağıdaki özellikle basit bir cevap! :)

Sen gerçekten yapabilen bir değişiklik olması devam ederse (örneğin bir blok / pop-up ile bu görünür ve bir tıklama sonra görünür kalır) ile sadece CSS (ve onay kutusu kesmek kullanmadan) sürece, (aksi doğru) birçok burada iddia cevaplar rağmen ne sadece fareyle üzerine gelindiğinde ısrarcılığa ihtiyacın var.

Bu yüzden sizin için çalışıyorsa Bojangles ve TylerH'ın cevaplarına bir göz atın, ancak sadece tıklandıktan sonra bir bloğu görünür tutacak basit bir ve CSS cevabı istiyorsanız (ve hatta blok bir tıklama tıklamasıyla kaybolabilir), bu çözüme bakın.

Ben benzer bir durum vardı, ben herhangi bir JS ekleyemiyor veya biçimlendirme / HTML (gerçekten bir CSS çözümü) değiştiremedim onClick ile bir pop-up div gerekiyordu ve bu bazı uyarılar ile mümkündür. HTML'yi değiştiremezseniz ('id' eklemek için) güzel bir pop-up oluşturabilen: hedef hile'ni kullanamazsınız.

Benim durumumda div div diğer div içinde yer aldı ve pop-up diğer div üstünde görünmesini istedim ve bu bir kombinasyonu kullanılarak yapılabilir: aktif ve: 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;
}

Örnek (yanı sıra, açılır pencerenin kaybolmasını sağlamak için tıklamaya izin veren):

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

Ben de aşağıda bir kod snippet örneği ekledim, ancak stackoverflow sanal alanındaki konumlandırma gariptir, bu yüzden normalde gerekli olmayan innerDiv'den sonra 'buraya tıklayın' metnini koymak zorunda kaldım.

/* 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
(re: daha önce yaptığımız yorum tartışmamız) Bilgi div, Firefox'ta mouseUp'tan sonra görünmez. Diğer tarayıcılarda (IE, Edge, Chrome) mouseUp'ın ötesinde görünür kalmasına rağmen, fare başka bir tarayıcıda kutunun dışına çıkarıldığında kalıcı olmaz, böylece gerçek bir 'onclick' olayı olarak görülmesini önler ( örneğin, kalıcı bir değişiklik).
TylerH

2

Fare vurgulu ve fare tıklaması için aşağıdaki kod var ve çalışıyor:

//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%;
}

ve bu kod resmi tıkladığınızda gizler:

.thumbnail:active span {
    visibility: hidden;
}

2

Fareyle üzerine gelindiğinde KIRMIZI renklendirilmesi ve fareyle üzerine gelindiğinde tıkla üzerine MAVİ olması gereken bir elemanla ilgili bir sorunum vardı. Bunu css ile başarmak için örneğin:

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

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

CSS seçicilerinin sırasının yaşadığım problem olduğunu keşfedinceye kadar bir süre mücadele ettim. Sorun, yerleri değiştirmem ve aktif seçicinin çalışmamasıydı. Sonra :hoverönce ve sonra gitmek için öğrendim :active.


-3

şunları kullanabilirsiniz: hedef

genel hedef için

:hedef

veya sınıf adına göre filtrele

.classname: Hedef

veya kimlik adına göre filtrele

#idname: Hedef

<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
Nasıl kullanılacağını gösteren bir cevap :targetzaten gönderildi, bu yüzden bir daha gerek yok. Ayrıca, soru soran diğer unsurları göstermek / gizlemek yerine nasıl "onclick" efekti elde edeceğinizi sorar.
Ason

Bu da "onclick" etkisinden çok "onload" etkisidir.
TylerH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.