• Как сделать, чтоб в css3 анимация была плавной?

    fnnzzz
    @fnnzzz
    front-end dev
    можно использовать will-change, но вообще самый главный принцип - не анимировать всё сразу, а последовательно, тогда ваша анимация будет 60fps. Для этого можно использовать циклы в SASS, например. Вот хорошая статья - https://habrahabr.ru/company/paysto/blog/264421/
    Ответ написан
    3 комментария
  • Как загрузить содержимое iframe только ПО КЛИКУ?

    fnnzzz
    @fnnzzz
    front-end dev
    можно добавлять динамически, после того, как ДОМ отрендерился

    document.addEventListener('DOMContentLoaded', function() {
    	var iframeEl = document.createElement('iframe')
    	iframeEl.src = 'http://example.com'
    	document.querySelector('#container').appendChild(iframeEl)
    })
    Ответ написан
    Комментировать
  • Как при наведении на картинку сделать эффект затемнения?

    fnnzzz
    @fnnzzz
    front-end dev
    <div class="block">
    	...
    </div>
    
    .block {
    	position: relative;
    }
    .block::before {
    	content: normal;
    }
    
    .block::after{
    	content: normal;
    }
    
    .block:hover::before {
    	content: ''
    }
    
    .block:hover::after {
    	content: ''
    }
    
    .block::before {
    	position: absolute;
    	top: 0;
    	left: 0;
    	width: 0;
    	heigth: 0;
    	background-color: rgba(0, 0, 0, 0.6);
    	z-index: 1;
    }
    
    .block::after {
    	position: absolute;
    	background: url('icon.png');
    	top: 50%;
    	left: 50%;
    	transform: translate(-50%, -50%);
    	z-index: 2;
    }
    Ответ написан
    Комментировать
  • Есть ли альтернатива React?

    fnnzzz
    @fnnzzz
    front-end dev
    Порадовала формулировка "Сейчас же так модно." - никто не заставляет вас использовать Ридакс сразу же.
    Ден Абрамов (автор Redux) об этом писал - https://medium.com/@dan_abramov/you-might-not-need...

    Если у вас достаточно простое приложение, вы можете использовать state, props и коллбэки и все будет ок.

    Redux нужен вам, если ваше приложение разрастается и управлять потоком данных становится сложнее:
    - допустим вам нужно вызвать коллбэк и обработать его в чайлде, который стоит на том же уровне но через N-детей, в ридаксе же вы вызываете dispatcher и не беспокоитесь о том как же передать этот коллбек туда.
    - или если у вас есть данные, которые используются в разных компонентах, редублицировать их? (ноу вэй), удобнее вытаскивать их из одного большущего объекта в таком случае.
    - плюс ридакс хорошо решает проблему гонки состояний (иначе вы не сможете наверняка знать, что и в каком порядке у вас происходит на страничке).
    - ну и плюс миддлвары

    поэтому такое кол-во абстракций вполне оправдано, если конечно у вас есть потребность в них.
    А если вам просто нужно по клику на кнопочку что-то перерисовать на страничке, то берете Vue и радуетесь.
    Не нужно выбирать технологии только потому, что сейчас они "хайповые".
    Ответ написан
    3 комментария
  • Возможно ли реализовать "нативный" кинетический скроллинг?

    fnnzzz
    @fnnzzz
    front-end dev
    вообще оверрайдить поведение скролла это всегда плохо, лучше нативного быть не может, потому что вы не можете отследить все кейсы, как ваш скролл работает на том или ином у-ве, + некоторых людей может раздражать такой UX у скролла.

    Ну а вообще, есть уже масса готовых библиотек для кастомного скроллинга. Вы просто подписываетесь на событие "scroll" и переопределяете там scroll position каждый раз. Можно для этого даже какую-то кривульку сделать (cubic-bezier).
    Ответ написан
    4 комментария
  • Где найти практику по javascript?

    fnnzzz
    @fnnzzz
    front-end dev
    https://codefights.com
    codewars.com

    прямо мультиплеер с реальными задачками и разной сложностью.
    Ответ написан
    Комментировать
  • Как отправить сообщение с сайта на почту?

    fnnzzz
    @fnnzzz
    front-end dev
    все, верно, делается это с помощью ф-и mail:
    mail('test@example.com', 'Subject', $message);

    но, учтите, что на вашем сервере/хостинге/дроплете/инстансе должен быть настроен SMTP, потому что php просто делегирует отправку почты на уровень выше, а уже настроенный SMTP перехватывает его и отправляет.

    Если вы не хотите беспокоиться о настройке SMTP, то можете воспользоваться уже готовыми решениями, вроде этого: https://formspree.io/

    там можно как через POST засылать данные, так и с помощью AJAX.
    Ответ написан
  • Какой необходимый уровень знаний для junior React.js Разработчика?

    fnnzzz
    @fnnzzz
    front-end dev
    почти на каждом собеседовании встречается такое "напишите полифилл для bind", поэтому нужно понимать как работает "this" в JS.

    плюс, в основе React/Redux лежит функциональщина, поэтому можно ожидать вопросы про HOC (это например connect в react-redux), map-reduce и пр.

    также нужно знать принцип работы лайф-сайклов в React, ну например.. если в shouldComponentUpdate вернуть false, будет ли при этом вызываться componentWillReceiveProps?

    Ну и наверняка нужно знать о механизме работы промисов, имхо.
    Ответ написан
    Комментировать
  • Проблема привязки репозитория bitbucket?

    fnnzzz
    @fnnzzz
    front-end dev
    сначала сделай:
    ssh-add -l

    создать файлик config
    ~/.ssh/config

    и укажи хост и ключик для него
    Host bitbucket.org
        IdentityFile ~/.ssh/my_key_filename


    дальше идешь по ssh и все должно быть ок
    ssh -Tvv git@bitbucket.org
    Ответ написан
    Комментировать
  • Как сделать блок по ширине картинки, но не больше ширины страницы?

    fnnzzz
    @fnnzzz
    front-end dev
    есть viewport units.
    просто укажи, что ширина эл-та должна быть не больше ширины вьюпорта
    max-width: 100vw;
    Ответ написан
    Комментировать
  • Как работают связи state в react js?

    fnnzzz
    @fnnzzz
    front-end dev
    ты в selectNode присваиваешь не содержимое объекта, а ссылку на него и потом по этой ссылке делаешь изменения в объекте.

    тобишь если сделать что-то типа того:

    selectNode(node) {
    	let nodeNew = Object.assign({}, node)
        this.setState({selected_node: nodeNew});
    }


    то все будет ок, но вообще делать такое совсем не комильфо, передавать сам инстанс в качестве параметра.. в крайнем случае лучше заюзать "ref".

    а вообще, здесь можно обойтись и без копирования, просто меняй у самого объекта флажок, вроде "edit" и в зависимости от его значения рендерь, что нужно..

    что-то вроде этого:

    import React, { Component } from 'react'
    
    
    export default class TestPage extends Component {
    constructor(props) {
        super(props);
    
        this.input = null
        this.state = {
            nodes: [
                { id: 1, content: "qwerty", edit: false },
                { id: 2, content: "abcdef", edit: false }
            ],
            inputVal: ''
        };
    }
    
    toggleEdit(id, isEdit) {
        this.setState({
        	...this.state,
        	nodes: this.state.nodes.map(n => {
        		if( n.id === id ) {
        			n.edit = isEdit
        		}
        		return n
        	})
        })
    }  
    
    handleContent(event) {
    	....
    }
    
    render() {
        return (
            <div>
                <table>
                    <thead>
                        <th>id</th>
                        <th>content</th>
                        <th>edit</th>
                    </thead>
                    <tbody>
    
                    {this.state.nodes.map((node) => {
                        if(node.edit) {
                            return <tr key={node.id}>
                                <td>{node.id}</td>
    
                                <td><input
                                	onChange={this.handleContent.bind(this)}
                                	ref={(input) => this.input = input}
                                    value={this.state.inputVal}
                                />
                                </td>
                                <td>
                                    <button type="submit">save</button>
                                    <button onClick={() => this.toggleEdit(node.id, false)}>cancel</button>
                                </td>
                            </tr>
                        } else {
                            return <tr key={node.id}>
                                <td>{node.id}</td>
                                <td>{node.content}</td>
                                <td><button onClick={() => this.toggleEdit(node.id, true)}>edit</button></td>
                            </tr>;
                        }
                    })}
    
                    </tbody>
                </table>
            </div>
        );
    }
    };
    Ответ написан
  • Как реализовать смену цвета в React?

    fnnzzz
    @fnnzzz
    front-end dev
    просто хранишь стейт с выбранной темой в компоненте и вешаешь обработчики для смены стейта

    class MyComponent extends Component {
    	constructor() {
    		super()
    
    		this.state = {
    			currentTheme: "dark"
    		}
    	}
    
    	changeTheme(themeName) {
    		this.setState({
    			currentTheme: themeName
    		})
    	}
    
    	render() {
    		return (
    			<div>
    				...
    
    				<button onClick={() => this.changeTheme("dark").bind(this)}> {/* байнд для доступа к this внутри ф-и */}
    					I wanna dark!
    				}
    				</button>
    
    				<button onClick={() => this.changeTheme("light").bind(this)}>
    					I wanna light!
    				</button>
    			</div>
    		)
    	}
    }


    можешь это все хранить в корневом компоненте, тогда просто вызываешь callback, который дойдет до самого верха и поменяет стейт, а дальше передаешь это как props дочерним компонентам и в зависимости от выбранной темы рендеришь что нужно.

    onClick={() => this.props.goDark()} /* например это вызов из ребенка, который очень глубоко */
    
    
    /* в это уже самый верхний (корневой) компонент */
    
    goDark() { ... }
    goLight() { ... }
    
    <RootComponent>
    	<Child currentTheme={this.state.currentTheme} />
    </RootComponent>


    можешь это еще дополнительно куда-то в локалсторадж писать и при инициализации читать оттуда.

    ------------------

    ну а по поводу цсс, просто в зависимости от значения в переменной currentTheme - загружаешь нужную css, либо же в самом рендере навешиваешь разные стили/классы

    <div className={ this.props.currentTheme === 'dark' ? 'dark-wrapper' : 'light-wrapper' }>
    	<button className={this.props.currentTheme === 'dark' ? 'btn-primary-yellow' : 'btn-primary-blue' }></button>
    </div>
    Ответ написан
    2 комментария
  • Что не работает после отключения Javascript?

    fnnzzz
    @fnnzzz
    front-end dev
    зависит от браузера
    Ответ написан
    Комментировать
  • Как на Jquery Cookie показывать элемент на время?

    fnnzzz
    @fnnzzz
    front-end dev
    var cookieVal = $.cookie('newUser'});
    
    if(!cookieVal) {
    	$.cookie('newUser', Date.now());
    }
    else {
    	var dayInSeconds = 86400
    	var currentDate = Date.now()
    	var dateDiff = currentDate - parseInt(cookieDate)
    	
    	if( dateDiff < dayInSeconds ) {
    		showElement()
    	}
    }
    Ответ написан
    Комментировать
  • Как экспортировать функцию по умолчанию в js?

    fnnzzz
    @fnnzzz
    front-end dev
    const num = () => Math.sqrt(num)
    
    export default num


    если не по дифолту, то можно так
    export function num() {
    	return Math.sqrt(num)
    }
    
    ........
    
    import { num } from './sqrt.js'
    Ответ написан
    4 комментария
  • Замедляет ли Атрибут width="100%" загрузку iframe и картинок?

    fnnzzz
    @fnnzzz
    front-end dev
    повлияет это только на performance, т.к. браузеру нужны будут ресурсы на перерендер картинки или айфрейма, но никак не на загрузку.
    Ответ написан
    Комментировать
  • Максимальная оптимизация приложения на angularjs + localStorage, ваше мнение?

    fnnzzz
    @fnnzzz
    front-end dev
    если они у вас не очень часто теряют актуальность, то можно использовать приём "оптимистических обновлений", тобишь сразу вывести данные из локал-стораджа, а уже потом переспросить их у АПИ, отрендерить и записать новый список в localStorage, у юзеров будет хороший икспириенц.

    Отрицательным фактором в таком случае может быть "мигание" данных, если они у вас частенько меняют актуальность.
    Из аналогов localStorage можно заюзать indexDB, у него в принципе неплохая поддержка браузерами и он более развесистый.
    Ответ написан
    Комментировать
  • Как очистить текстовое поле?

    fnnzzz
    @fnnzzz
    front-end dev
    document.addEventListener("DOMContentLoaded", function() {
    	document.querySelector("#my_input").value = ""
    })
    Ответ написан
    Комментировать
  • Как отрендерить шаблон, но не отправлять HttpResponse (Django)?

    fnnzzz
    @fnnzzz
    front-end dev
    заюзай extends и передавай туда параметры блоками
    Ответ написан
    Комментировать