Note. English version of docs is coming soon...
Компонент, имитирующий работу 3D модели с помощью массива закодированных в base64 изображений на входе и канваса на выходе.
[
"data:image/jpeg;base64,/9j/4AA...",
"data:image/jpeg;base64,/9j/4Af...",
"data:image/jpeg;base64,/9j/3sf...",
"data:image/jpeg;base64,/9j/1gf..."
]
- Установка
npm install --save js360
yarn add js360
- Создаем контейнер, в который будет добавлен канвас.
<div class="simple-js360"></div>
- Канвас и изображение, добавляемое в него, получат размеры добавленного выше контейнера. Поэтому, у контейнера должны быть заданы минимальные стили.
.simple-js360 {
width: 320px;
height: 180px;
}
- Создаем объект модели и рендерим.
import { JS360 } from 'js360';
const js360 = new JS360({ // options
baseUrl: 'http://myrest', // без замыкающего слеша (проверки пока нет, но будет)
target: '.simple-js360',
preview: '.assets/product.jpeg',
url: 'product.json'
});
js360.render();
baseUrl
- базовыйurl
к массиву изображенийtarget
- селекторcss
- контейнер, куда будет добавлен канвасpreview
- изображение для предпоказа. Пока целевой массив закодированных изображений еще не получен или загрузка не активированаurl
- путь до самого файла на сервере- В итоге файл будет скачан по пути
http://myrest/product.json
Мы получим контейнер, с шириной 320px
и высотой 180px
. В контейнере будет содержаться канвас, в котором будет рендериться изображение.
При клике на канвас произойдет запрос на сервер по адресу http://myrest/product.json
.
Note. Запрос пока простейший на
XMLHttpRequest
. Хедеры не поддерживает, но будет.
- Добавить канвас можно как на 1 компонент, так и на массив
- Кастомные события для загрузки и прокрутки контента
- Для
retina
можно загружать отдельный массив изображений. К примеру, еслиwindow.devicePixelRatio === 2
загружаем изображения720×480
, в ином случае320x180
- Скорость прокрутки
- Автопросмотр после загрузки
- Возможность включить и выключить кнопки управления (загрузка / остановка / ускорение)
- Много чего в планах, разработка ведется
type: ([index]) => Promise.all
Ручная загрузка массива изображений. На вход метод получает массив индексов, определяющий для каких именно кансасов нужно выгрузить изображения. Если не передано ничего, изображения загружаются для всех кансасов объекта.
Возвращает Promise
, который резолвится, когда все запрошенные массивы получены.
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: document.querySelectorAll('.js360')
});
js360.render();
js360.load().then(() => {
// some code ...
js360.play();
});
type: [index]
Ручной запуск автопросмотра. Метод получает на вход массив индексов, определяющий для каких именно кансасов нужно запустить просмотр. Если не передано ничего, просмотр запускается для всех кансасов объекта.
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: document.querySelectorAll('.js360')
});
js360.render();
js360.load().then(() => {
// some code ...
js360.play();
});
type: [index]
Ручная остановка автопросмотра. Метод получает на вход массив индексов, определяющий для каких именно кансасов нужно остановить просмотр. Если не передано ничего, просмотр останавливается для всех кансасов объекта.
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: document.querySelectorAll('.js360'),
autoPlay: true
});
js360.render();
setTimeout(() => {
js360.stop([3]);
}, 2000);
Через 2 секунды после инициализации, просмотр будет остановлен для канваса с индексом 3.
type: [index]
Переключение режимов play / stop. Также получает на вход массив индексов, к которым нужно применить метод. Если ничего не передано - метод будет передан для всех канвасов данного объекта.
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: document.querySelectorAll('.js360'),
autoPlay: true
});
js360.render();
setTimeout(() => {
js360.toggle();
setTimeout(() => {
js360.toggle();
}, 2000);
}, 2000);
Через 2 секунды после инициализации, просмотр будет остановлен для всех канвасов. И будет запущен новый таймер на 2 секунды, для возобновления автопросмотра.
type: function
Вызывается после удачной загрузки изображений.
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: document.querySelectorAll('.js360'),
onLoad: () => console.log('images is loaded')
});
js360.render();
Успешная загрузка контента вызовет функцию onLoad
.
type: function
const js360 = new JS360({
target: document.querySelectorAll('.js360'),
onRotateStart: () => console.log('rotate is started')
});
js360.render();
Активация прокрутки мышью вызовет функцию onRotateStart
.
type: function
const js360 = new JS360({
target: document.querySelectorAll('.js360'),
onRotate: () => console.log('rotating happens now')
});
js360.render();
Каждый поворот модели вызовет функцию onRotate
.
type: function
const js360 = new JS360({
target: document.querySelectorAll('.js360'),
onRotateEnd: () => console.log('rotating is finished')
});
js360.render();
По завершению поворота модели будет вызвано событие onRotateEnd
.
type: function
const js360 = new JS360({
target: document.querySelectorAll('.js360'),
onPlayStart: () => console.log('autoPlay is started')
});
js360.render();
Активация автопросмотра вызовет функцию onPlayStart
.
type: function
const js360 = new JS360({
target: document.querySelectorAll('.js360'),
onPlay: () => console.log('autoPlay is happening now')
});
js360.render();
Каждая атоматическая смена изображения в канвасе активирует функцию onPlay
.
type: function
const js360 = new JS360({
target: document.querySelectorAll('.js360'),
onPlayEnd: () => console.log('autoPlay is finished')
});
js360.render();
Остановка автопросмотра вызывает событие onPlayEnd
.
type: function => boolean
const js360 = new JS360({ target: document.querySelectorAll('.js360') });
js360.render();
js360.isLoaded();
false
- изображения не загружены
true
- изображения загружены
type: function
const js360 = new JS360({ target: document.querySelectorAll('.js360') });
js360.render();
js360.isPending();
false
- изображения не загружаются в данный момент
true
- изображения загружаются в данный момент
type: function => boolean
const js360 = new JS360({ target: document.querySelectorAll('.js360') });
js360.render();
js360.isMoving();
false
- ручной разворот подели не происходит
true
- происходит ручной поворот модели
type: function => boolean
const js360 = new JS360({ target: document.querySelectorAll('.js360') });
js360.render();
js360.isStopped();
false
- автопросмотр включен
true
- автопросмотр выключен
type: function => boolean
const js360 = new JS360({ target: document.querySelectorAll('.js360') });
js360.render();
js360.isPlayed();
false
- автопросмотр выключен
true
- автопросмотр включен
Настраивать компонент можно с помощью свойств объекта options
, передаваемого в конструктор new JS360(options)
или через data
атрибуты в html шаблоне.
Данные, переданные через data
атрибуты приоритетнее, и при одинаковых свойствах, они перезапишут свойства объекта options
переданного в конструктора JS.
type: boolean
обязательное: нет
по-умолчанию: undefined
Запускает автоматическую прокрутку изображений после их загрузки.
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: '.js360',
url: 'product.json',
autoPlay: true
});
js360.render();
type: string
обязательное: да
Определяет левую часть url
, по которому будет запрошен массив изображений.
<div class="js360" data-base-url="http://my_first_rest" data-url="product.json"></div>
const js360 = new JS360({
baseUrl: 'http://my_second_rest',
target: '.js360'
});
js360.render();
При одновременном указании baseUrl && data-base-url
приоритет будет у baseUrl
.
Массив закодированных изображений будет получен по адресу http://my_first_rest/product.json
.
type: boolean
обязательное: нет
Определяет кнопку управления загрузкой, которая перехватит на себя событие loadEvent (mousemove
по-умолчанию).
Если не определена - загрузка активируется через контейнер.
Для корректной отрисовки, необходимо подключить style.css
.
import 'js360/style.css';
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: '.js360',
url: 'product.json',
controlLoad: true
});
js360.render();
type: boolean
обязательное: нет
Создает кнопку управления (старт / пауза) автоматическим просмотром.
Для корректной отрисовки, необходимо подключить style.css
.
import 'js360/style.css';
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: '.js360',
url: 'product.json',
controlPlay: true
});
js360.render();
type: integer
обязательное: нет
по-умолчанию: container.clientHeight || 180
Если задан - определяет высоту контейнера, которая наследуется в канвас и изображение.
type: array, stringified array
обязательное: нет
по-умолчанию: ['mousemove']
По-умолчанию, загрузка изображений происходит на событие mousedown
. Это поведение можно изменить следующим образом.
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: '.js360',
url: 'product.json',
loadEvents: ['mousedown', 'touchstart']
});
js360.render();
Теперь загрузка изображений активируется на события ['mousedown', 'touchstart']
.
type: boolean обязательное: нет по-умолчанию: undefined
Если true
- в момент начала загрузки изображений в контейнер будет добавлен прелоадер.
Note: Чтобы прелоадер корректно отрисовался, необходимо добавить файл styles.css
из папки компонента.
import 'js360/styles.css';
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: '.js360',
url: 'product.json',
preloader: true
});
js360.render();
type: string
обязательное: нет
Определяет изображение для предпоказа модели, пока основной конент еще не загружен или загрузка не инициирована.
Свойство не обязательное, но следует иметь ввиду, если изображение для предпоказа не определено, после инициализации компонента, он будет пустым белым прямоугольником.
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: '.js360',
preview: '.assets/product.jpeg'
});
js360.render();
type: string
обязательное: нет
Определяет правую часть url
строки, по которой будет получен массив изображений при следующих условиях:
window.devicePixelRatio === 2
- заданы параметры
retinaUrl || data-retina-url
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: '.js360',
url: 'product.json',
retinaUrl: 'retina-product.json'
});
js360.render();
Для устройств devicePixelRatio
которых отличается от 2 изображения будут получены по адресу http://my_rest/product.json
.
Для ретина экранов изображения будут получены по адресу http://my_rest/retina-product.json
.
type: array, stringified array
обязательное: нет
по-умолчанию: ['mousedown']
По-умолчанию, прокрутка изображений происходит на событие mousedown
. Это поведение можно изменить следующим образом.
<div class="js360" data-rotate-events='["mousemove"]'></div>
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: '.js360',
url: 'product.json'
});
js360.render();
Теперь прокрутка изображений активируется на событие mousemove
.
type: integer, float (округляется до 2х цифр после запятой)
обязательное: нет
по-умолчанию: 1
По-умолчанию, все фотографии распределяются по ширине канваса. То есть, если зацепить канвас с левой стороны мышью и дотянуть до его правой стороны, пройдет 1 круг всех изображений.
Это можно изменить, например, так.
const js360Slow = new JS360({
baseUrl: 'http://my_rest',
target: '.js360',
url: 'product.json',
speed: 0.5
});
const js360Fast = new JS360({
baseUrl: 'http://my_rest',
target: '.js360',
url: 'product.json',
speed: 2
});
js360Slow.render(); // за 1 полную ширину канваса будут прокручены половина всех изображений
js360Fast.render(); // за 1 полную ширину канваса все изображения будут прокручены 2 раза
type: string, NodeElement, NodeList
обязательное: да
Определяет контейнеры, в которые будут добавлены канвасы.
Передавать можно css selector
, NodeElement
или NodeElement
const targetSelector = '.js360';
const targetNodeList = document.querySelectorAll('.js360');
const targetNodeElement = document.querySelector('.js360');
const js360 = new JS360({
baseUrl: 'http://my_second_rest',
target: targetSelector || targetNodeList || targetNodeElement
});
js360.render();
type: string
обязательное: да
Определяет правую часть url
строки, по которой будет получен массив изображений.
const js360 = new JS360({
baseUrl: 'http://my_rest',
target: '.js360',
url: 'product.json'
});
js360.render();
Изображения будут получены по адресу http://my_rest/product.json
.
type: integer
обязательное: нет
по-умолчанию: container.clientWidth || 320
Если задан - определяет ширину контейнера, которая наследуется в канвас и изображение.