CSS 样式

SpriteJS从v2.22开始支持使用CSS。在HTML页面上可以加载CSS,使用CSS3选择器给SpriteJS元素添加样式。

要支持CSS样式,只要在创建Scene时,将参数useDocumentCSS设置为true。

  1. const scene = new Scene('#css-basic', {
  2. viewport: ['auto', 'auto'],
  3. resolution: [1540, 600],
  4. useDocumentCSS: true,
  5. });

样式 - CSS 样式 - 图1

  1. sprite.circle {
  2. width: 100px;
  3. height: 100px;
  4. --sprite-anchor: 0.5;
  5. border-radius: 50px;
  6. }
  7. sprite.red {
  8. background: red;
  9. --sprite-pos: 300, 300;
  10. }
  11. sprite.blue {
  12. background: blue;
  13. --sprite-pos: 600, 300;
  14. }
  1. const scene = new Scene('#css-basic', {
  2. viewport: ['auto', 'auto'],
  3. resolution: [1540, 600],
  4. useDocumentCSS: true,
  5. });
  6. const layer = scene.layer();
  7. const s1 = new Sprite({
  8. class: 'red circle',
  9. });
  10. const s2 = new Sprite({
  11. class: 'blue circle',
  12. });
  13. layer.append(s1, s2);

注意:由于浏览器同源策略限制,ScriptJS不能读取跨域的css文件,只能是同域下的css文件或者inline css。

SpriteJS支持绝大多数css3选择器,但是不支持伪元素不支持:hover,:atcive,:focus,:link,:visited,:lang等伪类

SpriteJS选择器可以和DOM元素混用,例如:

  1. body,
  2. group {
  3. background-color: blue;
  4. --sprite-pos: 100, 100;
  5. }

上面的代码会将页面body和group的背景色同时设置为蓝色,当然,body会忽略—sprite-pos这个SpriteJS专用的规则。

SpriteJS支持一部分原生CSS属性以及另一部分只特殊的属性,特殊属性以—sprite-开头,目前支持的属性如下:

css属性spritejs属性特殊说明
opacity—spritejs-opacity-
width—spritejs-width—spritejs-width支持rw、rh单位
height—spritejs-height—spritejs-height支持rw、rh单位
background—spritejs-bgcolorbackgroud属性仅识别background-color
background-color—spritejs-bgcolor-
flex-grow—spritejs-flex-grow-
flex-shrink—spritejs-flex-shrink-
flex-basis—spritejs-flex-basis-
flex-order—spritejs-flex-order-
position—spritejs-position-
align-self—spritejs-align-self-
transform—spritejs-transform-
transform-origin—spritejs-transform-origin-
border—spritejs-borderSpriteJS不支持border-left, border-right分开定义不同宽度
box-sizing—spritejs-box-sizing-
display—spritejs-display-
padding—spritejs-padding不能写成—spritejs-padding-left,如果分开写,请直接使用padding-left
margin—spritejs-margin不能写成—spritejs-margin-left,如果分开写,请直接使用margin-left
z-index—spritejs-z-index-
font—spritejs-font-
font-size—spritejs-font-size-
font-family—spritejs-font-family-
font-style—spritejs-font-style-
font-weight—spritejs-font-weight-
font-variant-caps—spritejs-font-variant-
color—spritejs-color-
text-align—spritejs-text-align-
line-height—spritejs-line-height-
line-break—spritejs-line-break-
word-break—spritejs-word-break-
letter-spacing—spritejs-letter-spacing-
text-indent—spritejs-text-indent-
transition--
-—sprite-pos-
-—sprite-size-
-—sprite-border-style-
-—sprite-border-width-
-—sprite-border-color-
-—sprite-d-
-—sprite-clip-
-—sprite-bounding-
-—sprite-gradient格式示例: color vector(0, 0, 70, 70) 0,red 0.5,yellow 1,green

SpriteJS支持CSS Transition,所以我们可以添加CSS过度动画。你可以将鼠标移动到下面的红蓝小圆点上:

样式 - CSS 样式 - 图2

  1. sprite.circle {
  2. width: 100px;
  3. height: 100px;
  4. --sprite-anchor: 0.5;
  5. border-radius: 50px;
  6. --sprite-border: solid 3px green;
  7. }
  8. sprite.red {
  9. background: red;
  10. --sprite-pos: 300, 300;
  11. }
  12. sprite.blue {
  13. background: blue;
  14. --sprite-pos: 600, 300;
  15. }
  16. sprite.orange {
  17. background: orange;
  18. --sprite-pos: 300, 300;
  19. transition: all 0.2s;
  20. }
  21. sprite.cyan {
  22. background: cyan;
  23. --sprite-pos: 600, 300;
  24. transition: all 0.2s;
  25. }
  1. const scene = new Scene('#css-transition', {
  2. viewport: ['auto', 'auto'],
  3. resolution: [1540, 600],
  4. useDocumentCSS: true,
  5. });
  6. const layer = scene.layer();
  7. const s1 = new Sprite({
  8. class: 'red circle',
  9. });
  10. const s2 = new Sprite({
  11. class: 'blue circle',
  12. });
  13. layer.append(s1, s2);
  14. s1.on('mouseenter', () => {
  15. s1.attr('class', 'orange circle');
  16. });
  17. s1.on('mouseleave', () => {
  18. s1.attr('class', 'red circle');
  19. });
  20. window.s1 = s1;
  21. s2.on('mouseenter', () => {
  22. s2.attr('class', 'cyan circle');
  23. });
  24. s2.on('mouseleave', () => {
  25. s2.attr('class', 'blue circle');
  26. });

如果你想要某个css规则只能运用于DOM元素,可以设置一个属性—sprite-ignore: 1

  1. .only-dom {
  2. --sprite-ignore: 1;
  3. }

SpriteJS的CSS样式限制:

由于考虑性能问题,因此SpriteJS只会在初始化的时候自动加载当前页面上的CSS文件,如果你希望在程序执行过程中动态加载的CSS规则也应用到SpriteJS元素,可以手动调用:

  1. // 在动态加载的css完成之后
  2. spritejs.stylesheet.fromDocumentCSS();
  3. scene.children[0].updateStyles();

同样出于性能考虑,SpriteJS应用css样式规则采用的是异步方式,因此给SpriteJS设置class或其他规则,如有导致样式变化,该变化在元素属性上不会立即体现,而是在下一次render时才会体现。

  1. sprite.attr('class', 'myclass');
  2. await layer.prepareRender(); // 经过一次render之后
  3. console.log(sprite.attributes); // sprite新的样式属性才会生效