Skip to content

Commit a988177

Browse files
authored
Merge pull request #11 from NikitaKir98/module9-task2
Помощь друга
2 parents d1002f0 + a71e05c commit a988177

File tree

4 files changed

+131
-0
lines changed

4 files changed

+131
-0
lines changed

index.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<link rel="stylesheet" href="css/normalize.css">
77
<link rel="stylesheet" href="css/style.css">
88
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
9+
<link rel="stylesheet" href="./vendor/nouislider/nouislider.css">
910
<title>Кекстаграм</title>
1011
</head>
1112

@@ -234,6 +235,7 @@ <h2 class="data-error__title">Не удалось загрузить данны
234235
</section>
235236
</template>
236237
<script src="./js/main.js" type="module"></script>
238+
<script src="./vendor/nouislider/nouislider.js"></script>
237239
<script src="./vendor/pristine/pristine.min.js"></script>
238240
</body>
239241
</html>

js/filters.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
const
2+
EFFECTS_STEP = 0.01,
3+
MAX_BLUR_VALUE = 3,
4+
MAX_BRIGHTNESS = 3;
5+
6+
const slider = {
7+
MIN: 0,
8+
MAX: 100,
9+
STEP: 1,
10+
};
11+
12+
const uploadForm = document.querySelector('.img-upload__form');
13+
const effectsList = uploadForm.querySelector('.effects__list');
14+
const imgPreview = uploadForm.querySelector('.img-upload__preview');
15+
const image = imgPreview.querySelector('img');
16+
const imgSliderUpload = uploadForm.querySelector('.img-upload__effect-level');
17+
const effectValue = uploadForm.querySelector('.effect-level__value');
18+
const sliderElement = uploadForm.querySelector('.effect-level__slider');
19+
20+
let currentEffect = '';
21+
22+
const effects = {
23+
none: () => {
24+
imgSliderUpload.classList.add('visually-hidden');
25+
return 'none';
26+
},
27+
chrome: () => {
28+
imgSliderUpload.classList.remove('visually-hidden');
29+
return `grayscale(${parseInt(effectValue.value, 10) * EFFECTS_STEP})`;
30+
},
31+
sepia: () => {
32+
imgSliderUpload.classList.remove('visually-hidden');
33+
return `sepia(${parseInt(effectValue.value, 10) * EFFECTS_STEP})`;
34+
},
35+
marvin: () => {
36+
imgSliderUpload.classList.remove('visually-hidden');
37+
return `invert(${Math.floor(effectValue.value, 10)}%)`;
38+
},
39+
phobos: () => {
40+
imgSliderUpload.classList.remove('visually-hidden');
41+
return `blur(${(parseInt(effectValue.value, 10) * MAX_BLUR_VALUE) * EFFECTS_STEP}px)`;
42+
},
43+
heat: () => {
44+
imgSliderUpload.classList.remove('visually-hidden');
45+
return `brightness(${(parseInt(effectValue.value, 10) * MAX_BRIGHTNESS) * EFFECTS_STEP})`;
46+
},
47+
};
48+
49+
effects.none();
50+
51+
const onEffectsListClick = (event) => {
52+
const { target } = event;
53+
if (!target.classList.contains('effects__preview')) {
54+
return;
55+
}
56+
57+
sliderElement.noUiSlider.set(slider.MAX);
58+
effectValue.value = slider.MAX;
59+
currentEffect = target.classList[1].replace('effects__preview--', '');
60+
image.style.filter = effects[currentEffect]();
61+
};
62+
63+
effectsList.addEventListener('click', onEffectsListClick);
64+
65+
noUiSlider.create(sliderElement, {
66+
range: {
67+
min: slider.MIN,
68+
max: slider.MAX,
69+
},
70+
start: slider.MAX,
71+
step: slider.STEP,
72+
connect: 'lower',
73+
});
74+
75+
sliderElement.noUiSlider.on('slide', (value) => {
76+
effectValue.value = [...value];
77+
image.style.filter = effects[currentEffect]();
78+
});
79+
80+
const resetEffect = () => {
81+
image.style.removeProperty('filter');
82+
effectValue.value = '';
83+
sliderElement.noUiSlider.updateOptions({
84+
start: slider.MAX,
85+
});
86+
effectsList.querySelector('#effect-none').checked = true;
87+
effects.none();
88+
};
89+
90+
export { resetEffect };

js/photo_upload_form.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { isEscapeKey } from './util.js';
22
import { validateDescription, validateHashtags, getError } from './validation.js';
3+
import { changeZoom, resetZoom } from './zoom.js';
4+
import { resetEffect } from './filters.js';
35

46
const GET_ERROR_TAGS = 'tags';
57
const GET_ERROR_DESCRIPTION = 'description';
@@ -12,6 +14,9 @@ const inputDescription = uploadForm.querySelector('.text__description');
1214
const inputHashtags = uploadForm.querySelector('.text__hashtags');
1315
const uploadSubmit = uploadForm.querySelector('.img-upload__submit');
1416
const uploadFile = document.querySelector('#upload-file');
17+
const scaleControlSmaller = uploadForm.querySelector('.scale__control--smaller');
18+
const scaleControlBigger = uploadForm.querySelector('.scale__control--bigger');
19+
1520

1621
const pristine = new Pristine(uploadForm, {
1722
classTo: 'img-upload__field-wrapper',
@@ -45,6 +50,9 @@ const onDocumentKeydown = (event) => {
4550
}
4651
};
4752

53+
scaleControlSmaller.addEventListener('click', () => changeZoom(-1));
54+
scaleControlBigger.addEventListener('click', () => changeZoom());
55+
4856
const onClickFormUpload = () => {
4957
body.classList.add('modal-open');
5058
overlayForm.classList.remove('hidden');
@@ -53,6 +61,8 @@ const onClickFormUpload = () => {
5361
};
5462

5563
const closeFormUpload = () => {
64+
resetZoom();
65+
resetEffect();
5666
overlayForm.classList.add('hidden');
5767
body.classList.remove('modal-open');
5868
document.removeEventListener('keydown', onDocumentKeydown);

js/zoom.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
const scaleControlValue = document.querySelector('.scale__control--value');
2+
const imgPreview = document.querySelector('.img-upload__preview').querySelector('img');
3+
4+
const zoomParameters = {
5+
min: 25,
6+
max: 100,
7+
step: 25,
8+
};
9+
10+
const changeZoom = (facktor = 1) => {
11+
let size = parseInt(scaleControlValue.value, 10) + (zoomParameters.step * facktor);
12+
13+
if (size < zoomParameters.min){
14+
size = zoomParameters.min;
15+
}
16+
17+
if (size > zoomParameters.max){
18+
size = zoomParameters.max;
19+
}
20+
scaleControlValue.value = `${size}%`;
21+
imgPreview.style.transform = `scale(${size * 0.01})`;
22+
};
23+
24+
const resetZoom = () => {
25+
imgPreview.style.removeProperty('transform');
26+
scaleControlValue.value = '100%';
27+
};
28+
29+
export {changeZoom, resetZoom};

0 commit comments

Comments
 (0)