连续CSS类的样式不同

时间:2019-04-16 13:53:26

标签: javascript html css

我正在尝试为具有相同CSS类的div具有不同的CSS样式,而对于同一类的单个div具有不同的CSS样式。

如果解释令人困惑,这就是我要实现的目标。

.row {
  display: flex;
  margin: 20px;
}

.number {
  width: 32px;
  height: 32px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.number.bg {
  background-color: #e24381;
  color: #ffffff;
  border-radius: 24px 0 0 24px;
}

.number.bg ~ .number.bg {
  border-radius: 0 24px 24px 0;
}
<div class="row">
  <div class="number">1</div>
  <div class="number bg">2</div>
  <div class="number bg">3</div>
  <div class="number bg">4</div>
  <div class="number">5</div>
  <div class="number">6</div>
  <div class="number bg">7</div>
</div>

这应该是输出:

Output

可以仅通过 CSS 完成此操作,还是也需要 JavaScript

3 个答案:

答案 0 :(得分:4)

对于普通的CSS解决方案,您可以使用 pseudo元素为您完成此操作:

  • border-radius: 25px设置为bg元素,

  • 使用绝对定位在 且堆积在bg元素后面的伪元素来填充连续bg元素中的边界空白,并使用负边距进行移位

请参见下面的演示

.row {
  display: flex;
  margin: 20px;
}

.number {
  width: 32px;
  height: 32px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.number.bg {
  background-color: #e24381;
  color: #ffffff;
  border-radius: 25px;
  position: relative;
}

.number.bg+.bg:before {
  content: '';
  display: block;
  background-color: #e24381;
  margin-left: -50%;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
  position: absolute;
}
<div class="row">
  <div class="number">1</div>
  <div class="number bg">2</div>
  <div class="number bg">3</div>
  <div class="number bg">4</div>
  <div class="number">5</div>
  <div class="number">6</div>
  <div class="number bg">7</div>
</div>

答案 1 :(得分:3)

这是一个使用一些伪元素但没有JS的想法:

.row {
  display: flex;
  margin: 20px;
  position:relative;
  z-index:0;
}

.number {
  width: 32px;
  height: 32px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.number.bg {
  background-color: #e24381;
  color: #ffffff;
  border-radius: 24px;
  position:relative;
}

.bg +.bg:before {
  content:"";
  position:absolute;
  z-index:-1;
  background:inherit;
  top:0;
  bottom:0;
  left:-50%;
  right:50%;
}

body {
  background:pink;
}
<div class="row">
  <div class="number">1</div>
  <div class="number bg">2</div>
  <div class="number bg">3</div>
  <div class="number bg">4</div>
  <div class="number">5</div>
  <div class="number">6</div>
  <div class="number bg">7</div>
</div>

答案 2 :(得分:0)

如果您想使用动态解决方案,则需要使用JavaScript,因为CSS只能识别紧随其后的(SELECT ROW_NUMBER() OVER () AS rownum , newColumnName , decimal_column , nvarchar_column FROM OPENJSON(@JSON_String) WITH ( newColumnName BIGINT '$.id_column', decimal_column DEC(28,8), nvarchar_column NVARCHAR(30) ) )或同级兄弟(+)。 < strong>有关真正智能的纯CSS解决方案,请参见上面的答案。为了性能起见,应优先于此解决方案。

有关可能的JavaScript解决方案,请参见下文。除了像我一样操作类之外,还可以直接使用以下方法调整CSS:

~

number.style.borderRadius = `24px`;
number.style.borderRadius = `24px 0 0 24px`;
number.style.borderRadius = `0 24px 24px 0`;
window.onload = () => {
  [...document.querySelectorAll(".number.bg")].map(number => {
    let next = number.nextElementSibling;
    let prev = number.previousElementSibling;

    if (next !== null) {
      if (next.classList.contains('bg') && !prev.classList.contains('left')) {
        number.classList.add("left");
      }
    }
    if (next == null || !next.classList.contains('bg')) {
        number.classList.add(!prev.classList.contains('bg') ? "round" : "right");
    }
  });
};
.row {
  display: flex;
  margin: 20px;
}

.number {
  width: 32px;
  height: 32px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.number.bg {
  background-color: #e24381;
  color: #ffffff;
  border-radius: 0;
}

.number.bg.round {
  border-radius: 24px;
}

.number.bg.right {
  border-radius: 0 24px 24px 0;
}

.number.bg.left {
  border-radius: 24px 0 0 24px;
}