Использование Javascript в CSS
Можно ли использовать Javascript внутри CSS?
Если да, можете ли вы привести простой пример?
Ответы
Ответ 1
IE и Firefox содержат способы выполнения JavaScript из CSS. Как отмечает Паоло, одним из способов в IE является метод expression
, но также более темное поведение HTC, в котором отдельный CSS, содержащий ваш script, загружается через CSS. Аналогичный метод для Firefox существует, используя XBL. Эти методы не вызывают JavaScript непосредственно из CSS, но эффект тот же.
HTC с IE
Используйте правило CSS так:
body {
behavior:url(script.htc);
}
и в этом файле script.htc есть что-то вроде:
<PUBLIC:COMPONENT TAGNAME="xss">
<PUBLIC:ATTACH EVENT="ondocumentready" ONEVENT="main()" LITERALCONTENT="false"/>
</PUBLIC:COMPONENT>
<SCRIPT>
function main()
{
alert("HTC script executed.");
}
</SCRIPT>
Файл HTC выполняет функцию main()
в событии ondocumentready
(ссылаясь на готовность документа HTC).
XBL с Firefox
Firefox поддерживает аналогичный взлом XML- script, используя XBL.
Используйте правило CSS так:
body {
-moz-binding: url(script.xml#mycode);
}
и внутри вашего script.xml:
<?xml version="1.0"?>
<bindings xmlns="http://www.mozilla.org/xbl" xmlns:html="http://www.w3.org/1999/xhtml">
<binding id="mycode">
<implementation>
<constructor>
alert("XBL script executed.");
</constructor>
</implementation>
</binding>
</bindings>
Весь код в теге конструктора будет выполнен (хорошая идея обернуть код в разделе CDATA.)
В обоих методах код не выполняется, если селектор CSS не соответствует элементу внутри документа. Используя что-то вроде body
, он будет немедленно выполняться при загрузке страницы.
Ответ 2
Я думаю, что вы можете думать о expressions
или динамических свойствах, которые поддерживаются только IE и позволяют устанавливать свойство результата выражения javascript. Пример:
width:expression(document.body.clientWidth > 800? "800px": "auto" );
Этот код заставляет IE эмулировать свойство max-width
, которое он не поддерживает.
Все рассмотренные вещи, однако, избегают использования этих. Они плохие, плохие.
Ответ 3
Чтобы облегчить потенциальное решение вашей проблемы с учетом предоставленной вами информации, я собираюсь предположить, что вы ищете динамический CSS. Если это так, вы можете использовать серверный язык сценариев для этого. Например (и я очень люблю делать такие вещи):
styles.css.php:
body
{
margin: 0px;
font-family: Verdana;
background-color: #cccccc;
background-image: url('<?php
echo 'images/flag_bg/' . $user_country . '.png';
?>');
}
Это установило бы фоновое изображение на все, что было сохранено в переменной $user_country. Это только один пример динамического CSS; существуют практически неограниченные возможности при объединении кода CSS и серверного кода. Другим случаем было бы сделать что-то вроде разрешения пользователю создать пользовательскую тему, сохранить ее в базе данных, а затем с помощью PHP установить различные свойства, например:
user_theme.css.php:
body
{
background-color: <?php echo $user_theme['BG_COLOR']; ?>;
color: <?php echo $user_theme['COLOR']; ?>;
font-family: <?php echo $user_theme['FONT']; ?>;
}
#panel
{
font-size: <?php echo $user_theme['FONT_SIZE']; ?>;
background-image: <?php echo $user_theme['PANEL_BG']; ?>;
}
Еще раз, однако, это просто пример не в верхней части головы; использование возможности динамического CSS с помощью серверных скриптов может привести к довольно невероятным вещам.
Ответ 4
IE поддерживает выражения CSS:
width:expression(document.body.clientWidth > 955 ? "955px": "100%" );
но они не являются стандартными и не переносимы между браузерами. Избегайте их, если это возможно. Они устарели с IE8.
Ответ 5
Для более точного решения, используя Vue.
var vue = new Vue({
el : "#app",
data: {
styleObject: {
color: 'red',
fontSize: '20px'
},
activeColor: 'blue',
activeColor2: 'green',
fontSize: '30px'
},
methods : {
color: function (color) {
this.activeColor2 = color;
}
},
mounted: function () {
if(1 > 0) {
this.color('gray');
}
}
})
<script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
<ul id="app" :style="styleObject">
<li>test</li>
<li :style="{color: activeColor2, fontSize: fontSize}">test</li>
<li>test</li>
<li>test</li>
<li :style="{color: activeColor, fontSize: fontSize}">test</li>
<li>test</li>
<li>test</li>
</ul>
Ответ 6
Я столкнулся с аналогичной проблемой и разработал два автономных инструмента для выполнения этого:
-
CjsSS.js - это инструмент Vanilla Javascript (так что никаких внешних зависимостей), который поддерживает обратно в IE6.
-
ngCss - это Angular Модуль + Фильтр + Factory (aka: plugin), который поддерживает Angular 1.2 + (вернемся к IE8)
Оба этих набора инструментов позволяют сделать это в теге STYLE или в внешнем файле *.css:
/*<script src='some.js'></script>
<script>
var mainColor = "#cccccc";
</script>*/
BODY {
color: /*{{mainColor}}*/;
}
И это в ваших on-page style
атрибутах:
<div style="color: {{mainColor}}" cjsss="#sourceCSS">blah</div>
или
<div style="color: {{mainColor}}" ng-css="sourceCSS">blah</div>
ПРИМЕЧАНИЕ. В ngCss вы также можете сделать $scope.mainColor
вместо var mainColor
По умолчанию Javascript выполняется в изолированном IFRAME, но поскольку вы создаете собственный CSS и размещаете его на своем собственном сервере (так же, как ваши *.js файлы), то XSS не является проблемой. Но песочница обеспечивает гораздо большую безопасность и спокойствие.
CjsSS.js и ngCss находятся где-то между другими инструментами для выполнения подобных задач:
-
LESS, SASS и Stylus являются только препроцессорами и требуют, чтобы вы изучили новый язык и калечили свой CSS. В основном они расширили CSS новыми языковыми функциями. Все они также ограничены плагинами, разработанными для каждой платформы, в то время как CjsSS.js и ngCss позволяют вам включать любую библиотеку Javascript через <script src='blah.js'></script>
прямо в ваш CSS!
-
AbsurdJS увидел те же проблемы и пошел в противоположном направлении от препроцессоров выше; вместо того, чтобы расширять CSS, AbsurdJS создал библиотеку Javascript для генерации CSS.
CjsSS.js и ngCss заняли среднюю позицию; вы уже знаете CSS, вы уже знаете Javascript, поэтому просто позволяйте им работать вместе простым, интуитивным способом.
Ответ 7
Не в обычном понимании фразы "внутри CSS".
Ответ 8
Это, оказывается, очень интересный вопрос. Если установлено более ста свойств, вы можете подумать, что вам будет разрешено вводить .cickable {onclick: "alert ('hi!');; }
в вашем CSS, и это сработает. Он интуитивно понятен, он имеет такой смысл. Это было бы удивительно полезно при обезвреживании динамически генерируемых массивных пользовательских интерфейсов.
Проблема:
Полиция CSS в своей бесконечной мудрости нарисовала китайскую стену между представлением и поведением. Любой HTML-код, помеченный как-то, который специально не поддерживается CSS. (Полная таблица свойств)
Лучше всего использовать jQuery, который настраивает интерпретируемый движок в фоновом режиме для выполнения того, что вы пытались сделать с CSS в любом случае. См. Эту страницу:
Добавить Javascript Onclick в .css файл.
Удачи.