Zmiana: najedź na właściwości CSS za pomocą JavaScript

93

Muszę znaleźć sposób na zmianę CSS: właściwości najechania kursorem przy użyciu JavaScript.

Na przykład załóżmy, że mam taki kod HTML:

<table>
  <tr>
    <td>Hover 1</td>
    <td>Hover 2</td>
  </tr>
</table>

I następujący kod CSS:

table td:hover {
background:#ff0000;
}

Chciałbym użyć JavaScript do zmiany właściwości <td> hover na, powiedzmy, background: # 00ff00. wiem, że mogę uzyskać dostęp do właściwości tła stylu za pomocą JavaScript jako:

document.getElementsByTagName("td").style.background="#00ff00";

Ale nie znam odpowiednika JavaScript dla: hover. Jak zmienić te <td>: hover background za pomocą JavaScript?

Twoja pomoc jest bardzo cenna!

sissypants
źródło

Odpowiedzi:

110

Pseudoklasy jak :hovernigdy nie odnoszą się do elementu, ale do każdego elementu, który spełnia warunki reguły arkusza stylów. Musisz edytować regułę arkusza stylów , dołączyć nową regułę lub dodać nowy arkusz stylów zawierający nową :hoverregułę.

var css = 'table td:hover{ background-color: #00ff00 }';
var style = document.createElement('style');

if (style.styleSheet) {
    style.styleSheet.cssText = css;
} else {
    style.appendChild(document.createTextNode(css));
}

document.getElementsByTagName('head')[0].appendChild(style);
kennebec
źródło
1
Jeśli wybierasz tę trasę, ten artykuł może pomóc również w przyszłości.
Achal Dave,
14
: hover jest pseudoklasą , a nie pseudoelementem. Pseudoelementy rozpoczynają się podwójnym dwukropkiem, np. :: after. / nitpick
Benji XVI
1
@Andi Nie, ponieważ stylezmienna w odpowiedzi kennebec jest nowym elementem tworzonym w kodzie i nie wskazuje na istniejący <style>znacznik w kodzie HTML.
Adaline Simonian
3
Dlaczego nie wiadomo, czy nowy styleelement ma już arkusz stylów, czy nie?
GreenAsJade
1
Jak znaleźć i edytować obecną regułę arkusza stylów, aby ją zmienić? Pokazuje to dodanie nowej reguły, ale co, jeśli już istnieje reguła i jest to po prostu zmieniana wartość?
GreenAsJade
44

Nie możesz zmienić ani zmienić rzeczywistego :hoverselektora za pomocą JavaScript. Możesz jednak użyć, mouseenteraby zmienić styl i powrócić mouseleave(dzięki, @Bryan).

Achal Dave
źródło
5
Naprawdę NIE ma sposobu, aby zmienić selektor: hover za pomocą JavaScript?
sissypants
5
Zauważ, że będziesz musiał również związać się mouseleave, aby odwrócić efekty.
1
Używałem tego w poprzednich projektach, a ostatnio wypróbowałem nawet zaakceptowaną odpowiedź, ale ta zawsze przeważa, jeśli chodzi o używanie elementów aktywowanych / aktywnych z kolorowymi przyciskami. Chcę tylko podziękować za opublikowanie tego jako opcji.
Jester
10

Możesz zmienić klasę swojego obiektu i zdefiniować dwie klasy z różnymi właściwościami aktywowania. Na przykład:

.stategood_enabled:hover  { background-color:green}
.stategood_enabled        { background-color:black}
.stategood_disabled:hover { background-color:red}
.stategood_disabled       { background-color:black}

I to znalazłem na: Zmień klasę elementu za pomocą JavaScript

function changeClass(object,oldClass,newClass)
{
    // remove:
    //object.className = object.className.replace( /(?:^|\s)oldClass(?!\S)/g , '' );
    // replace:
    var regExp = new RegExp('(?:^|\\s)' + oldClass + '(?!\\S)', 'g');
    object.className = object.className.replace( regExp , newClass );
    // add
    //object.className += " "+newClass;
}

changeClass(myInput.submit,"stategood_disabled"," stategood_enabled");
isgoed
źródło
Nie możesz w jakiś sposób użyć elementu element.classList, aby ustawić klasę mającą pożądane style po najechaniu?
David Spector
6

Jeśli pasuje do Twojego celu, możesz dodać funkcję hover bez używania css i używania onmouseoverzdarzenia w javascript

Oto fragment kodu

<div id="mydiv">foo</div>

<script>
document.getElementById("mydiv").onmouseover = function() 
{
    this.style.backgroundColor = "blue";
}
</script>
Namit Juneja
źródło
2
Spowoduje to utrwalenie nowego stylu i nie wróci do poprzedniego!
Yahya,
1
@Yahya - Możesz przywrócić ten kolor po wyłączeniu myszy.
Andrei Volgin
6

Przepraszamy, że ta strona jest za późno o 7 lat, ale tutaj jest znacznie prostszy sposób rozwiązania tego problemu (dowolna zmiana stylów najechania kursorem):

HTML:

<button id=Button>Button Title</button>

CSS:

.HoverClass1:hover {color: blue !important; background-color: green !important;}
.HoverClass2:hover {color: red !important; background-color: yellow !important;}

JavaScript:

var Button=document.getElementById('Button');
/* Clear all previous hover classes */
Button.classList.remove('HoverClass1','HoverClass2');
/* Set the desired hover class */
Button.classList.add('HoverClass1');
David Spector
źródło
4

Dość stare pytanie, więc pomyślałem, że dodam bardziej nowoczesną odpowiedź. Teraz, gdy zmienne CSS są szeroko obsługiwane, można ich użyć do osiągnięcia tego bez potrzeby zdarzeń JS lub!important .

Biorąc przykład PO:

<table>
  <tr>
    <td>Hover 1</td>
    <td>Hover 2</td>
  </tr>
</table>

Teraz możemy to zrobić w CSS:

table td:hover {
  // fallback in case we need to support older/non-supported browsers (IE, Opera mini)
  background: #ff0000;
  background: var(--td-background-color);
}

I dodaj stan najechania za pomocą javascript w następujący sposób:

const tds = document.querySelectorAll('td');
tds.forEach((td) => {
  td.style.setProperty('--td-background-color', '#00ff00');
});

Oto działający przykład https://codepen.io/ybentz/pen/RwPoeqb

ybentz
źródło
3

Polecam zastąpić wszystkie :hoverwłaściwości, :activegdy wykryjesz, że urządzenie obsługuje dotyk. Po prostu wywołaj tę funkcję, gdy zrobisz to jakotouch()

   function touch() {
      if ('ontouchstart' in document.documentElement) {
        for (var sheetI = document.styleSheets.length - 1; sheetI >= 0; sheetI--) {
          var sheet = document.styleSheets[sheetI];
          if (sheet.cssRules) {
            for (var ruleI = sheet.cssRules.length - 1; ruleI >= 0; ruleI--) {
              var rule = sheet.cssRules[ruleI];

              if (rule.selectorText) {
                rule.selectorText = rule.selectorText.replace(':hover', ':active');
              }
            }
          }
        }
      }
    }
Shobhit Sharma
źródło
2

Kiedyś miałem taką potrzebę i stworzyłem małą bibliotekę, która obsługuje dokumenty CSS

https://github.com/terotests/css

Dzięki temu możesz stwierdzić

css().bind("TD:hover", {
        "background" : "00ff00"
    });

Korzysta z wyżej wymienionych technik, a także stara się rozwiązać problemy z różnymi przeglądarkami. Jeśli z jakiegoś powodu istnieje stara przeglądarka, taka jak IE9, ograniczy liczbę tagów STYLE, ponieważ starsza przeglądarka IE miała ten dziwny limit liczby tagów STYLE dostępnych na stronie.

Ponadto ogranicza ruch do tagów, aktualizując tagi tylko okresowo. Istnieje również ograniczona obsługa tworzenia klas animacji.

Tero Tolonen
źródło
2

Zadeklaruj zmienną globalną:

var td

Następnie wybierz świnkę guiena, <td>aby ją zdobyć id, jeśli chcesz zmienić je wszystkie

window.onload = function () {
  td = document.getElementsByTagName("td"); 
}

Zrób funkcję być wyzwalany i pętlę do zmiany wszystkich żądanych td„s

function trigger() {
    for(var x = 0; x < td.length; x++) { 
      td[x].className = "yournewclass"; 
    }
}

Przejdź do arkusza CSS:

.yournewclass:hover { background-color: #00ff00; }

I to jest to, dzięki temu możesz sprawić, że wszystkie <td>tagi otrzymają znak background-color: #00ff00;po najechaniu kursorem, zmieniając bezpośrednio ich właściwość css (przełączając się między klasami css).

Gabriel Barberini
źródło
Właśnie zastosowałem ten model na mojej stronie SoloLearn Playrground, sprawdź sam i zobacz, jak to działa: code.sololearn.com/WEtMpJ0mwFAD/#js
Gabriel Barberini
2

W rzeczywistości nie jest to dodawanie CSS do komórki, ale daje ten sam efekt. Zapewniając ten sam wynik, co inne powyżej, ta wersja jest dla mnie nieco bardziej intuicyjna, ale jestem nowicjuszem, więc weź to za to, co warto:

$(".hoverCell").bind('mouseover', function() {
    var old_color = $(this).css("background-color");
    $(this)[0].style.backgroundColor = '#ffff00';

    $(".hoverCell").bind('mouseout', function () {
        $(this)[0].style.backgroundColor = old_color;
    });
});

Wymaga to ustawienia klasy dla każdej komórki, którą chcesz wyróżnić, na „hoverCell”.

elPastor
źródło
1

Możesz utworzyć zmienną CSS, a następnie zmienić ją w JS.

:root {
  --variableName: (variableValue);
}

aby to zmienić w JS, stworzyłem te przydatne małe funkcje:

var cssVarGet = function(name) {
  return getComputedStyle(document.documentElement).getPropertyValue(name);
};

i

var cssVarSet = function(name, val) {
  document.documentElement.style.setProperty(name, val);
};

Możesz utworzyć dowolną liczbę zmiennych CSS, a nie znalazłem żadnych błędów w funkcjach; Potem wszystko, co musisz zrobić, to osadzić go w swoim CSS:

table td:hover {
  background: var(--variableName);
}

A potem bam, rozwiązanie, które wymaga tylko kilku funkcji CSS i 2 funkcji JS!

cs1349459
źródło
0

Możesz używać zdarzeń myszy do sterowania, takich jak najechanie kursorem. Na przykład poniższy kod staje się widoczny po umieszczeniu wskaźnika myszy nad tym elementem.

var foo = document.getElementById("foo");
foo.addEventListener('mouseover',function(){
   foo.style.display="block";
})
foo.addEventListener('mouseleave',function(){
   foo.style.display="none";
})
Onur Altuntas
źródło
-1

Jeśli używasz lekkiego html ux lang, sprawdź tutaj przykład , napisz:

div root
 .onmouseover = ev => {root.style.backgroundColor='red'}
 .onmouseleave = ev => {root.style.backgroundColor='initial'}

Powyższy kod wykonuje metatag css: hover.

baudo2048
źródło