Bonjour à tous.
j’essaye de créer un slider pour volet roulant avec l’animation du volet à la position du slider, mais je n’arrive pas à inverser la position du volet par rapport au slider. Voici les 2 images pour plus de compréhension:
Sur l’image, mon slider est à 99%, mon volet est ouvert, mais l’image du volet est fermée

Sur l’image, mon slider est à 0%, mon volet est fermé, mais l’image du volet est ouvert

Voici le code:
<div class="cmd cmd-widget" data-type="action" data-subtype="slider" data-cmd_id="#id#" data-cmd_uid="#uid#" data-version="#version#" >
<div class="title #hide_name#">
<div class="cmdName" style="#hideCmdName#"></div>
</div>
<div id="Valeur" style="display: none;"></div>
<div class="baie#id# black size-m">
<div class="roller"></div>
<span class="background"></span>
<div class="rangesliderVolet#id#">
<input id="write#id#" class="customrange#id#" type="range" orient="horizontal" data-step="1" min="#minValue#" max="#maxValue#" >
<span class="custom-rangeslider__tooltip" style="font-size:15px;
font-family: verdana; color:black;font-weight: bold;" id="bulle#id#"></span>
<div class="range-slider__bar3"></div>
<div class="range-slider__thumb3"></div>
<div id="volet#id#" class="output#id#" style="display: none;" ></div> <!-- ne pas afficher la valeur de output#id#" -->
</div>
<script>
//action de simulation d'ouverture et fermeture des ouvrants
$(".baie#id#").dblclick(function(e) {
$(this).toggleClass("slide", "");
$(".tooltip.dbclic").fadeOut(); //tooltip
});
</script>
<style>
/* dimension des ouvrants */
.size-m {
width: 200px;
height: 150px;
}
.baie#id#{
position: relative;
display: block;
background: transparent;
padding: 5px;
margin: 20px 40px 35px;
transform-style: preserve-3d;
perspective: 300px;
z-index: 10;
float: left;
}
/* vitre de baie & fenetre */
.baie#id#:before,
.baie#id#:after{
display: block;
position: absolute;
content: "";
border: 10px solid black;
width: 47.25%;
height: calc(100% - 10px);
top: 5px;
margin: 0;
box-shadow: 0 1px 2px black, inset 0 0 5px rgba(0, 0, 0, 0.75);
z-index: 20;
background: linear-gradient(
135deg,
rgba(183, 222, 237, 0.25) 0%,
rgba(255, 255, 255, 0.35) 20%,
rgba(113, 206, 239, 0.25) 50%,
rgba(33, 180, 226, 0.15) 51%,
rgba(183, 222, 237, 0.15) 100%
),
linear-gradient(
-165deg,
rgba(224, 243, 250, 0.45) 0%,
rgba(216, 240, 252, 0.25) 50%,
rgba(184, 226, 246, 0.35) 51%,
rgba(182, 223, 253, 0.35) 100%
);
}
.baie#id#:before,
.baie#id#:after {
width: 50% !important;
}
.baie#id#:after {
height: calc(100% - 9px) !important;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.25), inset 0 0 5px rgba(0, 0, 0, 0.75);
}
.baie#id#:before {
box-shadow: 0 1px 2px transparent, inset 0 0 5px rgba(0, 0, 0, 0.75);
border: 10px solid #f1f0f0;
}
.baie#id#:before{
left: 5px;
transition: all 1s ease;
}
.baie#id#:after {
right: 5px;
transition: all 1s ease;
}
/* état ouvert */
.baie#id#.slide:after {
right: 40%;
transition: all 1s ease;
}
/* couleurs */
.black {
border: 5px solid #353535;
box-shadow: inset 0 0 0 5px #2d2d2d, 0 1px 2px 0px rgba(0, 0, 0, 0.75);
}
.black:before,
.black:after {
border: 10px solid #353535!important;
}
/* Volet roulant */
.roller {
display: block;
position: absolute;
width: calc(100% - 10px);
height: 0%;
max-height: calc(100% - 10px);
margin: 0px;
padding: 0;
left: 5px;
right: 5px;
top: 5px;
border-bottom: 4px solid black;
border-left: 2px solid black;
border-right: 2px solid black;
transform: translateZ(-10px);
background-size: 10px 15px !important;
transition:height 1.75s ease .75s ;
}
.black .roller {
background: linear-gradient(0deg, #292929 10%, transparent 25%) 5px 0,
linear-gradient(0deg, transparent 45%, #383838 76%),
linear-gradient(
0deg,
transparent 26%,
#222 38%,
#252525 59%,
transparent 60%
),
#2f2f2f;
}
.black .roller {
border: 4px solid #464646;
border-left: 2px solid #232323;
border-right: 2px solid #232323;
}
/* control slider pour volet roulant */
.rangesliderVolet#id# {
position: absolute;
display: block;
top: 0;
left: 0;
width: 20px;
margin-top: 0px;
transition: all 1s ease;
margin-left: 5px;
height: 100%;
padding: 0;
}
.windows#id#.open .rangesliderVolet#id#{
margin-left: -130px;
}
/* fond de fenêtre */
.background {
display: block;
background-image: url('data/customTemplates/dashboard/cmd.action.other.Multi-action-Defaut/fenetre/Back02.png');/* unique image ;) */
background-repeat: no-repeat;
background-size: cover;
width: 100%;
height: 100%;
transform: translateZ(-11px);
animation: day 360s infinite;
box-shadow: inset 0 0 20px 10px rgba(0, 0, 0, 0.25);
}
/* Deuxieme Slider */
.rangesliderVolet#id# {
display: block;
margin-left: -105px;
margin-top:-85px;
width: 150px;
position: relative;
text-align: center;
height: 50px;
max-height: 100%;
transform: rotate(-90deg);
}
.range-slider__thumb3 {
position: absolute;
/*left: 7.5px; /* position de la bulle à gauche */
width: 25px;
height: 25px;
line-height: 25px;
background: white; /* couleur du fond de la bulle */
color: black; /* Couleur du texte de la bulle*/
font-size: 100%; /* Taille du texte de la bulle*/
box-shadow: 0 0 0 4px #80FF00; /* Couleur et taille du contour de la bulle*/
border-radius: 50%;
pointer-events: none;
transform: translate(30%, -155%) rotate(90deg);
}
.range-slider__bar3 {
left: 7px;
bottom: 21px; /* position de la barre de défilement par raport au haut */
position: absolute;
/* couleur de la barre de défilement*/
background: linear-gradient(#000, #000) no-repeat, linear-gradient(45deg, rgba(0, 0, 0, .55) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, .55) 75%), linear-gradient(45deg, rgba(0, 0, 0, .55) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, .55) 75%), linear-gradient(0deg, #C8FE2E, #01DF01);
background-position: 50% 0, 0 0, 0.1875em 0.1875em;
background-size: 0% 100%, 0.375em 0.375em, 0.375em 0.375em, 100% 100%;
/* couleur de la barre de défilement*/
pointer-events: none;
height: 8px;
width: 150px;
border-radius: 10px;
}
.rangesliderVolet#id# input[type=range][orient=horizontal] {
position: relative;
margin: 0;
height: 100%;
width: 100%;
display: inline-block;
position: relative;
writing-mode: horizontal-bt;
-webkit-appearance: slider-horizontal;
}
.rangesliderVolet#id# input[type=range][orient=horizontal]::-webkit-slider-runnable-track, .rangesliderVolet#id# input[type=range][orient=horizontal]::-webkit-slider-thumb {
-webkit-appearance: none;
}
.rangesliderVolet#id# input[type=range][orient=horizontal]::-webkit-slider-runnable-track {
/*box-sizing: border-box;*/
border: solid 1px #000;
width: 150px;
height: 22px;
box-shadow: 0 1px 1px rgba(119, 119, 119, .4), inset 0 0.325em 0.25em #0c0c0b, inset 0 0 0 0.375em #2a2a29, inset 0 0 0 0.5em #000;
border-radius: 0.95em;
background: #000;
background: linear-gradient(27deg, #151515 0.125em, transparent 0.125em) 0 0.125em, linear-gradient(207deg, #151515 0.125em, transparent 0.125em) 0.25em 0px, linear-gradient(27deg, #222 0.125em, transparent 0.125em) 0px 0.25em, linear-gradient(207deg, #222 0.125em, transparent 0.125em) 0.25em 0.125em, linear-gradient(90deg, #1b1b1b 0.25em, transparent 0.25em), linear-gradient(#1d1d1d 25%, #1a1a1a 25%, #1a1a1a 50%, transparent 50%, transparent 75%, #242424 75%, #242424) #131313;
background-size: 0.5em 0.5em;
cursor:pointer;
}
.rangesliderVolet#id# input[type=range][orient=horizontal]::-webkit-slider-thumb {
width: 30px;
height: 30px;
opacity: 0;
cursor:pointer;
}
.custom-rangeslider__tooltip {
line-height: 10px;
position: absolute;
height: 30px; /*Hauteur de la bulle */
width: 50px; /*Largeur de la bulle */
background-color: #fff; /* couleur du fond de la bulle */
padding: 8px 4px;
border: 3px #80FF00 solid;
top: -40px; /*Position de la bulle */
left: 0;
text-align: center;
border-radius: 13px;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
user-select: none;
pointer-events: none;
opacity:0;
}
.custom-rangeslider__tooltip:after {
display: block;
content: '';
background: #fff;
position: absolute;
border: 3px #80FF00 solid;
border-top: 0;
border-left: 0;
width: 10px;
height: 10px;
left: calc(95% - 0px);
bottom: 7px;
transform: rotate(-45deg);
}
/* Survol du slider Afficher la bulle */
.rangesliderVolet#id#:hover #bulle#id# {
opacity:1;
box-shadow: 0 0px 25px rgba(130, 250, 88, .7);
}
.custom-rangeslider__label {
width: 100%;
display: block;
}
.custom-rangeslider__label span {
display: block;
}
.custom-rangeslider__label-min {
float: left;
}
.custom-rangeslider__label-max {
float: right;
}
.custom-rangeslider__label:after {
content: "";
display: table;
clear: both;
}
</style>
<script>
var Value;
jeedom.cmd.update['#id#'] = function(_options){
volet#id#.innerHTML = _options.display_value;
$('#write#id#').val(_options.display_value);
Value = this.value;
Valeur.innerHTML = Value;
$("input.customrange#id#").change("input", function() {
$(this)
.parent()
.siblings(".roller")
.css("height", $(this).val() + "%")
});
$("input.customrange#id#").load("input", function() {
$(this)
.parent()
.siblings(".roller")
.css("height", $(this).val() + "%")
});
//action de simulation d'ouverture et fermeture des ouvrants
/*$(".windows").dblclick(function(e) {
$(this).toggleClass("open", "");
$(".tooltip.dbclic").fadeOut(); //tooltip
});*/
let app = (() => {
function updateSlider(element) {
if (element) {
let parent = element.parentElement,
lastValue = parent.getAttribute('data-slider-value');
if (lastValue === element.value) {
return; // No value change, no need to update then
}
parent.setAttribute('data-slider-value', element.value);
let $thumb = parent.querySelector('.range-slider__thumb3'),
$bar = parent.querySelector('.range-slider__bar3'),
pct = (element.value - element.min) / element.max * 100 * ((parent.clientWidth - $thumb.clientWidth) / parent.clientWidth);
$thumb.style.left = `${pct}%`;
$bar.style.width = `calc(${pct}% + ${$thumb.clientWidth/2}px)`;
$thumb.textContent = '' + (element.value / (element.dataset.step || 1));
}
}
return {
updateSlider: updateSlider
};
})();
(function initAndSetupTheSliders() {
const inputs = [].slice.call(document.querySelectorAll('.rangesliderVolet#id# input'));
inputs.forEach(input => input.setAttribute('value', ''));
inputs.forEach(input => app.updateSlider(input));
// Cross-browser support where value changes instantly as you drag the handle, therefore two event types.
inputs.forEach(input => input.addEventListener('input', element => app.updateSlider(input)));
inputs.forEach(input => input.addEventListener('change', element => app.updateSlider(input)));
})();
//Script tooltip//
(function(win, dom){
'use strict';
// Check for .rangeControl class
var rangeControlList = dom.getElementsByClassName('customrange#id#');
// Inits components
var init = function(){
// Loop all controls
for (var i = 0; i < rangeControlList.length; i++) {
// Apply inital
updateController(rangeControlList[i]);
// Update when changed
rangeControlList[i].addEventListener('input', function() {
updateController(this);
});
// Update when changed ( for older browsers )
rangeControlList[i].addEventListener('change', function() {
updateController(this);
});
}
}
// Updates components
var update = function(){
for (var i = 0; i < rangeControlList.length; i++) {
updateController(rangeControlList[i]);
}
}
// Update controller
var updateController = function(obj){
// Thumb Position
var thumbPos = getThumbPercentage(obj);
var thumPosPX = getThumbPosition(obj);
if(obj.getAttribute("data-tooltip") != "false"){
updateTooltip(obj.nextElementSibling, obj.value, thumPosPX, thumbPos);
}else{
obj.nextElementSibling.style.display = "none";
}
//updateProgress(obj, 'transparent', ('#C8FE2E, #01DF01'), thumbPos);
}
// Retun range slider pixel position according to offset
// obj : target object
var getThumbPosition = function(obj){
return Math.round((obj.offsetWidth / 100) * obj.value); // Pixel
}
// Retun range slider percentage to thumb position
// obj : target object
var getThumbPercentage = function(obj){
return Math.round(100 * obj.value/obj.getAttribute("max")); // Percentage
}
// Updated range slider tooltip
// obj : target object
// text : tooltip label
// position : absolute position
// percentage : percentage of current value
var updateTooltip = function(obj, text, position, percentage){
obj.innerHTML = text; // Tooltip text
obj.style.left = position + 'px'; // Tooltip position
// Tooltip Position
var tooltipStartPos = 8;
var tooltipPosFix = percentage / 1.8;
if(percentage > 50){
tooltipPosFix = percentage / 2.2;
}
obj.style.transform = 'translate(-'+ (tooltipStartPos + tooltipPosFix) +'%, 0) rotate(90deg)';
//Rotation du texte de la bulle
}
// Updated background progress bar of range slider
// obj : target object
// progressBgColor : background color
// progressFillColor : fill color
// percentage : percentage of current value
var updateProgress = function(obj, progressBgColor, progressFillColor, percentage){
var rangeBg = 'linear-gradient(to right, '+ progressFillColor +' 0%, '+ progressFillColor +' '+ percentage +'%, '+ progressBgColor +' '+ percentage +'%, '+ progressBgColor +' 100%)';
var cssRule = '#'+ obj.id +'::-webkit-slider-runnable-track { background : '+ rangeBg +' } ';
cssRule += '#'+ obj.id +'::-moz-range-track { background : '+ rangeBg +' } ';
cssRule += '#'+ obj.id +'::-ms-track { background : '+ rangeBg +' } ';
var applyStyle = function(styleName, cssText) {
var styleElement = dom.getElementById(styleName);
if (styleElement) dom.getElementsByTagName('head')[0].removeChild(styleElement);
styleElement = dom.createElement('style');
styleElement.type = 'text/css';
styleElement.id = styleName;
styleElement.innerHTML = cssText;
dom.getElementsByTagName('head')[0].appendChild(styleElement);
}
applyStyle('range_'+ obj.id, cssRule);
}
// Refresh on resize
var fireOnceOnResize;
win.addEventListener('resize', function () {
fireOnceOnResize = setTimeout(update, 100);
});
// Init Component
init();
}(window, document));
}
var customrange#id# = document.getElementById("write#id#");
var output#id# = document.getElementById("volet#id#");
output#id#.innerHTML = customrange#id#.value;
customrange#id#.oninput = function() {
output#id#.innerHTML = this.value;
}
write#id#.oninput = function() {
Value = this.value;
Valeur.innerHTML = Value;
}
/* var customrange = document.getElementById("write#id#");
var output#id# = document.getElementById("volet#id#");
output#id#.innerHTML = customrange.value;
customrange.onmousemove = function() {
output#id#.innerHTML = this.value;
} */
var customrange#id# = document.getElementById("write#id#");
var output#id# = document.getElementById("volet#id#");
output#id#.innerHTML = customrange#id#.value;
customrange#id#.onchange = function() {
output#id#.innerHTML = this.value;
jeedom.cmd.execute({id: '#id#', value: {slider: Value}});
}
jeedom.cmd.update['#id#']({display_value:'#state#',valueDate:'#valueDate#',collectDate:'#collectDate#',alertLevel:'#alertLevel#'});
</script>
</div>
Merci à tous pour votre aide.