• Как получить то, что написал пользователь в реальном времени??

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Можно если не WebSocket, то использовать технологию ajax (fetch), которая будет периодически принимать обновлённое содержимое поля для ввода. В следующем простейшем примере будем использовать три файла на сервере:
    index.html
    <textarea id=txt oninput='send(this.value)'></textarea>
    <script>
    async function send(text){await fetch('script.php?text=' + text)};
    async function get(){txt.value = await (await fetch('file.txt')).text()};
    get();
    setInterval(get, 5000);
    txt.focus();
    </script>

    script.php
    $text = $_GET['text'];
    $file = fopen('file.txt', 'w');
    fwrite($file, $text);
    fclose($file);

    file.txt - изначально пустой файл.
    Все три файла в этом примере должны быть в одной папке.
    Суть работы такова: когда каждый, у кого открыт index.html делает любое изменение содержимого textarea, все остальные, у кого он открыт, видят это изменение в режиме реального времени. Это даже можно назвать примером простейшего чата на несколько строк. Можно переделать и использовать для отслеживания в реальном времени того, что вводят в поле для ввода.

    Второй вариант: всё, что вводит, исправляет и вытирает пользователь, записывается в массив, потом этот массив отправляется на сервер, от куда его можно скачать и прочитать в любое удобное время. При чтении происходит анимация, воспроизводящая запись всех действий пользователя в поле для ввода текста. Вот упрощённая рабочая схема:
    <textarea id=txt cols=50 rows=10 oninput='array.push(this.value)' placeholder='введите текст:'></textarea><br /><br />
    <button onclick='read()'> прочитать </button>
    <button onclick='reset()'> очистить </button>
    <script>
    let array = [];
    const read = _ => {
    	let index = 0;
    	let interval = setInterval(function(){
    		txt.value = array[index];
    		index ++;
    		if(index >= array.length) clearInterval(interval);
    	}, 300);
    }
    const reset = _ => {
    	txt.value = '';
    	array = [];
    }
    txt.focus();
    </script>
    Ответ написан
    7 комментариев
  • Как правильно выводить длину видео?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Но разве удобно использовать такой странный метод, как toISOString() :) Я бы сделал так:
    const a = 'https://www.w3schools.com/html/mov_bbb.mp4';
    const b = 'https://assets.codepen.io/6093409/hubspot-video-example.mp4';
    
    const arr = [a, b];
    
    arr.map((item) => {
    	let media = new Audio(item);
    	media.onloadedmetadata = function () {
    		let date = new Date(this.duration * 1000);
    		let h = date.getUTCHours();
    		h = h ? h + ':' : '';
    		let m = date.getMinutes();
    		let s = date.getSeconds();
    		console.log(h + m + ':' + s);
    	};
    });
    Ответ написан
    2 комментария
  • Как сделать появление второго select при выборе значения в первом html\php?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Есть пример для трёх взаимосвязанных селектов:
    Страна: <select id="country_id" class="StyleSelectBox">
        <option value="0">- выберите страну -</option>
        <option value="1">Россия</option>
        <option value="2">Украина</option>
        <option value="3">Белорусь</option>
    </select>
    <br /><br />Регион:
    <select id="region_id" disabled>
        <option value="0">- Выберите регион -</option>
    </select></td><td>
    <br /><br />Город:
    <select id="city_id" disabled>
        <option value="0">- Выберите город -</option>
    </select>

    var all_regions=[];
    var all_cites=[[],[],[]];
      
    all_regions[0]=["московская обл","ростовская обл","саратовская обл"];
    all_regions[1]=["киевская обл","львовская обл","харьковская обл"];
    all_regions[2]=["минская обл","брестская обл","гроднинская обл"];
      
    all_cites[0][0]=["Москва","Химки","Калуга"];
    all_cites[0][1]=["Такой-то город","Такой-то город","Калуга"];
    all_cites[0][2]=["Такой-то город","Такой-то город","Такой-то город"];
      
    all_cites[1][0]=["Киев","Жмеринка","Бердычев"];
    all_cites[1][1]=["Львов","Сокаль","Стрый"];
    all_cites[1][2]=["Харьков","Полтава","Пирятин"];
      
    all_cites[2][0]=["Минск","Такой-то город","Такой-то город"];
    all_cites[2][1]=["Брест","Такой-то город","Такой-то город"];
    all_cites[2][2]=["Гродно","Такой-то город","Вильно"];
      
    country_id.onchange=function(){
        region_id.disabled=false;
        region_id.innerHTML="<option value='0'>- Выберите регион -</option>";
        myregion=this.value-1;
        if(myregion!=-1){
            for(var i=0;i<all_regions[myregion].length;i++){
                region_id.innerHTML+='<option value="'+(i+1)+'">'+all_regions[myregion][i]+'</option>';
            }
        }else{
            region_id.disabled=true;
            city_id.disabled=true;
        }
    }
      
    region_id.onchange=function(){
        city_id.disabled=false;
        city_id.innerHTML="<option value='0'>- Выберите город -</option>";
        var mycite=this.value-1;
        if(mycite!=-1){
            for(var i=0;i<all_cites[myregion][mycite].length;i++){
                city_id.innerHTML+='<option value="'+(i+1)+'">'+all_cites[myregion][mycite][i]+'</option>';
            }
        }else{
            city_id.disabled=true;
        }
    }
    Ответ написан
    2 комментария
  • Как можно анимировать звуковую волну?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Это не "3D" волна, а только наложение состояний меняющейся кривой в 2Д-пространстве. Анимировать можно с помощью WebAudio Api:
    <html>
    <head>
    <title>визуализатор</title>
    <meta charset="utf-8" />
    <style>
    body{
    	background: #003;
    	font-family: arial;
    }
    #myCanvas{
    	border-width: 3px;
    	border-color: white;
    	border-radius: 15px;
    	border-style: solid;
    	box-shadow: 0 0 15px 15px #7e7;
    	animation: spin-counter 5s linear infinite;
    }
    @keyframes spin-counter {
    	from{
    		box-shadow: 0 0 5px 5px #7e7;
    		border-color: white;
    	}
    	to{
    		box-shadow: 0 0 15px 15px pink;
    		border-color: gold;
    	}
    }
    </style>
    </head>
    <body><center>
    <canvas id="myCanvas" width=1024 height=256 style="background:blue"></canvas><br /><br />
    <audio src=sound.mp3' controls></audio>
    </center></body>
    <script>
    var audio = document.querySelector('audio');
    audio.onplay = function(){
    	var audioCtx = new AudioContext();
    	var source   = audioCtx.createMediaElementSource(audio);
    	var analyser = audioCtx.createAnalyser();
        source.connect(analyser); // Подключаем анализатор к элементу audio
        analyser.connect(audioCtx.destination); // Без этой строки нет звука, но анализатор работает.
    	var frequencyData = new Uint8Array(analyser.frequencyBinCount);
    	var canvas = document.getElementById('myCanvas');
    	var ctx = canvas.getContext('2d');
    	var counter = 0;
    	setInterval(function(){
    		analyser.getByteFrequencyData(frequencyData); // Записываем в массив данные уровней частот
    		ctx.fillStyle = "black"; // Задаём цвет фона
    		ctx.globalAlpha = 0.05; // Это для получения эффекта плавного погасания полос
    		ctx.fillRect (0, 0, canvas.width, canvas.height); // Полупрозрачно чистим экран
    		ctx.globalAlpha = 1;
    		ctx.strokeStyle = '#3f9';
    		ctx.beginPath();
    		ctx.moveTo(Math.floor(150 * Math.sin(counter / 1)), 255 - frequencyData[0]);
    		for(i = 1; i < 1024; i ++) ctx.lineTo(i + Math.floor(350 * Math.sin(i / 15)), 255 - frequencyData[i]);
    		ctx.stroke();
    		counter ++;
    	}, 20);
    }
    </script>
    </html>

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

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Этот пример не затрагивает CSS, а реализован только на JS. Так как углы на JS измеряются в радианах, а длина окружности равна количеству радиан, равному числу пи * 2, (приблизительно 6.28, это количество радиусов из которых состоит окружность) организовываем цикл от нуля до пи * 2. А вот шаг итераций задаём поделив 6.28 на количество точек, которое нам нужно равномерно расставить на окружности.
    <canvas id=canvas width=200 height=200></canvas>
    let r = 90; // радиус
    let amountOfPoints = 7; // количество точек
    let x, y;
    let ctx = canvas.getContext('2d');
    for(i = 0; i < Math.PI * 2; i += Math.PI * 2 / amountOfPoints){
    	x = canvas.width / 2 + r * Math.sin(i);
    	y = canvas.height / 2 + r * Math.cos(i);
    	ctx.fillRect(x, y, 2, 2);
    }
    Ответ написан
    Комментировать
  • Где и как лучше хранить аудиофайлы музыкально плеера?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Хранение аудиофайлов - это прежде всего дело рук ихних правообладателей. Если Вы таковым являетесь, то есть такие варианты:
    • Обычный хостинг. Просто загружаете файлы и ссылки на них можно использовать в плеерах, как src.
    • Сервисы облачного хранения аудиофайлов с двоякой миссией - с которых можно скачивать со страницы для скачивания и они же предоставляют ссылки на файлы, которые можно использовать в плеерах.

    Если же Вы не являетесь правообладателем файлов, то нужно заключить с ним договор, после чего он предоставит ссылки на аудиофайлы, находящиеся на другом сервере, которые можно будет использовать в Вашем плеере не вызывая блокировку типа coors. Так что нет необходимости думать над тем, где хранить сами файлы. Представьте, вдруг у каждого будет такая же идея - сколько придётся копировать одни и те же файлы на разные сервера и хостинговые аккаунты?
    Ещё - нет необходимости хранить в массиве json имена файлов и метаданные. (исполнитель, альбом, жанр) Файлы по ссылкам правообладателей файлы содержат эти метатеги, (даже картинку-превью) и их остаётся только программно прочитать. Для этого подходит библиотека id3-minimized.js. А PHP-функция scandir() навсегда избавит от хранения имён файлов в JS- массивах. Допустим, аудиофайлы у Вас лежат в папке audio:
    <meta charset='utf-8' />
    <script src="id3-minimized.js"></script>
    <?php
    $files = scandir('audio');
    $id = 0;
    for($i = 2; $i < count($files); $i ++){
    	echo '<table><tr><td>
    		<img id=picture'.$id.' />
    		</td><td>
    		<table class=list>
    		<tr><td><b>Название трека: </b></td><td></td></tr>
    		<tr><td><b>Исполнитель: </b></td><td></td></tr>
    		<tr><td><b>Альбом: </b></td><td></td></tr>
    		<tr><td><b>Жанр: </b></td><td></td></tr>
    		<tr><td><b>Год записи: </b></td><td></td></tr>
    		</table>
    		</tr></td></table>
    		<audio src="audio/'.$files[$i].'" controls></audio>';
    	$id ++;
    }
    ?>
    <script>
    let id3Array = 'title, artist, album, genre, year, picture'.split(', ');
    let tracs = document.querySelectorAll('audio');
    let tags = [];
    let amountOfTracks = <?=count($files) - 2; ?>;
    for(j = 0; j < amountOfTracks; j ++){
    	let url = tracs[j].src;
    	ID3.loadTags(url, function() {
    		tags[j] = ID3.getAllTags(url);
    		let image = tags[j].picture;
    		if(image){
    			document.getElementById('picture' + j).style.display = 'block';
    			let base64String = "";
    			for(let i = 0; i < image.data.length; i ++) base64String += String.fromCharCode(image.data[i]);
    			let base64 = "data:" + image.format + ";base64," + window.btoa(base64String);
    			document.getElementById('picture' + j).src = base64;
    		}else{document.getElementById('picture' + j).style.display = 'none'};
        },{
    		tags: id3Array
    	});
    	for(i = 0; i < id3Arraylength - 1; i ++) document.querySelectorAll('.list')[j].querySelectorAll('td')[i * 2 + 1].innerText = eval('tags[j].' + id3Array[i]);
    }
    </script>

    А это простой локальный плеер с плейлистом с использованием такого json, как у Вас на примере трёх альбомов, в каждом из которых три трека:
    <style>
    li{
    	width: 200px;
    	border-radius: 5px;
    }
    </style>
    <audio id=audio controls></audio><br /><br />
    <b>Альбомы: </b>
    <a href=# class=selectAlbum>album1</a> | 
    <a href=# class=selectAlbum>album2</a> | 
    <a href=# class=selectAlbum>album3</a><br /><br />
    <b>Треки:</b>
    <ul id=playlist></ul>
    <script>
    let selectedAlbum;
    let album1=[
    	{
    		name: 'name1',
    		artist: 'artist1',
    		src: 'track1.mp3'
    	},
    	{
    		name: 'name2',
    		artist: 'artist2',
    		src: 'track2.mp3'
    	},
    	{
    		name: 'name3',
    		artist: 'artist3',
    		src: 'track3.mp3'
    	}
    ];
    let album2=[
    	{
    		name: 'name4',
    		artist: 'artist4',
    		src: 'track4.mp3'
    	},
    	{
    		name: 'name5',
    		artist: 'artist5',
    		src: 'track5.mp3'
    	},
    	{
    		name: 'name6',
    		artist: 'artist6',
    		src: 'track6.mp3'
    	}
    ];
    let album3=[
    	{
    		name: 'name7',
    		artist: 'artist7',
    		src: 'track7.mp3'
    	},
    	{
    		name: 'name8',
    		artist: 'artist8',
    		src: 'track8.mp3'
    	},
    	{
    		name: 'name9',
    		artist: 'artist9',
    		src: 'track9.mp3'
    	}
    ];
    let albums = document.querySelectorAll('.selectAlbum');
    for(i = 0; i < albums.length; i ++){
    	albums[i].onclick = function(){
    		audio.pause();
    		playlist.innerText = '';
    		selectedAlbum = eval(this.innerText);
    		for(j = 0; j < selectedAlbum.length; j ++){
    			let li = document.createElement('li');
    			li.id = j;
    			li.style.cursor = 'pointer';
    			li.innerHTML = '&nbsp;&nbsp;&nbsp;' + selectedAlbum[j].artist + ' - ' + selectedAlbum[j].name;
    			li.onclick = function(){
    				for(h = 0; h < selectedAlbum.length; h ++)document.getElementById(h).style.background = 'white';
    				this.style.background = 'gold';
    				audio.src = 'audio/' + selectedAlbum[this.id].src;
    				audio.play();
    			}
    			playlist.append(li);
    		}
    	}
    }
    </script>

    Выбираете альбом, появляется список его треков. Кликом по названию трека запускаете его воспроизведение.
    Ответ написан
    2 комментария
  • Как из массива целых чисел найти все возможные комбинации (не только двух чисел, а и более) дающие искомую сумму?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    Это решение предусматривает вывод списка комбинаций в консоль, бо при попытке выводить такое количество вариантов на странице, она просто виснет. Ведь речь тут идёт о том, что если в массиве 26 элементов, то приходится перебирать количество вариантов, равное 2 в степени 26, что приблизительно 65 миллионов. А это вовсе не шутка.
    const arr = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 8, 11, 13, 31, 31, 44, 51, 81, 65, 63];
    const target = prompt("enter number", "52");
    console.log('Список всех вариантов комбинаций:');
    for(a = 0; a < 2 ** arr.length; a ++){
    	let sum = 0;
    	let result = '';
    	let b = a;
    	let r = 0;
    	while(r < arr.length){
    		let c = b;
    		b = Math.floor(b / 2);
    		if(b * 2 != c){
    			sum += arr[r];
    			result += ' + ' + arr[r];
    		}
    		r ++;
    	}
    	if(sum == target) console.log(result.substring(3));
    }
    Ответ написан
    Комментировать
  • Как отловить аудиоконтекст (Web Audio API)?

    Okujava-script
    @Okujava-script
    Веб-программист с абсолютным слухом и композитор
    var player = document.getElementById('player');
    player.onplay = function() {
      var audioCtx = new AudioContext();
      var source = audioCtx.createMediaElementSource(player);
      var analyser = audioCtx.createAnalyser();
      source.connect(analyser); // Подключаем анализатор к элементу audio
      analyser.connect(audioCtx.destination); // Без этой строки нет звука, но анализатор работает.
      var frequencyData = new Uint8Array(analyser.frequencyBinCount);
      var canvas = document.getElementById('myCanvas');
      var ctx = canvas.getContext('2d');
      setInterval(function() {
        analyser.getByteFrequencyData(frequencyData); // Записываем в массив данные уровней частот
        ctx.fillStyle = "blue"; // Задаём цвет фона
        ctx.globalAlpha = 0.05; // Это для получения эффекта плавного погасания полос
        ctx.fillRect(0, 0, canvas.width, canvas.height); // Полупрозрачно чистим экран
        ctx.fillStyle = "gold"; // Задаём цвет полос
        ctx.globalAlpha = 1;
        for (i = 0; i < 1024; i++) {
          ctx.fillRect(i, 255 - frequencyData[i], 1, frequencyData[i]); // рисуем полосу
        }
      }, 20);
    }


    <audio id="player" controls src="https://listen6.myradio24.com/sazdan" crossorigin="anonymous"></audio>
    <br/>
    <br/>
    <!--Подключаем файл-->
    <canvas id="myCanvas" width=1024 height=256 style="background:blue"></canvas>


    Там только в теге аудио поменяйте ссылку на радиопоток на актуальную, т у она устарела.
    Ответ написан
    Комментировать
  • Как сделать это с музыкой в html?

    HardBot
    @HardBot
    back-end, front-end developer
    Ответ написан
    4 комментария
  • Как сделать анимацию курсора под текстом?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    Можно конечно отключать poiner-events, но если включать его для текста, то это всё равно приведёт к той же проблеме. Что под текстом не будет работать.

    Поковырял немного:


    Основное что изменил - отслеживание событий mousemove не на канвасе, а на всей секции и e.offsetX на e.clientX
    Ответ написан
    2 комментария
  • Как сделать анимацию курсора под текстом?

    neuotq
    @neuotq
    Прокрастинация
    У вас другие слои перехватывают события poiner-events, поэтому конвас как бы не видит их.
    Для этого, например, можно для main__section отключить : pointer-events: none;, а потом для нужных элементов включать, в данном случае для canvasFluid: pointer-events: all;

    PS и помним что такой эффект крайне ресурсоемкий, советую протестировать на "слабых" устройствах, на многих будет МНОГО меньше 60 fps, да даже меньше 10.
    Ответ написан
    4 комментария
  • Как сверстать подобные блоки?

    LenovoId
    @LenovoId
    svg, css,js


    Ответ написан
    Комментировать
  • Есть ли смысл делать анимацию без JS?

    neuotq
    @neuotq
    Прокрастинация
    Анимация = анимации рознь.

    Конкретный ответ со списком вы тут не увидите, это будет большая статья, со множественными "а вот тут", "но здесь" просто потому что многое зависит от контекста, задач, планирование.
    Главные рекомендации это не делать на js то, что отлично реализуется с помощью css. Этим к сожалению часто болеют многие фронтендеры, особенно из тех кто принципиально не любит вёрстку. Банальные примеры некоторые виды трансформаций объектов при булевых сменах какого параметра(условно навел/убрал наведения, вкл-выкл и тп).

    Но нужно иметь ввиду, что там где у вас выходит сложная логика, разные усложнённые сценарии, динамические параметры запуска и тп и тд. Без js естественно никуда.

    Поэтому просто зная возможности css, имея здравый смысл, вы будете видеть и знать где что использовать.
    К счастью css тоже в последнее время активно развивается давай нам всё больше возможностей.
    Поэтому - простая штука, что-то типа одноразовых анимации, простого повторения, туда сюда - подумать про css.
    Если к этому добавляются всякие реакции на сложные тайминги, старт-пауза перемотать остановить на промежутке и тп - js.
    Ну и безусловно разные сложные, многоходовки с завязкой друг на друга - однозначно js.

    В целом информации на эту тему достаточно в интернете, мудрить здесь особо не стоит. Поэтому повторюсь: просто здравый смысл и держать в уме знание css и не брезговать его использовать. Нередко кстати сами верстальщики уже готовят эти анимации, но это уже отдельный разговор организации команд и внутрипроектной кухни. Я сторонник того что фронтэндер, пусть и не обязан прям верстать верстать, но знать вёрстку/css должен на очень хорошем уровне.
    Ответ написан
    Комментировать
  • Как сохранить картинку на пк используя кнопку JS?

    @GrayHorse
    Например:

    const url = "https://i.imgur.com/sduLRvf.jpeg";
    const resp = await fetch(url);
    const blob = await resp.blob();
    const name = url.split("/").pop().replace("jpeg", "jpg");
    
    downloadBlob(blob, name, url);
    
    function downloadBlob(blob, name, url) {
        const anchor = document.createElement("a");
        anchor.setAttribute("download", name || "");
        const blobUrl = URL.createObjectURL(blob);
        anchor.href = blobUrl + (url ? ("#" + url) : "");
        anchor.click();
        setTimeout(() => URL.revokeObjectURL(blobUrl), 3000);
    }


    Можешь даже в консоли на этом сайте запустить — скачается.

    url параметр опциональный, чисто чтобы сохранить возможность посмотреть оригинальный URL в менеджере загрузок.
    Ответ написан
    4 комментария
  • Как выбрать норм SATA SSD до 2400р?

    @psiklop
    Купить норм SSD недорого можно только на авито и это будет какой-нибудь списанный серверный ssd, но не обязательно выработанный. Ибо ssd между потребительским уровнем и корпоративный сильная разница в качестве, в отличии от HDD.
    Ответ написан
    Комментировать
  • Как выбрать норм SATA SSD до 2400р?

    @rPman
    Ты ограничил стоимость ценой чуть ли не самой низкой по рынку, ниже должен быть ну просто мусор

    Вот к примеру твои ссылки просто по характеристикам ресурс TBW 40Тб, какие у тебя задачи на такой низкий ресурс? Не надейся что 3 года гарантии позволят тебе выработать ресурс и поменять, это не гарантийный случай.

    Еще момент, как ты собираешься решать гарантийные проблемы с озоном? Покупая midend расходники (а ssd это именно расходник) нужно заранее готовиться к его выходу из строя.

    Поэтому критерии выбора - большой гарантийный срок и большой ресурс (выше 200Тб), хотя конечно если у тебя задачи редко писать и много читать, то почему нет.

    p.s. дешевые железки после определенной наработки могут выдать какой-нибудь сюрприз
    Например у меня ADATA SX6000PNP nvme, выработал всего 5% и я стал замечать, что при превышении внутреннего буфера на запись, может ронять скорость чуть ли не до 5мб/с (пока кеш не переполнен выдает сотни) и главное в это время может подвисать чтение.
    Ответ написан
    2 комментария
  • Как начать заниматься "серьезной" разработкой?

    Sinersis
    @Sinersis
    Специальст широкого профиля
    Так перво на перво любая работа муторная, не верь в сказки. Даже на «серьезных» проектах выгорают.
    Второе если ты хочешь совершенствоваться пиши код, заливай на гит хаб и снова пиши код.
    Если тебе нужен проектный рост то бросай все ищи большой проект и работай там, ну или напиши большой проект сам в конце концов.
    Пр стеки и роадмапы, стек у тебя хороший только Java там не к чему если конечно ты не планируешь в энтерпрайз.
    Роадмапы субъективно конечно но куда бы ты не пошел работать они не помогут, надо умудряться подтягивать то что нужно сейчас причем с нереальной скоростью.
    Ответ написан
    Комментировать
  • Есть ли плагин, для изменения DOM при адаптиве?

    mizutsune
    @mizutsune
    Frontend Developer
    В принципе можно обойтись и медиа запросами, но если структура макета слишком сложная, есть и другие варианты решения задачи.

    Например, задачу из вопроса, можно легко решить по старинке, используя два HTML - блока, плюс переключение display через медиа запросы. Например одна кнопка находится в одном месте страницы и отображается по дефолту на десктопах, а вторая кнопка находится совсем в другом месте страницы и "активируется" соответственно на планшетах и мобильниках.

    Дублирование контента имеет небольшие плюсы и большие минусы. Вариант конечно с первого взгляда кажется классным, но это не всегда будет столь выгодно, если нужно будет дублировать большие куски контента.

    Волшебной таблетки, скажем так, не существует, поэтому нужно решать задачу тем способом, который будет более выгодным и если всё же хочется JS плагин, то есть такой вот вариант: dynamic_adapt. Правда, можно конечно сделать и получше, но если нет опыта написать что-то годное самостоятельно, можно попробовать этот плагин. Альтернатив, увы, не встречал.
    Ответ написан
    Комментировать
  • Как при помощи плагина FancyBox сделать вызов множество картинок одной кнопкой?

    Get-Web
    @Get-Web
    Front-End Developer
    Добавляете в скрытый блок необходимые вам изображения указывая значением атрибута название вашей группы изображений, например data-fancybox="gallery-1"

    <!-- Скрытая глалерея -->
    <div style="display: none;">
        <a href="images/tmp/demo-4.jpg" data-fancybox="gallery-1"></a>
        <a href="images/tmp/demo-5.jpg" data-fancybox="gallery-1"></a>
        <a href="images/tmp/demo-6.jpg" data-fancybox="gallery-1"></a>
    </div>

    Ну и вставляете ссылку где вам надо:
    <a href="images/tmp/demo-3.jpg" target="_blank" data-fancybox="gallery-1" class="media__item"></a>
    Ответ написан
    2 комментария