首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将css选择器分组

如何将css选择器分组
EN

Stack Overflow用户
提问于 2022-08-05 07:00:46
回答 2查看 103关注 0票数 4
代码语言:javascript
复制
:host([aspect-ratio='square']) img {
      aspect-ratio: var(--ratio-square);
    }
    :host([aspect-ratio='landscape']) img {
      aspect-ratio: var(--ratio-landscape);
    }
    :host([aspect-ratio='portrait']) img {
      aspect-ratio: var(--ratio-portrait);
    }
    :host([aspect-ratio='widescreen']) img {
      aspect-ratio: var(--ratio-widescreen);
    }
    :host([aspect-ratio='ultrawide']) img {
      aspect-ratio: var(--ratio-ultrawide);
    }
    :host([aspect-ratio='golden']) img {
      aspect-ratio: var(--ratio-golden);
    }

我怎么才能做到一句话呢?通过减少此代码的重复项

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-05 07:19:45

我不认为你能用一句话就能合理地做到这一点。

您可以使用Sass/Scss简化它:

代码语言:javascript
复制
$ratios: "square", "landscape", "portrait", "widescreen", "ultrawide", "golden";

@each $ratio in $ratios {
    :host([aspect-ratio='#{$ratio}']) img {
      aspect-ratio: var(--ratio-#{$ratio});
    }
}

它生成CSS:

代码语言:javascript
复制
:host([aspect-ratio='square']) img {
    aspect-ratio: var(--ratio-square);
}

:host([aspect-ratio='landscape']) img {
    aspect-ratio: var(--ratio-landscape);
}

:host([aspect-ratio='portrait']) img {
    aspect-ratio: var(--ratio-portrait);
}

:host([aspect-ratio='widescreen']) img {
    aspect-ratio: var(--ratio-widescreen);
}

:host([aspect-ratio='ultrawide']) img {
    aspect-ratio: var(--ratio-ultrawide);
}

:host([aspect-ratio='golden']) img {
    aspect-ratio: var(--ratio-golden);
}
票数 4
EN

Stack Overflow用户

发布于 2022-08-05 08:37:32

在这里我想不出任何CSS的解决方案。基本上,您需要能够读取属性的内容(attr()应该能够这样做),然后使用它组成一个新的CSS变量。最后一个步骤更有问题,我不认为有任何方法可以在CSS中组合字符串并将它们传递给像var()这样的函数。

我本来希望新的@property规则允许我们在这方面做一些事情,但是当我试图将var(--css-var)值引用为失败的syntax时(我必须承认,没有真正的意外)。即使这确实有效,我也不确定attr()也能在那里使用。attr()生成<string>,我认为没有办法将<string>转换为变量名。

因此,我所能想到的唯一解决方案是修改CSS+HTML代码,而不是执行

代码语言:javascript
复制
<my-elem aspect-ratio="square">content</my-elem>

你做了

代码语言:javascript
复制
<my-elem style="--ratio:var(--ratio-square)">content</my-elem>

正如您可以看到的,这是一个更多的字符,但保持相对可读性,然后您的CSS可以成为

代码语言:javascript
复制
:host([style*="--ratio:"]) img { aspect-ratio: var(--ratio) }

代码语言:javascript
复制
class MyElem extends HTMLElement {
  constructor() {
    super();
    const style = document.createElement('style');
    const img = new Image();
    const shadowRoot = this.attachShadow({mode: 'open'});
    shadowRoot.appendChild(style);
    shadowRoot.appendChild(img);

    style.textContent = `
img { width: 150px; border: 1px solid; }
:host([style*="--ratio:"]) img {
  aspect-ratio: var(--ratio);
}    
`;
  }
}
customElements.define("my-elem", MyElem);
代码语言:javascript
复制
:root {
  --ratio-square: 1/1;
  --ratio-landscape: 4/3;
  --ratio-golden: 1/1.618;
}
代码语言:javascript
复制
<my-elem style="--ratio:var(--ratio-square)"></my-elem>
<my-elem style="--ratio:var(--ratio-landscape)"></my-elem>
<my-elem style="--ratio:var(--ratio-golden)"></my-elem>

但是,考虑到您在ShadowDOM中,实际上可以保留该属性,并使用CustomElement的构造函数在构造时设置适当的CSS变量:

代码语言:javascript
复制
class MyElem extends HTMLElement {
  constructor() {
    super();
    const style = document.createElement('style');
    const img = new Image();
    const shadowRoot = this.attachShadow({mode: 'open'});
    shadowRoot.appendChild(style);
    shadowRoot.appendChild(img);
    const ratio = this.getAttribute("aspect-ratio");
    style.textContent = `
img { width: 150px; border: 1px solid; }
:host([aspect-ratio]) img {
  aspect-ratio: var(--ratio-${ratio});
}    
`;
  }
}
customElements.define("my-elem", MyElem);
代码语言:javascript
复制
:root {
  --ratio-square: 1/1;
  --ratio-landscape: 4/3;
  --ratio-golden: 1/1.618;
}
代码语言:javascript
复制
<my-elem aspect-ratio="square"></my-elem>
<my-elem aspect-ratio="landscape"></my-elem>
<my-elem aspect-ratio="golden"></my-elem>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73245855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档