Skip to content

Commit 136a5ef

Browse files
authored
Merge pull request #11 from Julyova/module9-task2
2 parents 6417286 + 25d9935 commit 136a5ef

4 files changed

Lines changed: 169 additions & 1 deletion

File tree

index.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,11 @@ <h2 class="data-error__title">Не удалось загрузить данны
235235
</section>
236236
</template>
237237

238+
<link rel="stylesheet" href="vendor/nouislider/nouislider.css">
239+
<script src="vendor/nouislider/nouislider.min.js"></script>
240+
<script src="vendor/pristine/pristine.min.js"></script>
238241
<script type="module" src="js/main.js"></script>
239242
<script type="module" src="js/functions.js"></script>
240-
<script src="vendor/pristine/pristine.min.js"></script>
241243

242244
</body>
243245

js/effect.js

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
const effectLevelSlider = document.querySelector('.effect-level__slider');
2+
const effectLevelValue = document.querySelector('.effect-level__value');
3+
const effectsRadioList = document.querySelectorAll('.effects__radio');
4+
const imgUploadPreview = document.querySelector('.img-upload__preview img');
5+
const effectLevelContainer = document.querySelector('.img-upload__effect-level');
6+
7+
const EFFECTS = {
8+
none: {
9+
filter: null,
10+
min: 0,
11+
max: 100,
12+
step: 1,
13+
unit: ''
14+
},
15+
chrome: {
16+
filter: 'grayscale',
17+
min: 0,
18+
max: 1,
19+
step: 0.1,
20+
unit: ''
21+
},
22+
sepia: {
23+
filter: 'sepia',
24+
min: 0,
25+
max: 1,
26+
step: 0.1,
27+
unit: ''
28+
},
29+
marvin: {
30+
filter: 'invert',
31+
min: 0,
32+
max: 100,
33+
step: 1,
34+
unit: '%'
35+
},
36+
phobos: {
37+
filter: 'blur',
38+
min: 0,
39+
max: 3,
40+
step: 0.1,
41+
unit: 'px'
42+
},
43+
heat: {
44+
filter: 'brightness',
45+
min: 1,
46+
max: 3,
47+
step: 0.1,
48+
unit: ''
49+
}
50+
};
51+
52+
let currentEffect = 'none';
53+
54+
const updateSliderOptions = (effect) => {
55+
effectLevelSlider.noUiSlider.updateOptions({
56+
range: {
57+
min: effect.min,
58+
max: effect.max
59+
},
60+
start: effect.max,
61+
step: effect.step
62+
});
63+
};
64+
65+
const applyEffect = (value) => {
66+
const effect = EFFECTS[currentEffect];
67+
68+
if (currentEffect === 'none') {
69+
imgUploadPreview.style.filter = '';
70+
effectLevelContainer.classList.add('hidden');
71+
return;
72+
}
73+
74+
effectLevelContainer.classList.remove('hidden');
75+
imgUploadPreview.style.filter = `${effect.filter}(${value}${effect.unit})`;
76+
};
77+
78+
const onSliderUpdate = () => {
79+
const value = effectLevelSlider.noUiSlider.get();
80+
effectLevelValue.value = value;
81+
applyEffect(value);
82+
};
83+
84+
const onEffectChange = (evt) => {
85+
currentEffect = evt.target.value;
86+
updateSliderOptions(EFFECTS[currentEffect]);
87+
applyEffect(EFFECTS[currentEffect].max);
88+
};
89+
90+
const resetEffect = () => {
91+
currentEffect = 'none';
92+
document.querySelector('#effect-none').checked = true;
93+
imgUploadPreview.style.filter = '';
94+
effectLevelContainer.classList.add('hidden');
95+
};
96+
97+
const initEffect = () => {
98+
noUiSlider.create(effectLevelSlider, {
99+
range: {
100+
min: 0,
101+
max: 100
102+
},
103+
start: 100,
104+
step: 1,
105+
connect: 'lower'
106+
});
107+
108+
effectLevelSlider.noUiSlider.on('update', onSliderUpdate);
109+
110+
effectsRadioList.forEach((radio) => {
111+
radio.addEventListener('change', onEffectChange);
112+
});
113+
114+
effectLevelContainer.classList.add('hidden');
115+
};
116+
117+
export { initEffect, resetEffect };

js/form-upload.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import { initScale, resetScale } from './scale.js';
2+
import { initEffect, resetEffect } from './effect.js';
3+
14
const uploadFileInput = document.querySelector('.img-upload__input');
25
const uploadOverlay = document.querySelector('.img-upload__overlay');
36
const uploadForm = document.querySelector('#upload-select-image');
@@ -59,6 +62,8 @@ const closeForm = () => {
5962
document.body.classList.remove('modal-open');
6063
uploadForm.reset();
6164
pristine.reset();
65+
resetScale();
66+
resetEffect();
6267
};
6368

6469
const onUploadFileInputChange = () => {
@@ -86,6 +91,8 @@ const onDocumentKeydown = (evt) => {
8691
};
8792

8893
const initFormUpload = () => {
94+
initScale();
95+
initEffect();
8996
uploadFileInput.addEventListener('change', onUploadFileInputChange);
9097
uploadCancel.addEventListener('click', onUploadCancelClick);
9198
uploadForm.addEventListener('submit', onUploadFormSubmit);

js/scale.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const scaleControlSmaller = document.querySelector('.scale__control--smaller');
2+
const scaleControlBigger = document.querySelector('.scale__control--bigger');
3+
const scaleControlValue = document.querySelector('.scale__control--value');
4+
const imgUploadPreview = document.querySelector('.img-upload__preview img');
5+
6+
const SCALE_STEP = 25;
7+
const SCALE_MIN = 25;
8+
const SCALE_MAX = 100;
9+
const SCALE_DEFAULT = 100;
10+
11+
let currentScale = SCALE_DEFAULT;
12+
13+
const updateScale = () => {
14+
scaleControlValue.value = `${currentScale}%`;
15+
imgUploadPreview.style.transform = `scale(${currentScale / 100})`;
16+
};
17+
18+
const onScaleSmallerClick = () => {
19+
if (currentScale > SCALE_MIN) {
20+
currentScale -= SCALE_STEP;
21+
updateScale();
22+
}
23+
};
24+
25+
const onScaleBiggerClick = () => {
26+
if (currentScale < SCALE_MAX) {
27+
currentScale += SCALE_STEP;
28+
updateScale();
29+
}
30+
};
31+
32+
const resetScale = () => {
33+
currentScale = SCALE_DEFAULT;
34+
updateScale();
35+
};
36+
37+
const initScale = () => {
38+
scaleControlSmaller.addEventListener('click', onScaleSmallerClick);
39+
scaleControlBigger.addEventListener('click', onScaleBiggerClick);
40+
};
41+
42+
export { initScale, resetScale };

0 commit comments

Comments
 (0)