JavaRush /Курсы /Модуль 1: Web Core /Продвинутые техники

Продвинутые техники

Модуль 1: Web Core
16 уровень , 9 лекция
Открыта

10.1 Вложенные переменные и функции

Для достижения более сложных и динамических стилей можно использовать комбинации CSS-переменных и функций вместе с передовыми техниками, такими как вложенные переменные, динамическое изменение значений через JavaScript и сложные градиенты. Рассмотрим более сложные примеры и техники.

1. Вложенные переменные и функции

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

CSS
    
      :root {
        --base-size: 16px;
        --scale-factor: 1.5;
        --scaled-size: calc(var(--base-size) * var(--scale-factor));
      }

      .container {
        font-size: var(--scaled-size);
        padding: calc(var(--scaled-size) / 2);
        margin: calc(var(--scaled-size) / 4);
      }
    
  

2. Темизация с динамическим изменением оттенка цвета

Создание тем с использованием hsl() и динамическим изменением оттенков через CSS-переменные и JavaScript.

При нажатии на кнопку изменяется значение --base-hue, что динамически меняет цвет фона:

CSS
    
      :root {
        --base-hue: 200;
        --saturation: 70%;
        --lightness: 50%;
        --primary-color: hsl(var(--base-hue), var(--saturation), var(--lightness));
      }

      body {
        background-color: var(--primary-color);
        transition: background-color 0.3s;
      }
    
  
HTML
    
      <button id="change-color">Change Color</button>
    
  
JavaScript
    
// Получаем элемент с id "change-color" 
document.getElementById('change-color').addEventListener('click', () => {
  // Получаем корневой элемент документа (HTML)
  const root = document.documentElement;

  // Генерируем случайное число от 0 до 359 для оттенка цвета в формате HSL
  const newHue = Math.floor(Math.random() * 360);

  // Устанавливаем новое значение для пользовательской переменной CSS --base-hue
  // Эта переменная, скорее всего, используется в стилях для определения основного цвета
  root.style.setProperty('--base-hue', newHue);
});
    
  

10.2 Сложные градиенты

3. Сложные многоуровневые градиенты

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

CSS
    
      :root {
        --color-stop1: hsla(200, 100%, 50%, 0.8);
        --color-stop2: hsla(340, 100%, 50%, 0.8);
        --color-stop3: hsla(120, 100%, 50%, 0.8);
        --color-stop4: hsla(60, 100%, 50%, 0.8);
      }

      .complex-gradient {
        background: linear-gradient(
          45deg,
          var(--color-stop1) 25%,
          var(--color-stop2) 25%,
          var(--color-stop2) 50%,
          var(--color-stop3) 50%,
          var(--color-stop3) 75%,
          var(--color-stop4) 75%
        );
      }
    
  

4. Создание динамических адаптивных компонентов

Использование CSS-переменных и функций для создания адаптивных компонентов, изменяющих свои свойства в зависимости от размера экрана и других факторов.

Адаптивный компонент изменяет свои отступы и цвет фона в зависимости от размера экрана:

HTML
    
      <div class="dynamic-component">Динамический компонент</div>
    
  
CSS
    
      :root {
        --base-padding: 20px;
        --scale-factor: 1.5;
        --dynamic-padding: calc(var(--base-padding) * var(--scale-factor));
      }

      @media (max-width: 600px) {
        :root {
          --scale-factor: 1;
        }
      }

      .dynamic-component {
        padding: var(--dynamic-padding);
        background-color: hsl(calc(100 + var(--scale-factor) * 50), 100%, 50%);
      }
    
  

5. Генерация градиентов с использованием JavaScript и CSS-переменных

Динамическое создание градиентов на основе данных, полученных с помощью JavaScript.

При нажатии на кнопку случайным образом генерируются новые цвета и угол для градиента:

CSS
    
      :root {
        --color1: hsl(200, 100%, 50%);
        --color2: hsl(340, 100%, 50%);
        --angle: 45deg;
      }

      .dynamic-gradient {
        background: linear-gradient(var(--angle), var(--color1), var(--color2));
      }
    
  
HTML
    
      <button id="generate-gradient">Generate Gradient</button>
      <div class="dynamic-gradient">Content</div>
    
  
JavaScript
    

// Получаем элемент с id "generate-gradient" 
document.getElementById('generate-gradient').addEventListener('click', () => {
  // Получаем корневой элемент документа (HTML)
  const root = document.documentElement;

  // Генерируем два случайных цвета в формате HSL с максимальной насыщенностью и средней яркостью
  const newColor1 = `hsl(${Math.floor(Math.random() * 360)}, 100%, 50%)`;
  const newColor2 = `hsl(${Math.floor(Math.random() * 360)}, 100%, 50%)`;

  // Генерируем случайный угол для градиента
  const newAngle = `${Math.floor(Math.random() * 360)}deg`;

  // Устанавливаем новые значения для пользовательских CSS переменных
  root.style.setProperty('--color1', newColor1);
  root.style.setProperty('--color2', newColor2);
  root.style.setProperty('--angle', newAngle);
});

    
  

10.3 Использование CSS-переменных для динамических тем

Пример 1: Динамическая смена темы с помощью CSS-переменных и JavaScript

Создадим динамическую систему тем, где CSS-переменные будут изменяться в зависимости от выбранной темы:

CSS
    
      :root {
        --background-color: #ffffff;
        --text-color: #000000;
        --primary-color: #3498db;
        --secondary-color: #2ecc71;
      }

      body {
        background-color: var(--background-color);
        color: var(--text-color);
        transition: background-color 0.3s, color 0.3s;
      }

      .container {
        padding: 20px;
      }

      button {
        background-color: var(--primary-color);
        color: white;
        border: none;
        padding: 10px 20px;
        cursor: pointer;
        transition: background-color 0.3s;
      }

      button:hover {
        background-color: var(--secondary-color);
      }

      .content {
        margin-top: 20px;
      }
    
  
HTML
    
      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Динамическая смена темы</title>
          <link rel="stylesheet" href="styles.css">
        </head>
        <body>
          <div class="container">
            <button onclick="switchTheme()">Сменить тему</button>
            <div class="content">
              <h1>Заголовок</h1>
              <p>Пример текста для динамической смены темы.</p>
            </div>
          </div>
          <script src="script.js"></script>
        </body>
      </html>
    
  
JavaScript
    
     // Определяем объект тем оформления
const themes = {
  light: {
    // Цвета для светлой темы
    '--background-color': '#ffffff',  // Цвет фона
    '--text-color': '#000000',        // Цвет текста
    '--primary-color': '#3498db',      // Основной цвет
    '--secondary-color': '#2ecc71'    // Дополнительный цвет
  },
  dark: {
    // Цвета для темной темы
    '--background-color': '#2c3e50',  // Цвет фона
    '--text-color': '#ecf0f1',        // Цвет текста
    '--primary-color': '#e74c3c',      // Основной цвет
    '--secondary-color': '#8e44ad'    // Дополнительный цвет
  }
};

// Текущая выбранная тема
let currentTheme = 'light';

// Функция для переключения темы
function switchTheme() {
  // Инвертируем значение currentTheme (светлая -> темная, темная -> светлая)
  currentTheme = currentTheme === 'light' ? 'dark' : 'light';

  // Получаем объект с цветами для текущей темы
  const theme = themes[currentTheme];

  // Перебираем все пары ключ-значение в объекте темы
  for (let [variable, value] of Object.entries(theme)) {
    // Устанавливаем значение CSS-переменной на соответствующее значение из темы
    document.documentElement.style.setProperty(variable, value);
  }
}
    
  

Пример 2: Адаптивный дизайн с использованием calc(), min(), max() и clamp() для размеров шрифтов и отступов

Создадим адаптивный макет с гибкими размерами шрифтов и отступами, которые изменяются в зависимости от ширины окна просмотра:

CSS
    
      :root {
        --base-font-size: 16px;
        --base-padding: 10px;
        --min-font-size: 14px;
        --max-font-size: 24px;
        --preferred-font-size: 2vw;
        --min-padding: 8px;
        --max-padding: 20px;
        --preferred-padding: 1.5vw;
      }

      body {
        font-size: clamp(var(--min-font-size), var(--preferred-font-size), var(--max-font-size));
        padding: clamp(var(--min-padding), var(--preferred-padding), var(--max-padding));
        transition: font-size 0.3s, padding 0.3s;
      }

      .responsive-container {
        margin: 0 auto;
        max-width: 800px;
        padding: calc(var(--base-padding) * 2);
        text-align: center;
      }

      h1 {
        font-size: clamp(calc(var(--base-font-size) * 1.5), 3vw, 36px);
      }

      p {
        font-size: clamp(var(--base-font-size), 2vw, 24px);
      }
    
  
HTML
    
      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Адаптивный дизайн с динамическими размерами</title>
          <link rel="stylesheet" href="styles.css">
        </head>
        <body>
          <div class="responsive-container">
            <h1>Адаптивный заголовок</h1>
            <p>Этот текст адаптируется к размеру окна просмотра, изменяя размеры шрифта и отступы.</p>
          </div>
        </body>
      </html>
    
  
1
Задача
Модуль 1: Web Core, 16 уровень, 9 лекция
Недоступна
Динамические стили calc()
Динамические стили calc()
1
Задача
Модуль 1: Web Core, 16 уровень, 9 лекция
Недоступна
Смена темы hsl и JS
Смена темы hsl и JS
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анастасия Уровень 27
28 июля 2025
Сложно воспринимать примеры с JS такие, без его знания =( Пытаешься разобраться, но прям ппц сложно, особеннро с переменными в теме, где темная и светлая тема. Так же в задачах сложно из-за того, что нет точных размеров приходится на обум размеры самим подбирать. + не понятно, почемсу вторая задача medium, если прихолдится дополнительно копаться, т.к. там использование JS + с цветам приходится копать, потому что там только одну переменную нужно изменять.... А в примерах задейственно 3 переменные... Или я торможу или лыжи не едут....
Vadim Makarenko Уровень 42
30 июня 2025
По второй задаче: обратите внимание, что хотя в условии задачи причиной изменения цвета называется нажатие на кнопку, правильное решение задачи не предполагает добавление таковой в код HTML. Достаточно щелчка в любом месте контейнера.
No Name Уровень 36
1 июня 2025
+ лекция в копилке
Roman Уровень 2
9 мая 2025
JS Пропустил вернусь позже... Капец
Anonymous #3491376 Уровень 27
11 февраля 2025
Тяжеловато пытаться что-то с джавой сделать когда особо не понимаешь что делаешь 😄