Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   задать hover для элемента (https://javascript.ru/forum/dom-window/10051-zadat-hover-dlya-ehlementa.html)

Vulkan 17.06.2010 15:14

Зачем такой огромный код для такой задачи? То что предложил Skipp намного оптимальнее.

paveljava5 17.06.2010 16:00

Цитата:

Сообщение от bushstas
функция nohover() перекрасит текст обратно в цвет до наведения

, а если в браузере пользователя отключен ява скрипт??

Skipp 17.06.2010 16:02

paveljava5,
Зачем задавать такой вопрос, если ответ очевиден:)

dpts 27.11.2019 10:40

А у меня обратная задача
 
Собственно сабж - узнать стили элемента, когда он :hover.
То-есть, существует какой-то элемент, допустим
<input id="inp1">
, который чем-то стилизуется, например бутстрапом или еще чем-то неизвестным.

Мне надо js-ом добавлять на страничку, допустим кастомный селект, который внешне будет стилизован как этот инпут с id="inp1".

Стили инпута не :hover-ные считываются getComputedStyle().
Вопрос, где взять стили этого инпута при :hover.

Skipp 27.11.2019 12:05

Вариантов не много, на скорую руку накатал только такой:

<html>
	<head>
		<style>
			body > a {
				color: red;
			}
			
			body > a:hover {
				color: blue !important;
			}
			
			@media (max-width: 991.98px) {
				body > a:hover {
					color: green;
				}
			}
			
			body > a:hover {
				color: yellow;
			}
		</style>
	</head>
	<body>
		<a href="javascript:void(0)">Link</a>
		
		<script>
			window.getPseudoStyles = function(element, pseudo) {
				if(!document.styleSheets) return;
				
				for(var i = document.styleSheets.length - 1; i > -1; i--) {
					var
						rules			= document.styleSheets[i].cssRules ? document.styleSheets[i].cssRules : document.styleSheets[i].rules;
						
					for(var j = rules.length - 1; j > -1; j--) {
						if(rules[j].selectorText) {
							var
								match = rules[j].selectorText.match(new RegExp('^(.+)(' + pseudo + ')$'));
							if(match && match.length === 3 && document.querySelector(match[1]).isEqualNode(element))
								return rules[j].style;
						}
					}
				}
				return;
			}
		
		
			var
				a = document.querySelector('body > a');
			
			alert(getPseudoStyles(a, ':hover').color);
		</script>
	</body>
</html>


Но не работает с медиа, для этого надо дописывать, но получится ещё больший велосипед чем это.
Вообще не представляю задачу при которой потребуется данное решение, обычно подход идёт совсем с другой стороны.

Так же, в данном случаи берётся последний из вариантов применённых стилей с псевдо классом, как делает это браузер, по сути предыдущие не нужны, но есть но, !important и тут он получается игнорируется, по этому дополнительных изменений функции не избежать.

dpts 27.11.2019 12:23

Цитата:

Сообщение от Skipp (Сообщение 516272)
Вариантов не много, на скорую руку накатал только такой:

<html>
	...
</html>


Но не работает с медиа, для этого надо дописывать, но получится ещё больший велосипед чем это.
Вообще не представляю задачу при которой потребуется данное решение, обычно подход идёт совсем с другой стороны.

Так же, в данном случаи берётся последний из вариантов применённых стилей с псевдо классом, как делает это браузер, по сути предыдущие не нужны, но есть но, !important и тут он получается так же игнорируется, по этому дополнительных изменений функции не избежать.

Нене. Не то.
Давайте посмотрим на начальную задачу. там сказано, что стили инпута устанавливаются чем-то не известным например бутстрапом подключенным с cdn-а или любым другим css-фреймворком (или своим css файлом, который лежит не известно где, как называется, и т.д. в нем может и не быть отдельного класса для инпута может и не быть прописан :hover для инпута), то-есть парсить стили или css файлы - не вариант.

Задача - вполне понятная - воткнуть свой кастомный селект в любой html с минимальными затратами на написание css для кастомного селекта, чтобы он при этом не выбивался из общей стилистики html документа, в том числе по поведению.

Например мы пльзуем бутстрап, при наведеннии на инпут бутстрапов css подсвечивает инпут (меняет цвет рамки, добавляет тень и т.д.)

Вот это мне и надо взять, чтобы к кастомному селекту прикрутить.

Skipp 27.11.2019 12:43

Во первых, ваш вопрос:
Цитата:

Сообщение от dpts (Сообщение 516271)
Вопрос, где взять стили этого инпута при :hover.

Во вторых, какая разница откуда подключаются стили и какие фрейморков? Чем они отличаются от кастомных?
В третьих, я больше чем уверен, что вы пошли не той дорогой для решения задачи, почему нельзя просто клонировать элемент, не добавляя какие-то свои стилевые правила?

<html>
	<head>
		<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.0/css/bootstrap.min.css" integrity="sha384-SI27wrMjH3ZZ89r4o+fGIJtnzkAnFs3E4qz9DIYioCQ5l9Rd/7UAa8DHcaL8jkWt" crossorigin="anonymous">
	</head>
	<body>
		<a href="javascript:void(0)">Link</a>
		
		<script>
			window.getPseudoStyles = function(element, pseudo) {
				if(!document.styleSheets) return;
				
				for(var i = document.styleSheets.length - 1; i > -1; i--) {
					var
						rules			= document.styleSheets[i].cssRules ? document.styleSheets[i].cssRules : document.styleSheets[i].rules;
						
					for(var j = rules.length - 1; j > -1; j--) {
						if(rules[j].selectorText) {
							var
								match = rules[j].selectorText.match(new RegExp('(?:^|,)([^,]+)(' + pseudo + ')(?:$|,)'));
							if(match && match.length === 3)
								var
									el = document.querySelector(match[1]);
								if(el && el.isEqualNode(element))
									return rules[j].style;
						}
					}
				}
				return;
			}
		
		
			var
				a = document.querySelector('body > a');
			
			alert(getPseudoStyles(a, ':hover').color);
		</script>
	</body>
</html>

Подправил скрипт, не учёл групповые правила.

dpts 27.11.2019 12:54

Цитата:

Сообщение от Skipp (Сообщение 516278)
Во первых, ваш вопрос:

Во вторых, какая разница откуда подключаются стили и какие фрейморков? Чем они отличаются от кастомных?
В третьих, я больше чем уверен, что вы пошли не той дорогой для решения задачи, почему нельзя просто клонировать элемент, не добавляя какие-то свои стилевые правила?

Подправил скрипт, не учёл групповые правила.

Что клонировать чтобы не добавлять свои стилевые правила, input?
Ну так я и получу клонированный инпут, а мне надо взять от этого инпута стили и прикрутить часть из них к div,
в котором input и кнопка, открывающая список опций, часть к инпуту в диве, часть к кнопке.
(размеры, отступы, стили текста, бэкграунд и бордер и т.д.). через .getComputedStyle() на старте все это берется без вопросов,
Но у "эталонного" инпута могут быть еще и стили прописанные на :hover и/или :focus (изменения стиля бордера, например,) вот их я также хочу прочитать, чтобы это изменение прикрутить к div, а не к input? который получен путем клонирования.

Чот тупанул я. Спасибо буду пробовать.

dpts 28.11.2019 05:35

Uncaught DOMException: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules
at window.getPseudoStyles (http://localhost:73/getPseudoStyles/:14)
at http://localhost:73/getPseudoStyles/:35

Причем Ошибка выдается, если:
1. вообще никаких стилей не подключать
2. если кроме бутстрапа пытаться подключить
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css">
или/и
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700,800&display=swap&subset=cyrillic" rel="stylesheet">

laimas 28.11.2019 09:01

Хром?


Часовой пояс GMT +3, время: 02:17.