Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.01.2018, 03:00
Аватар для Morty
Интересующийся
Отправить личное сообщение для Morty Посмотреть профиль Найти все сообщения от Morty
 
Регистрация: 08.01.2016
Сообщений: 13

Нужна помощь, подправить скрипт рулетки
Всем привет. Прошу прощения, если тема не в том разделе, вроде это самый подходящий...
В общем, есть скрипт прокрутки изображений https://codepen.io/timnew/pen/gPxKRV в котором, собственно, производится прокрутка изображений и останавливается на нужном.
Мне нужно, чтоб прокрутка производилась не вертикально, а горизонтально и чтоб отображалось не одно изображение, а скажем, 11, а выбранное изображение останавливалось посредине (5 слева, 5 справа и по центру нужное).
Помогите, пожалуйста. Уже несколько месяцев ищу подобное, вроде бы нашёл, но моих познаний в js, к сожалению, мало, чтоб сделать как нужно
Ответить с цитированием
  #2 (permalink)  
Старый 18.01.2018, 03:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Morty,
Рулетка горизонтальная
Ответить с цитированием
  #3 (permalink)  
Старый 18.01.2018, 11:46
Аватар для Morty
Интересующийся
Отправить личное сообщение для Morty Посмотреть профиль Найти все сообщения от Morty
 
Регистрация: 08.01.2016
Сообщений: 13

Сообщение от рони Посмотреть сообщение
Morty,
Рулетка горизонтальная
Не совсем то...
здесь генерируются цифры в скрипте, а здесь одно изображение режется на части.

У меня посредством php делается выборка адресов картинок из mysql и генерируется id одного из них, на котором надо остановить прокрутку.
Тот скрипт, ссылку на который я дал в первом посте подходит наиболее всего, но надо чуток переделать...
Ответить с цитированием
  #4 (permalink)  
Старый 18.01.2018, 11:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Morty,

... оба скрипта по ссылке подходят под вашу задачу ... чем этот то лучше?
Ответить с цитированием
  #5 (permalink)  
Старый 18.01.2018, 12:44
Аватар для Morty
Интересующийся
Отправить личное сообщение для Morty Посмотреть профиль Найти все сообщения от Morty
 
Регистрация: 08.01.2016
Сообщений: 13

Сообщение от рони Посмотреть сообщение
Morty,
... оба скрипта по ссылке подходят под вашу задачу ... чем этот то лучше?
Этот лучше тем, что я знаю как вставить туда свои картинки, в первом варианте картинок нет вообще, а во втором варианте берётся одна большая картинка и режется на куски. Мне же надо брать разные изображения.
Вполне вероятно, что можно их изменить под мои нужды, но увы, я не знаю как

Также этот лучше тем, что можно ему передать id элемента на котором нужно остановить прокрутку (по крайней мере это есть изначально), а в тех я не знаю как такое реализовать
Ответить с цитированием
  #6 (permalink)  
Старый 18.01.2018, 13:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Сообщение от Morty
Также этот лучше тем, что можно ему передать id элемента на котором нужно остановить прокрутку
может не id, а индекс?
Ответить с цитированием
  #7 (permalink)  
Старый 18.01.2018, 13:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Morty,
пример запроса где остановить рулетку
https://javascript.ru/forum/misc/721...tml#post474731
Ответить с цитированием
  #8 (permalink)  
Старый 18.01.2018, 13:51
Аватар для Morty
Интересующийся
Отправить личное сообщение для Morty Посмотреть профиль Найти все сообщения от Morty
 
Регистрация: 08.01.2016
Сообщений: 13

Сообщение от рони Посмотреть сообщение
может не id, а индекс?
Может и индекс...
Суть такова:
php генерирует массив картинок, которые должны прокручиваться в рулетке, php функция (с учётом шанса на выпадение и общего числа элементов) определяет выигрышный элемент.
После этого нужно в рулетке прокрутить массив картинок и остановить рулетку на заданном изображении.
Именно поэтому тот скрипт, ссылку на который я указал в первом сообщении, подходит лучше других.
Я нажимаю на кнопку, отправляется запрос в php-скрипт, который выдаёт массив картинок и номер-победитель, после того, как данные получены - запускается рулетка.

Но, как я сказал выше, мне надо чтоб прокрутка производилась горизонтально и выводилось 11 изображений (хотя можно и 5), а картинка-победитель останавливалась посредине...
Ответить с цитированием
  #9 (permalink)  
Старый 18.01.2018, 15:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

горизонтальная рулетка упрощённый вариант
Morty,

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

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
 <style type="text/css">body{
   position:relative;
 }

 .roulette-inner img{
   width:72px;
   height:72px;
   margin:2px;
 }

 .roulette-inner img.active{
   border:2px solid rgba(89,0,153,.2);
   box-sizing:border-box;
   border-radius:50%;
   padding:-4px 4px 2px 4px;
   transform:scale(1.7);
   z-index:1000;
   background-color:rgba(0,255,127,.5);
 }
 </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
 jQuery.easing['easeOutCirc'] = function (x, t, b, c, d) {
		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
	}
$(function() {
    var option = {
        speed: 6,
        duration: 3,
        stopImageNumber: 4
    };

 $("#go").click(function() {
    option.stopImageNumber = Math.random() * 11|0;
    $(".roulette-inner  img").removeClass("active");
    $("#config").text(JSON.stringify(option));
    $({
        left: 0
    }).animate({
        left: 844 * option.speed + 75 * (option.stopImageNumber + 6)
    }, {
        duration: option.duration * 1000,
        easing: "easeOutCirc",
        step: function(a) {
            $(".roulette-inner").css("transform", "translateX(-" + a % 844 + "px)");
        },
        complete: function() {
            $(".roulette-inner  img").eq(option.stopImageNumber + (option.stopImageNumber < 6) * 11).addClass("active");
        }
    });
  })
});
  </script>
</head>

<body>
<h2>Config: <span id="config"></span></h2>
<div class="roulette" style="overflow: hidden; height: 126px; width: 844px;">
<div class="roulette-inner" style="position: relative; top: 24px; width: 7000px;">
<img src="https://raw.githubusercontent.com/skryshtafovych/Lottery-html5/master/star.png" style="display: block; float: left;">
<img src="https://raw.githubusercontent.com/skryshtafovych/Lottery-html5/master/flower.png" style="display: block; float: left;">
<img src="https://raw.githubusercontent.com/skryshtafovych/Lottery-html5/master/coin.png" style="display: block; float: left;">
<img src="https://raw.githubusercontent.com/skryshtafovych/Lottery-html5/master/mshroom.png" style="display: block; float: left;">
<img src="https://raw.githubusercontent.com/skryshtafovych/Lottery-html5/master/chomp.png" style="display: block; float: left;">
<img src="https://icon-icons.com/icons2/206/PNG/128/Flower_-_Fire_24653.png" style="display: block; float: left;">
<img src="http://img.informer.com/icons_mac/png/128/218/218340.png" style="display: block; float: left;">
<img src="https://icon-icons.com/icons2/249/PNG/128/Lamp_27000.png" style="display: block; float: left;">
<img src="http://www.iconninja.com/files/817/63/651/orange-monster-icon.png" style="display: block; float: left;">
<img src="http://www.fsiv.com/public/images/logo-share/green/logo8.png" style="display: block; float: left;">
<img src="http://wiki.tockdom.com/w/images/3/36/Piranha_Plant_Cup.png" style="display: block; float: left;">
<img src="https://raw.githubusercontent.com/skryshtafovych/Lottery-html5/master/star.png" style="display: block; float: left;">
<img src="https://raw.githubusercontent.com/skryshtafovych/Lottery-html5/master/flower.png" style="display: block; float: left;">
<img src="https://raw.githubusercontent.com/skryshtafovych/Lottery-html5/master/coin.png" style="display: block; float: left;">
<img src="https://raw.githubusercontent.com/skryshtafovych/Lottery-html5/master/mshroom.png" style="display: block; float: left;">
<img src="https://raw.githubusercontent.com/skryshtafovych/Lottery-html5/master/chomp.png" style="display: block; float: left;">
<img src="https://icon-icons.com/icons2/206/PNG/128/Flower_-_Fire_24653.png" style="display: block; float: left;">
<img src="http://img.informer.com/icons_mac/png/128/218/218340.png" style="display: block; float: left;">
<img src="https://icon-icons.com/icons2/249/PNG/128/Lamp_27000.png" style="display: block; float: left;">
<img src="http://www.iconninja.com/files/817/63/651/orange-monster-icon.png" style="display: block; float: left;">
<img src="http://www.fsiv.com/public/images/logo-share/green/logo8.png" style="display: block; float: left;">
<img src="http://wiki.tockdom.com/w/images/3/36/Piranha_Plant_Cup.png" style="display: block; float: left;">
</div>
</div>
<button id="go">Go</button>
</body>
</html>
Ответить с цитированием
  #10 (permalink)  
Старый 18.01.2018, 16:10
Аватар для Morty
Интересующийся
Отправить личное сообщение для Morty Посмотреть профиль Найти все сообщения от Morty
 
Регистрация: 08.01.2016
Сообщений: 13

Поковырял немного скрипт, получилось сделать отображение картинок по горизонтали и прокрутку по горизонтали, однако есть косяки. Изображения не зацикливаются и прокрутка не останавливается...
(function($){
    var Roulette = function(options){
        var defaultSettings={
            maxPlayCount:null,
            speed:10,
            stopImageNumber:null,
            rollCount:3,
            duration:3,
            stopCallback:function(){},
            startCallback:function(){},
            slowDownCallback:function(){}
        };
        var defaultProperty={
            playCount:0,
            $rouletteTarget:null,
            imageCount:null,
            $images:null,
            originalStopImageNumber:null,
            totalHeight:null,
            topPosition:0,
            leftPosition:0,
            maxDistance:null,
            slowDownStartDistance:null,
            isRunUp:true,
            isSlowdown:false,
            isStop:false,
            distance:0,
            runUpDistance:null,
            isIE:navigator.userAgent.toLowerCase().indexOf("msie")>-1
        };
        var p=$.extend({},defaultSettings,options,defaultProperty);
        var reset=function(){
            p.maxDistance=defaultProperty.maxDistance;
            p.slowDownStartDistance=defaultProperty.slowDownStartDistance;
            p.distance=defaultProperty.distance;
            p.isRunUp=defaultProperty.isRunUp;
            p.isSlowdown=defaultProperty.isSlowdown;
            p.isStop=defaultProperty.isStop;
//            p.topPosition=defaultProperty.topPosition
            p.leftPosition=defaultProperty.leftPosition
        };
        var slowDownSetup=function(){
            if(p.isSlowdown){return}
            p.slowDownCallback();
            p.isSlowdown=true;
            p.slowDownStartDistance=p.distance;
            p.maxDistance=p.distance+2*p.totalHeight;
//            p.maxDistance+=p.imageHeight-p.topPosition%p.imageHeight;
            p.maxDistance+=p.imageWidth-p.leftpPosition%p.imageWidth;

            if(p.stopImageNumber!=null) {
//                p.maxDistance+=(p.totalHeight-p.maxDistance%p.totalHeight+p.stopImageNumber*p.imageHeight)%p.totalHeight}
                p.maxDistance+=(p.totalWidth-p.maxDistance%p.totalWidth+p.stopImageNumber*p.imageWidth)%p.totalWidth}
        };
        var roll=function(){
            var speed_=p.speed;
            if(p.isRunUp){
                if(p.distance<=p.runUpDistance) {
                    var rate_=~~(p.distance/p.runUpDistance*p.speed);
                    speed_=rate_+1
                } else {
                    p.isRunUp=false
                }
            } else if (p.isSlowdown) {
                var rate_=~~((p.maxDistance-p.distance)/(p.maxDistance-p.slowDownStartDistance)*p.speed);
                speed_=rate_+1
            }
            if (p.maxDistance&&p.distance>=p.maxDistance) {
                p.isStop=true;reset();
                p.stopCallback(p.$rouletteTarget.find("img").eq(p.stopImageNumber));
                return
            }
            p.distance+=speed_;
//            p.topPosition+=speed_;
            p.leftPosition+=speed_;
//            if (p.topPosition>=p.totalHeight) {
            if (p.leftPosition>=p.totalWidth) {
//                p.topPosition=p.topPosition-p.totalHeight
                p.leftPosition=p.leftPosition-p.totalWidth
            }
            if (p.isIE) {
//                p.$rouletteTarget.css("top","-"+p.topPosition+"px")
                p.$rouletteTarget.css("left","-"+p.leftPosition+"px")
            }
            else {
//                p.$rouletteTarget.css("transform","translate(0px, -"+p.topPosition+"px)")
                p.$rouletteTarget.css("transform","translate(-"+p.leftPosition+"px, 0px)")
            }
            setTimeout(roll,1)
        };
        var init=function($roulette){
            $roulette.css({overflow:"hidden"});
            defaultProperty.originalStopImageNumber=p.stopImageNumber;
            if (!p.$images) {
                p.$images=$roulette.find("img").remove();
                p.imageCount=p.$images.length;
                p.$images.eq(0).bind("load",function(){
//                    p.imageHeight=$(this).height();
                    p.imageWidth=$(this).width();
//                    $roulette.css({height:p.imageHeight+"px"});
                    $roulette.css({height:p.imageWidth+"px"});
                    $roulette.css({width:p.imageWidth*6+"px"});
//                    p.totalHeight=p.imageCount*p.imageHeight;
                    p.totalWidth=p.imageCount*p.imageWidth;
//                    p.runUpDistance=2*p.imageHeight}
                    p.runUpDistance=2*p.imageWidth}
                ).each(function(){
                    if (this.complete||this.complete===undefined) {
                        var src=this.src;
                        this.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
                        this.src=src
                    }
                })
            }
            $roulette.find("div").remove();
//            p.$images.css({display:"block"});
//            p.$rouletteTarget=$("<div>").css({position:"relative",top:"0"}).attr("class","roulette-inner");
            p.$rouletteTarget=$("<div>").css({position:"relative",left:"0"}).attr("class","roulette-inner");
            $roulette.append(p.$rouletteTarget);
            p.$rouletteTarget.append(p.$images);
            p.$rouletteTarget.append(p.$images.eq(0).clone());
            $roulette.show()
        };
        var start=function() {
            p.playCount++;
            if (p.maxPlayCount&&p.playCount>p.maxPlayCount){return}
            p.stopImageNumber=$.isNumeric(defaultProperty.originalStopImageNumber)&&Number(defaultProperty.originalStopImageNumber)>=0?Number(defaultProperty.originalStopImageNumber):Math.floor(Math.random()*p.imageCount);
            p.startCallback();
            roll();
            setTimeout(function(){slowDownSetup()},p.duration*1e3)
        };
        var stop=function(option) {
            if(!p.isSlowdown){
                if(option) {
                    var stopImageNumber=Number(option.stopImageNumber);
                    if (0<=stopImageNumber&&stopImageNumber<=p.imageCount-1) {
                        p.stopImageNumber=option.stopImageNumber
                    }
                }
                slowDownSetup()
            }
        };
        var option=function(options){
            p=$.extend(p,options);
            p.speed=Number(p.speed);
            p.duration=Number(p.duration);
            p.duration=p.duration>1?p.duration-1:1;
            defaultProperty.originalStopImageNumber=options.stopImageNumber
        };
        var ret={start:start,stop:stop,init:init,option:option};return ret};
        var pluginName="roulette";
        $.fn[pluginName]=function(method,options){
            return this.each(function(){
                var self=$(this);
                var roulette=self.data("plugin_"+pluginName);
                if(roulette) {
                    if (roulette[method]) {roulette[method](options)}
                    else {console&&console.error("Method "+method+" does not exist on jQuery.roulette")}
                }
                else{
                    roulette=new Roulette(method);
                    roulette.init(self,method);
                    $(this).data("plugin_"+pluginName,roulette)
                }
            })
        }
})(jQuery);

var option = {
    speed : 3,
    duration : 3,
    stopImageNumber : 0
}

var count = $('div.roulette').children().length

$('div.roulette').roulette(option);

$('#go').click(function() {
  //option.stopImageNumber = (Math.random() * count) >> 0;
  option.stopImageNumber = '2';
  $('#config').text(JSON.stringify(option))
  $('div.roulette')
    .roulette('option', option)
    .roulette('start');
})


Как тут вставлять спойлер?..
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь с Массивами и функциями Mikekrd Элементы интерфейса 0 23.02.2016 10:20
Нужна помощь по javascript darklend Общие вопросы Javascript 0 12.01.2014 23:33
Скрипт сложение работает не так, нужна помощь! saves7 Общие вопросы Javascript 4 09.08.2013 08:07
Нужна помощь по слайдеру seoguru Работа 3 28.01.2013 22:02
нужна помощь dominosoko Серверные языки и технологии 4 14.03.2010 02:17