Как сделать выбор приза в виде колеса-рулетки через форму ZeroBlock в Tilda
Сейчас узнаем, какой подарок выпадет именно Вам.
Вращайте колесо!

Как сделать выбор приза в виде колеса-рулетки через форму ZeroBlock в Tilda

1
Создали ZeroBlock с кнопкой вызова окна. Задали этой кнопке класс open-wheel
2
Создаём ZeroBlock для формы и колеса
Высота Window - 100%
Высота Grid по экранам 700/700/920/810/690

3
Создаём Add HTML, очищаем его.
Задаём ему класс wheelfortune
Выставляем размеры сторон (квадрат) - 500/500/500/380/260
4
Создаём элемент для кнопки вращения с классом spin_wheel
(в примере это Image)
5
Создаём Image с подарком. Задаём ему класс present_img
6
Создаём Text под подарком. Задаём ему класс present_text
7
Создаём форму с классом wheel_form
В форму добавляем скрытое поле (hidden field)
C именем sector_prize
8
Вставили код на страницу в блок Т123
В коде прописали цвет секторов, название секторов и ссылки на иконки

['#EBF7FE' , 'Cертификат<br><strong>На 5000 руб</strong>' , 'https://static.tildacdn.com/tild3732-3366-4666-b137-636632616132/901435.svg'],
['#C7E2FB' , 'Мороженка<br><strong>5 кг барбарис</strong>' , 'https://static.tildacdn.com/tild6564-3832-4466-a662-333733396635/3189701.svg'],
['#EBF7FE' , 'Подарок<br><strong>Что-то полезное</strong>' , 'https://static.tildacdn.com/tild3364-3432-4437-b065-663536363437/4062925.svg'],
['#C7E2FB' , 'Игрушка<br><strong>Плюшевый мишка</strong>' , 'https://static.tildacdn.com/tild6631-3132-4330-b130-643839333161/3989895.svg'],
['#EBF7FE' , 'Букет цветов<br><strong>33 красные розы</strong>' , 'https://static.tildacdn.com/tild3830-3439-4764-b831-313939346337/3095126.svg'],
['#C7E2FB' , 'Пицца<br><strong>50 см Маргарита</strong>' , 'https://static.tildacdn.com/tild6239-3933-4839-a666-303739343233/1404945.svg'],
['#EBF7FE' , 'Самокат<br><strong>Yedoo Mula RunRun</strong>' , 'https://static.tildacdn.com/tild6666-3931-4639-b563-306134666563/2513205.svg'],
['#C7E2FB' , 'Рюкзак<br><strong>Bobby Hero</strong>' , 'https://static.tildacdn.com/tild3035-3230-4136-a235-316639663465/2333041.svg'],
['#EBF7FE' , 'Скидка<br><strong>25% на всё</strong>' , 'https://static.tildacdn.com/tild3366-6430-4430-a361-353063346339/582843.svg'],
9
Если нужно корректировать вероятность, то пишем true и проставляем процент на каждый сектор

//Вероятность
let prob = true; // true - включить смещение вероятности ; false - отключить

let probability = [10, 15, 15, 10, 5, 10, 5, 10, 20]; //Распределение вероятности в процентах

<style>
/*Общий Контейнер*/
.wheel_wrp {
    width: inherit;
    box-sizing: border-box;
    box-shadow: 0 0 0 10px #ffffff, 0 0 15px 3px #ababab;
    position: relative;
    overflow: hidden;
    border-radius: 50%;
}
/*Ось колеса в центре*/
.wheel_wrp:after {
    content: "";
    width: 35px;
    height: 35px;
    border-radius: 50%;
    background-color: #fff;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
}
/*Оформление сектора*/
.wheel_sector{
    width: 0px;
    height: 0px;
    border-style: solid;
    position: absolute;
    top: 0;
    display: flex;
    justify-content: center;
    align-items: center;
}
/*Оформление разделительных линий*/
.wheel_line {
    background-color: #fff; /*Цвет линии*/
    transform: rotate(0deg);
    height: 4px;
    position: absolute;
    z-index: 99;
}
/*Оформление текста*/
.wheel_textcont {
    position: absolute;
    top: 0;
    z-index: 99999;
    display: flex;
    flex-direction: column-reverse;
    justify-content: flex-end;
    align-items: center;
    font-family: 'Open Sans',Arial,sans-serif;
    font-weight: 300;
    color: #000;
    font-size: 14px;
    line-height: 1.4;
    text-align: center;
}
.wheel_textcont div {
    transform: rotate(-90deg);
    margin-top: 35px;
    width: 120px;
}
/*Иконка*/
.wheel_textcont img {
    width: 45px;
    transform: rotate(-90deg);
    margin-top: 15px;
}
/*Адаптив текст + иконка*/
@media screen and (max-width:640px){
.wheel_textcont div {display: none}    
.wheel_textcont img {
    width: 65px;
    margin-top: 25px;
}
}
@media screen and (max-width:480px){
.wheel_textcont img {
    width: 45px;
    margin-top: 20px;
}
}
.spin_wheel , .open-wheel , .close-wheel{ cursor:pointer}
.spin_wheel {  transition: all 0.2s linear}
.spin_wheel:hover {filter: sepia(1)}
.form_noactive{
    opacity:0.4;
    pointer-events:none;
}
.wheel_form .t-input-subtitle,
.wheel_form input.t-input{
    text-align: center;
}

.wheel-time{transition: transform 0.5s ease-in-out}
.wheel-open-body{overflow:hidden}

.spin_wheel {
    opacity: 0;
    pointer-events: none;
}
.spin_wheel.show-btn {
    opacity: 1;
    pointer-events: auto;
}

div#tildaformsuccesspopup {
    display: none !important;
}



</style>

<script>
$( document ).ready(function() {
    
//Список секторов : Цвет - Текст - ссылка на иконку    
let wheelOption = [
    ['#EBF7FE' , 'Cертификат<br><strong>На 5000 руб</strong>' , 'https://static.tildacdn.com/tild3732-3366-4666-b137-636632616132/901435.svg'],
    ['#C7E2FB' , 'Мороженка<br><strong>5 кг барбарис</strong>' , 'https://static.tildacdn.com/tild6564-3832-4466-a662-333733396635/3189701.svg'],
    ['#EBF7FE' , 'Подарок<br><strong>Что-то полезное</strong>' , 'https://static.tildacdn.com/tild3364-3432-4437-b065-663536363437/4062925.svg'],
    ['#C7E2FB' , 'Игрушка<br><strong>Плюшевый мишка</strong>' , 'https://static.tildacdn.com/tild6631-3132-4330-b130-643839333161/3989895.svg'],
    ['#EBF7FE' , 'Букет цветов<br><strong>33 красные розы</strong>' , 'https://static.tildacdn.com/tild3830-3439-4764-b831-313939346337/3095126.svg'],
    ['#C7E2FB' , 'Пицца<br><strong>50 см Маргарита</strong>' , 'https://static.tildacdn.com/tild6239-3933-4839-a666-303739343233/1404945.svg'],
    ['#EBF7FE' , 'Самокат<br><strong>Yedoo Mula RunRun</strong>' , 'https://static.tildacdn.com/tild6666-3931-4639-b563-306134666563/2513205.svg'],
    ['#C7E2FB' , 'Рюкзак<br><strong>Bobby Hero</strong>' , 'https://static.tildacdn.com/tild3035-3230-4136-a235-316639663465/2333041.svg'],
    ['#EBF7FE' , 'Скидка<br><strong>25% на всё</strong>' , 'https://static.tildacdn.com/tild3366-6430-4430-a361-353063346339/582843.svg'],
    
];

//Вероятность
let prob = true; // true - включить смещение вероятности ; false - отключить

//let probability = [10, 15, 15, 10, 5, 10, 5, 10, 20]; //Распределение вероятности в процентах

let probability = [20, 20, 20, 20, 20]; //Распределение вероятности в процентах

let probabilityFinal = [];
let probMem = 0;
$.each(probability,function(index,value){
    probMem +=value; 
    probabilityFinal.push(probMem);
});



//Создаём элемент в Zero
let sector = wheelOption.length;
$('.wheelfortune').append('<div class="wheel_wrp"></div>');
$('.wheelfortune').html($('.wheel_wrp'));
let wheelRec = $('.wheelfortune').closest('.t-rec');
wheelRec.addClass('wheel-pos slide-wheel');
$('.close-wheel').fadeOut(200);
//Кол-во оборотов до остановки
let maxRevolution = 5;
//Время вращения
let spinTime = 1;
let spinFinish = false;
let resizeTxt;
let diameter;

//Создание колеса
function creatingWheel(){
//Диаметр колеса
diameter = $('.wheel_wrp').width();
//Угол сектора
let angle = Number(((360*Math.PI)/(sector*180)).toFixed(3));
//Катет сектора
let sectorHalfWidth = 0.5*diameter*Math.tan(angle/2);
//Заполняем сектора
for (let i=0; i<sector; i++){
$('.wheel_wrp').append('<div class="wheel_sector bg-sector'+i+'"></div><div class="wheel_line line-sector'+i+'"></div><div class="wheel_textcont text-sector'+i+'"><div></div><img src='+wheelOption[i][2]+'></div>');
//Формируем угол поворота и задаём цвет
$('.bg-sector'+i+'').css({
    "transform":"rotate("+(360*i/sector+90)+"deg)",
    "border-color": ""+wheelOption[i][0]+" transparent"
});
//Отрисовка границ сектора
$('.line-sector'+i+'').css({
    "width" : diameter/2+"px",
    "transform" : "rotate("+((360*i/sector)+(180*(sector-1))/sector)+"deg)",
    "height":"4px",
    "top" : "calc(50% - 2px)",
    "transform-origin" : diameter/2+"px 2px"
});
//Расставляем текст
$('.text-sector'+i+' div').html(wheelOption[i][1]);
// Формируем угол для текста
$('.text-sector'+i+'').css({"transform":"rotate("+(360*i/sector+90)+"deg)"});
};
//Форма сектора
$('.wheel_sector').css({
    "border-width": (diameter/2)+"px "+sectorHalfWidth+"px 0",
    "transform-origin": ""+sectorHalfWidth+"px "+(diameter/2)+"px",
    "left":((diameter/2)-sectorHalfWidth)+"px"
});
//Форма текста
$('.wheel_textcont').css({
    "width": (diameter/2)+"px",
    "height": (diameter/2)+"px",
    "transform-origin": ""+(diameter/4)+"px "+(diameter/2)+"px",
    "left":((diameter/2)-(diameter/4))+"px",
});
}; creatingWheel();

//Вращение колеса
function spinWheel(deg){
    $('.wheel_wrp').css({
       "height": diameter+"px",
       "transform" : "rotate("+deg+"deg)",
       "transition": "transform "+spinTime+"s cubic-bezier(0, 0.76, 0.5, 1.01)"
    });
};spinWheel(0);
//Случайный сектор    
function getRandomInRange(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
let finalSector = -1;


//Отправка формы
$('.wheel_form').delegate(".t-submit", "click", function(){
    
    if (prob) {
        //Получаем финальный сектор 
        finalSector = getRandomInRange(0, 100);
        $.each(probabilityFinal,function(index,value){
            if(finalSector <= value) {
                finalSector = index;
                return false;
            }; 
        });
    }else{
        //Получаем финальный сектор 
        finalSector = getRandomInRange(0, sector-1);
    };
    
    let prizTxt = wheelOption[finalSector][1];
    let prizeImg = wheelOption[finalSector][2];
    spinFinish = true;
   
   resizeTxt = prizTxt.replace(/<\/?[^>]+>/g,' ');
        $('input[name="sector_prize"]').val(resizeTxt);
    
    
    
    
    setTimeout(function(){
        if ( $('.wheel_form .t-form').hasClass("js-send-form-success")){
            localStorage['_wh_send'] = 'sf';
            //$('.spin_wheel').addClass('show-btn');
            blockForm();
            $('body').removeClass('t-body_success-popup-showed');
            
            
        //Поворачиваем колесо
    spinWheel(  (maxRevolution*360 +  (finalSector*360)/sector)*(-1) );
    //if (finalSector==0) finalSector=sector;
    //Выводим текст и картинку
    setTimeout(function(){
    let prizTxt = wheelOption[finalSector][1];
    let prizeImg = wheelOption[finalSector][2];
    spinFinish = true;
    finalStep('Ваш приз:<br>'+prizTxt, prizeImg);
    //Сохраняем результат
    let finalResult  = {
        text: prizTxt , 
        img: prizeImg ,
        sect:finalSector
    };
    localStorage.setItem('_code_w', JSON.stringify(finalResult));
    }, spinTime*1000);    
            
            
            
        };
    }, 1000);
    
 
});





//При нажатии на кнопку вращения
$('.spin_wheel .tn-atom').click(function(e) {
    
    // //Поворачиваем колесо
    // spinWheel(  (maxRevolution*360 +  (finalSector*360)/sector)*(-1) );
    // //if (finalSector==0) finalSector=sector;
    // //Выводим текст и картинку
    // setTimeout(function(){
    // let prizTxt = wheelOption[finalSector][1];
    // let prizeImg = wheelOption[finalSector][2];
    // spinFinish = true;
    // finalStep('Ваш приз:<br>'+prizTxt, prizeImg);
    // //Сохраняем результат
    // let finalResult  = {
    //     text: prizTxt , 
    //     img: prizeImg ,
    //     sect:finalSector
    // };
    // localStorage.setItem('_code_w', JSON.stringify(finalResult));
    // }, spinTime*1000);
    
    
});


//Проверка прошлого вращения
let prevResult = localStorage.getItem('_code_w');let prevList;
let prevSend = localStorage['_wh_send'];
if (prevResult) {
    
    
    // prevList = JSON.parse(prevResult);
    // spinFinish = true;
    // $('.wheel_form button').attr('type','submit');
    // let preffTxt = '<u>Ваш прошлый приз</u><br>';
    // if(prevSend){
    //     preffTxt = '<u>Заявка уже была отправлена</u><br>';
    //     blockForm();
    //     spinFinish = false;
    // };
    
    // blockForm();
    
    // setTimeout(function(){
    //     $('.wheel_form').addClass('form_noactive');
        
    // }, 500);

    // setTimeout(function(){
    //     $('.wheel_form button').attr('type','button');

        
    // }, 3500);
    
    // finalStep(preffTxt+prevList.text, prevList.img);
    // //spinWheel( (prevList.sect*360)/sector );
    //  spinWheel(  ((prevList.sect*360)/sector)*(-1) );
    
};

//Блокируем форму
function blockForm(){
if(!prevResult || prevSend ){
    
$('.wheel_form').addClass('form_noactive');
    //$('.wheel_form').hide();
    $('.wheel_form').addClass('form_noactive');
    setTimeout(function(){
        $('.wheel_form button').attr('type','button');
        
    }, 3500);
};
};//blockForm();


//Отрисовка финального шага
function finalStep(prizTxt, prizeImg){
    //Удаляем кнопку
    //$('.spin_wheel').remove();    
    $('.present_text .tn-atom').html(prizTxt);
    $('.present_img img').attr({
        'data-original':prizeImg,
        'src':prizeImg
    });
    //Открываем форму
   if(spinFinish){ 
    //$('.wheel_form').removeClass('form_noactive');
    $('.wheel_form button').attr('type','submit');
   };
    //Заполняем поле
    //setTimeout(function(){
        resizeTxt = prizTxt.replace(/<\/?[^>]+>/g,' ');
        $('input[name="sector_prize"]').val(resizeTxt);
    //}, 2500);
};
//Изменение размера окна
$( window ).resize(function() {
clearTimeout(window.resizedFinished); 
window.resizedFinished = setTimeout(function(){
    $('.wheel_wrp').empty();creatingWheel();
    if(finalSector>=0) { spinWheel( ((finalSector*360)/sector)*(-1) )
    }else if (prevResult) {
        spinWheel( ((prevList.sect*360)/sector)*(-1) );
    }else{spinWheel();};
    setTimeout(function(){    
        if(!spinFinish){  //$('.wheel_form button').attr('type','button');
        }else{ $('input[name="sector_prize"]').val(resizeTxt) };
    }, 3500);    
}, 500);
});  

//Показать блок
let firstOpen = true;
$('.open-wheel').click(function(){
    $('body').addClass('wheel-open-body');
    wheelRec.addClass('wheel-time').removeClass('slide-wheel');
    if(firstOpen && !prevResult ) {spinWheel(360); firstOpen = false};
    setTimeout(function(){
       $('.close-wheel').fadeIn(200);
       //t_lazyload_update();
    }, 550);
});

//Скрыть блок
function closeWheel(){ $('body').removeClass('wheel-open-body');$('.close-wheel').fadeOut(0); wheelRec.addClass('slide-wheel');};
$('.close-wheel').click(function(){closeWheel();});
$(document).keydown(function(eventObject){
	if(eventObject.which == 27 && !wheelRec.hasClass('slide-wheel')){closeWheel()};
});
});
</script>   



Made on
Tilda