Ответ 1
В настоящий момент attr() не поддерживается по умолчанию в любом крупном браузере для любых атрибутов, кроме "контента". Подробнее об этом читайте здесь: https://developer.mozilla.org/en-US/docs/Web/CSS/attr
Мне было интересно, могу ли я объединить функцию calc() с функцией attr() для достижения чего-то вроде следующего:
<div class="content" data-x="1">
This box should have a width of 100px
</div>
<div class="content" data-x="2">
This box should have a width of 200px
</div>
<div class="content" data-x="3">
This box should have a width of 300px
</div>
CSS
.content{
//Fallback. If no calc is supported, just leave it at 100px
width: 100px;
}
.content[data-x]{
// Multiply the width of the element by the factor of data-x
width: calc(100px * attr(data-x));
}
Какая сделка?
В настоящий момент attr() не поддерживается по умолчанию в любом крупном браузере для любых атрибутов, кроме "контента". Подробнее об этом читайте здесь: https://developer.mozilla.org/en-US/docs/Web/CSS/attr
Похоже, что существует способ с помощью var
s
.content{
--x: 1;
width: calc(100px * var(--x));
background: #f00;
}
[data-x="1"] { --x: 1; }
[data-x="2"] { --x: 2; }
[data-x="3"] { --x: 3; }
/*doesn't look like this works unfortunately
[data-x] { --x: attr(data-x); }
seems to set all the widths to some really large number*/
Прокомментированный раздел был бы идеальным, и это может быть той же причиной, по которой ваша идея не сработала, но похоже, что css не выполняет приятное автоматическое кастинг, с которым вы могли бы работать в javascript ('2' * 3 //=6
). attr()
возвращает строку, а не число, и это можно увидеть, добавив .content:after { content:var(--x) }
; ничего не печатается, --x - число, content
принимает строки.
Если есть какая-то функция css, которую я делаю, я чувствую, что это будет ключом к этой проблеме.
В настоящий момент функция attr() не работает в Chrome.
Почти так же приятно использовать переменные CSS:
<!DOCTYPE html>
<html>
<head>
<style>
:root {
--module-size: 100px;
--data-x:1; /* Default value */
}
.content{
width: calc(var(--module-size) * var(--data-x));
border: 1px solid;
}
</style>
</head>
<body>
<div class="content" style="--data-x:1">
This box should have a width of 100px
</div>
<div class="content" style="--data-x:2">
This box should have a width of 200px
</div>
<div class="content" style="--data-x:3">
This box should have a width of 300px
</div>
</body>
</html>