Skip to content

Commit b6f436c

Browse files
authored
Merge pull request #10 from DianaBrodovaya/module9-task2
2 parents bd5d924 + 656c598 commit b6f436c

4 files changed

Lines changed: 177 additions & 1 deletion

File tree

index.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<meta charset="utf-8">
66
<meta name="viewport" content="width=device-width,initial-scale=1">
77
<link rel="stylesheet" href="css/normalize.css">
8+
<link rel="stylesheet" href="vendor/nouislider/nouislider.css">
89
<link rel="stylesheet" href="css/style.css">
910
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
1011
<title>Кекстаграм</title>
@@ -253,6 +254,7 @@ <h2 class="data-error__title">Не удалось загрузить данны
253254

254255
<script type="module" src="js/main.js"></script>
255256
<script src="vendor/pristine/pristine.min.js"></script>
257+
<script src="vendor/nouislider/nouislider.js"></script>
256258
</body>
257259

258260
</html>

js/effects.js

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

js/form.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
2+
import { resetScale } from './scale.js';
3+
import { resetEffects } from './effects.js';
4+
15
const MAX_HASHTAGS_COUNT = 5;
26
const MAX_COMMENT_LENGTH = 140;
37
const HASHTAG_REGEX = /^#[a-zа-яё0-9]{1,19}$/i;
@@ -23,10 +27,11 @@ const closeUploadForm = () => {
2327
document.body.classList.remove('modal-open');
2428
uploadForm.reset();
2529
pristine.reset();
30+
resetScale();
31+
resetEffects();
2632
document.removeEventListener('keydown', onDocumentKeydown);
2733
};
2834

29-
// Функция обработки нажатия Esc
3035
function onDocumentKeydown(evt) {
3136
if (evt.key === 'Escape' && !isTextFieldFocused()) {
3237
evt.preventDefault();
@@ -37,6 +42,8 @@ function onDocumentKeydown(evt) {
3742
const openUploadForm = () => {
3843
uploadOverlay.classList.remove('hidden');
3944
document.body.classList.add('modal-open');
45+
resetScale();
46+
resetEffects();
4047
document.addEventListener('keydown', onDocumentKeydown);
4148
};
4249

js/scale.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
const SCALE_STEP = 25;
2+
const MIN_SCALE = 25;
3+
const MAX_SCALE = 100;
4+
const DEFAULT_SCALE = 100;
5+
6+
const smallerButton = document.querySelector('.scale__control--smaller');
7+
const biggerButton = document.querySelector('.scale__control--bigger');
8+
const scaleInput = document.querySelector('.scale__control--value');
9+
const previewImage = document.querySelector('.img-upload__preview img');
10+
11+
const scaleImage = (value) => {
12+
scaleInput.value = `${value}%`;
13+
previewImage.style.transform = `scale(${value / 100})`;
14+
};
15+
16+
const onSmallerButtonClick = () => {
17+
const currentValue = parseInt(scaleInput.value, 10);
18+
let newValue = currentValue - SCALE_STEP;
19+
20+
if (newValue < MIN_SCALE) {
21+
newValue = MIN_SCALE;
22+
}
23+
24+
scaleImage(newValue);
25+
};
26+
27+
const onBiggerButtonClick = () => {
28+
const currentValue = parseInt(scaleInput.value, 10);
29+
let newValue = currentValue + SCALE_STEP;
30+
31+
if (newValue > MAX_SCALE) {
32+
newValue = MAX_SCALE;
33+
}
34+
35+
scaleImage(newValue);
36+
};
37+
38+
const resetScale = () => scaleImage(DEFAULT_SCALE);
39+
40+
smallerButton.addEventListener('click', onSmallerButtonClick);
41+
biggerButton.addEventListener('click', onBiggerButtonClick);
42+
43+
export { resetScale };

0 commit comments

Comments
 (0)