добавление градиентов нескольким элементам в гибкий контейнер - PullRequest
2 голосов
/ 10 мая 2019

Как я могу добавить класс градиента к нескольким элементам вплотную в этом гибком контейнере, учитывая количество элементов? в настоящее время он работает только путем добавления класса к одной конкретной группе «юнитов», что создает отдельные градиенты.

Я бы хотел, чтобы градиент покрывал два или более элемента, сохраняя при этом все элементы гибкими и равными.

     .chart {
        display: flex;
        flex-direction: row;
        justify-content: space-between;
        padding: 0 15px;
        margin-bottom: 50px;
      }
      .dot-black {
        width: 8px;
        height: 8px;
        border-radius: 4px;
        background: black;
      }

      .dot-grey {
        width: 22px;
        height: 22px;
        border-radius: 11px;
        background: grey;
      }

      .dot-green {
        width: 22px;
        height: 22px;
        border-radius: 11px;
        background: green;
      }

        .unit {
          flex: 1;
          display: flex;
          align-items: center;
         }

      .line-black {
      	height: 2px;
      	background: black;
        
      }

      .line-grey {
      	height: 2px;
      	background: grey;
        flex-grow: 1;
      }

      .gradient {
        background: rgb(2,0,36);
        background: linear-gradient(90deg, rgba(2,0,36,1) 0%, rgba(9,9,121,1) 35%, rgba(0,212,255,1) 100%);
       }
    <div class="chart">
      <div class="unit gradient">
        <div class="dot-black"></div>
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
      <div class="unit gradient">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">

        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
    </div>

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Вы можете управлять градиентом на родительском элементе, где вы можете указать желаемый размер фона, чтобы охватить только необходимые элементы:

.chart {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  padding: 0 15px;
  margin-bottom: 50px;
  background:
    linear-gradient(90deg, rgba(2, 0, 36, 1), rgba(9, 9, 121, 1) 35%, rgba(0, 212, 255, 1)) 
    left /* Start from the left */
    / 
    calc(var(--n,0)* 100%/8) 100%  /* we have 8 circles so Nx(width)/8 */
    content-box /* Cover only the content, don't account for padding */
    no-repeat; /* Don' repeat */
}

.dot-black {
  width: 8px;
  height: 8px;
  border-radius: 4px;
  background: black;
}

.dot-grey {
  width: 22px;
  height: 22px;
  border-radius: 11px;
  background: grey;
}

.dot-green {
  width: 22px;
  height: 22px;
  border-radius: 11px;
  background: green;
}

.unit {
  flex: 1;
  display: flex;
  align-items: center;
}

.line-black {
  height: 2px;
  background: black;
}

.line-grey {
  height: 2px;
  background: grey;
  flex-grow: 1;
}
<div class="chart" style="--n:2">
  <div class="unit">
    <div class="dot-black"></div>
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">

    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
</div>

<div class="chart" style="--n:5">
  <div class="unit">
    <div class="dot-black"></div>
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">

    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
</div>

<div class="chart" style="--n:6">
  <div class="unit">
    <div class="dot-black"></div>
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">
    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
  <div class="unit">

    <div class="line-grey"></div>
    <div class="dot-grey"></div>
  </div>
</div>

Если вы заинтересованы, вы можете построить весь макет только с фоном и без HTML-элементов:

.chart {
  margin: 0 15px 5px;
  height:22px;
  background: 
   /* Small dot */
   radial-gradient(circle 4px,black 95%,transparent 100%) left center/8px 8px no-repeat,
   /* horizontal line */
   linear-gradient(grey,grey) center/100% 2px  no-repeat,
   /* big dots */
   radial-gradient(circle 11px at calc(100% - 11px) 50% ,grey 95%,transparent 100%) left/calc(100%/8) 100%,
   /* Our Gradient */
   linear-gradient(90deg, rgba(2, 0, 36, 1), rgba(9, 9, 121, 1) 35%, rgba(0, 212, 255, 1)) left/calc(var(--n, 0)* 100%/8) 100% no-repeat;
}
<div class="chart" ></div>
<div class="chart" style="--n:2"></div>
<div class="chart" style="--n:5"></div>
<div class="chart" style="--n:8"></div>
1 голос
/ 10 мая 2019

Если число точек в этой линии известно и никогда не изменится, вы можете самостоятельно рассчитать цветовые остановки и реализовать их так, чтобы линия образовала один полный градиент.

Однако, если вы хотите что-топримените к чему-либо подобному, я предлагаю использовать Javascript.

Эта функция рассчитает для вас градиенты.Это сложно, но может быть возможно реализовать его в приложении, чтобы оно фактически изменило CSS.Я вручную сделал расчеты для двух единиц:

//background: linear-gradient(90deg, rgba(2,0,36,1) 0%, rgba(9,9,121,1) 35%, rgba(0,212,255,1) 100%);
function gradientProgress(gStart,gEnd,at){
  //gStart and gEnd are [r,g,b,a,%]
  var prog = (at - gStart[4]) / (gEnd[4] - gStart[4]);
  var res = [0,0,0,0,100]
  for(var a = 0;a<4;a++){
    res[a] = Math.round(gStart[a] + (prog * (gEnd[4] - gStart[4])));
  }
  return res;
}
console.log("First one: " + "[2, 0, 36, 1, 0], [9, 9, 121, 1, 70], [" + (gradientProgress([9,9,121,1,35],[0,212,255,1,100],50)).toString() + "]")
.chart {
        display: flex;
        flex-direction: row;
        justify-content: space-between;
        padding: 0 15px;
        margin-bottom: 50px;
      }
      .dot-black {
        width: 8px;
        height: 8px;
        border-radius: 4px;
        background: black;
      }

      .dot-grey {
        width: 22px;
        height: 22px;
        border-radius: 11px;
        background: grey;
      }

      .dot-green {
        width: 22px;
        height: 22px;
        border-radius: 11px;
        background: green;
      }

        .unit {
          flex: 1;
          display: flex;
          align-items: center;
         }

      .line-black {
      	height: 2px;
      	background: black;
        
      }

      .line-grey {
      	height: 2px;
      	background: grey;
        flex-grow: 1;
      }
<div class="chart">
      <div class="unit gradient" style="background: linear-gradient(90deg, rgba(2,0,36,1) 0%, rgba(9,9,121,1) 70%, rgba(24,24,136,16) 100%);">
        <div class="dot-black"></div>
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
      <div class="unit gradient" style="background: linear-gradient(90deg, rgba(24,24,136,16) 0%, rgba(0,212,255,1) 100%);">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">
        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
        <div class="unit">

        <div class="line-grey"></div>
        <div class="dot-grey"></div>
      </div>
    </div>
...