17.06.2010, 15:14
|
|
Профессор
|
|
Регистрация: 25.05.2010
Сообщений: 511
|
|
Зачем такой огромный код для такой задачи? То что предложил Skipp намного оптимальнее.
|
|
17.06.2010, 16:00
|
Новичок на форуме
|
|
Регистрация: 17.06.2010
Сообщений: 8
|
|
Сообщение от bushstas
|
функция nohover() перекрасит текст обратно в цвет до наведения
|
, а если в браузере пользователя отключен ява скрипт??
|
|
17.06.2010, 16:02
|
|
.
|
|
Регистрация: 30.03.2010
Сообщений: 1,813
|
|
paveljava5,
Зачем задавать такой вопрос, если ответ очевиден
__________________
.
|
|
27.11.2019, 10:40
|
Кандидат Javascript-наук
|
|
Регистрация: 12.05.2015
Сообщений: 111
|
|
А у меня обратная задача
Собственно сабж - узнать стили элемента, когда он :hover.
То-есть, существует какой-то элемент, допустим
<input id="inp1">
, который чем-то стилизуется, например бутстрапом или еще чем-то неизвестным.
Мне надо js-ом добавлять на страничку, допустим кастомный селект, который внешне будет стилизован как этот инпут с id="inp1".
Стили инпута не :hover-ные считываются getComputedStyle().
Вопрос, где взять стили этого инпута при :hover.
|
|
27.11.2019, 12:05
|
|
.
|
|
Регистрация: 30.03.2010
Сообщений: 1,813
|
|
Вариантов не много, на скорую руку накатал только такой:
<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 и тут он получается игнорируется, по этому дополнительных изменений функции не избежать.
__________________
.
Последний раз редактировалось Skipp, 27.11.2019 в 12:15.
|
|
27.11.2019, 12:23
|
Кандидат Javascript-наук
|
|
Регистрация: 12.05.2015
Сообщений: 111
|
|
Сообщение от Skipp
|
Вариантов не много, на скорую руку накатал только такой:
<html>
...
</html>
Но не работает с медиа, для этого надо дописывать, но получится ещё больший велосипед чем это.
Вообще не представляю задачу при которой потребуется данное решение, обычно подход идёт совсем с другой стороны.
Так же, в данном случаи берётся последний из вариантов применённых стилей с псевдо классом, как делает это браузер, по сути предыдущие не нужны, но есть но, !important и тут он получается так же игнорируется, по этому дополнительных изменений функции не избежать.
|
Нене. Не то.
Давайте посмотрим на начальную задачу. там сказано, что стили инпута устанавливаются чем-то не известным например бутстрапом подключенным с cdn-а или любым другим css-фреймворком (или своим css файлом, который лежит не известно где, как называется, и т.д. в нем может и не быть отдельного класса для инпута может и не быть прописан :hover для инпута), то-есть парсить стили или css файлы - не вариант.
Задача - вполне понятная - воткнуть свой кастомный селект в любой html с минимальными затратами на написание css для кастомного селекта, чтобы он при этом не выбивался из общей стилистики html документа, в том числе по поведению.
Например мы пльзуем бутстрап, при наведеннии на инпут бутстрапов css подсвечивает инпут (меняет цвет рамки, добавляет тень и т.д.)
Вот это мне и надо взять, чтобы к кастомному селекту прикрутить.
Последний раз редактировалось dpts, 27.11.2019 в 12:26.
|
|
27.11.2019, 12:43
|
|
.
|
|
Регистрация: 30.03.2010
Сообщений: 1,813
|
|
Во первых, ваш вопрос:
Сообщение от dpts
|
Вопрос, где взять стили этого инпута при :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>
Подправил скрипт, не учёл групповые правила.
__________________
.
|
|
27.11.2019, 12:54
|
Кандидат Javascript-наук
|
|
Регистрация: 12.05.2015
Сообщений: 111
|
|
Сообщение от Skipp
|
Во первых, ваш вопрос:
Во вторых, какая разница откуда подключаются стили и какие фрейморков? Чем они отличаются от кастомных?
В третьих, я больше чем уверен, что вы пошли не той дорогой для решения задачи, почему нельзя просто клонировать элемент, не добавляя какие-то свои стилевые правила?
Подправил скрипт, не учёл групповые правила.
|
Что клонировать чтобы не добавлять свои стилевые правила, input?
Ну так я и получу клонированный инпут, а мне надо взять от этого инпута стили и прикрутить часть из них к div,
в котором input и кнопка, открывающая список опций, часть к инпуту в диве, часть к кнопке.
(размеры, отступы, стили текста, бэкграунд и бордер и т.д.). через .getComputedStyle() на старте все это берется без вопросов,
Но у "эталонного" инпута могут быть еще и стили прописанные на :hover и/или :focus (изменения стиля бордера, например,) вот их я также хочу прочитать, чтобы это изменение прикрутить к div, а не к input? который получен путем клонирования.
Чот тупанул я. Спасибо буду пробовать.
Последний раз редактировалось dpts, 28.11.2019 в 08:48.
|
|
28.11.2019, 05:35
|
Кандидат Javascript-наук
|
|
Регистрация: 12.05.2015
Сообщений: 111
|
|
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">
Последний раз редактировалось dpts, 28.11.2019 в 09:14.
|
|
28.11.2019, 09:01
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Хром?
|
|
|
|