@@ -2,6 +2,10 @@ const scaleValueInput = document.querySelector('.scale__control--value'); // о
22const scaleSmallerBtn = document . querySelector ( '.scale__control--smaller' ) ; // минус
33const scaleBiggerBtn = document . querySelector ( '.scale__control--bigger' ) ; // плюсик
44const previewImage = document . querySelector ( '.img-upload__preview img' ) ; // фотка
5+ const effectSlider = document . querySelector ( '.effect-level__slider' ) ; // слайдер со значениями выбранного фильтра
6+ const effectValueInput = document . querySelector ( '.effect-level__value' ) ; // Уровень эффекта
7+ const effectLevelContainer = document . querySelector ( '.img-upload__effect-level' ) ; // эффект «Оригинал» слайдер и его контейнер
8+ const effectsRadio = document . querySelectorAll ( '.effects__radio' ) ; // все кнопки эффектов
59
610const SCALE_STEP = 25 ; // шаг в 25
711const SCALE_MIN = 25 ; // минимальный процент
@@ -26,3 +30,59 @@ scaleBiggerBtn.addEventListener('click', () => {
2630
2731// по умолчанию значение 100
2832updateScale ( currentScale ) ;
33+
34+ const effects = { // эффекты
35+ 'chrome' : { min : 0 , max : 1 , step : 0.1 , start : 1 , filter : ( value ) => `grayscale(${ value } )` } ,
36+ 'sepia' : { min : 0 , max : 1 , step : 0.1 , start : 1 , filter : ( value ) => `sepia(${ value } )` } ,
37+ 'marvin' : { min : 0 , max : 100 , step : 1 , start : 100 , filter : ( value ) => `invert(${ value } %)` } ,
38+ 'phobos' : { min : 0 , max : 3 , step : 0.1 , start : 3 , filter : ( value ) => `blur(${ value } px)` } ,
39+ 'heat' : { min : 1 , max : 3 , step : 0.1 , start : 3 , filter : ( value ) => `heat(${ value } )` } ,
40+ 'none' : { } // Оригинал
41+ } ;
42+
43+ let currentEffect = 'none' ; // выбранный эффект
44+
45+ function updateEffectSlider ( effect ) {
46+ if ( effect === 'none' ) { // если выбран эффект 'none'
47+ effectLevelContainer . style . display = 'none' ; // скрывается контейнер слайдера
48+ previewImage . style . filter = '' ; // с изображения убирается CSS-фильтр
49+ effectValueInput . value = '' ; // очищается поле ввода значения эффекта
50+ return ;
51+ }
52+
53+ effectLevelContainer . style . display = '' ; // показывается контейнер слайдера
54+
55+ const { min, max, step, start } = effects [ effect ] ; // из объекта effects берутся параметры для выбранного эффекта: min, max, step, start.
56+
57+ if ( effectSlider . noUiSlider ) { // если слайдер уже существует
58+ effectSlider . noUiSlider . updateOptions ( { // обновляются его параметры (диапазон, старт, шаг)
59+ range : { min, max} , start, step
60+ } ) ;
61+ } else {
62+ noUiSlider . create ( effectSlider , { // если слайдер ещё не был создан
63+ range : { min, max} , // создаётся новый слайдер с заданными параметрами
64+ start,
65+ step,
66+ connect : 'lower'
67+ } ) ;
68+
69+ effectSlider . noUiSlider . on ( 'update' , ( values , handle ) => { // вешается обработчик события update
70+ const value = values [ handle ] ; // получает текущее значение слайдера
71+ effectValueInput . value = value ; // записывает его в поле ввода
72+ previewImage . style . filter = effects [ currentEffect ] . filter ( value ) ; // применяет CSS-фильтр к изображению с этим значением.
73+ } ) ;
74+ }
75+
76+ effectSlider . noUiSlider . set ( start ) ; // стартовое значение
77+ }
78+
79+ // переключение эффекта:
80+ effectsRadio . forEach ( ( radio ) => { // проходим по всем кнопкам
81+ radio . addEventListener ( 'change' , ( evt ) => { // если кнопка меняется
82+ currentEffect = evt . target . value ; // то выбранному значению выбираем от нажатой
83+ updateEffectSlider ( currentEffect ) ; // и в функцию передаем значения от выбранного
84+ } ) ;
85+ } ) ;
86+
87+ // выбор по умолчанию:
88+ updateEffectSlider ( 'none' ) ;
0 commit comments