这是我的第一篇文章,所以请原谅我的英语。
我的Image Carousel VC组件存在问题。我需要设置类似于标识滑块(连续5个徽标)的东西,当我将其设置为从6个图像中显示5时,最后会有一个间隙(如4个空格)。
我的演讲:
添加了6张图片, 每个视图的幻灯片:5, 滑块循环:是的
目标是将carouse设置为循环,图像之间没有任何空白区域。
还有一个反应灵敏的问题。当我调整浏览器窗口图像的大小时失去它们的比例(宽度是缩放百分比和高度是固定的)。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
将Humberto Silva的post移植到Stack Overflow答案中,似乎没有内置方法可以执行此操作,但是JavaScript中有一种解决方法。
首先,在轮播元素中添加一个额外的类vc_custominfiniteloop
。
然后,在加载jQuery和Visual Composer javascript后添加以下JavaScript代码:
/*
Turn Visual Composer Image Carousel into Visual Composer Infinite Image Carousel
Include before the </head> tag on yout theme's header.php
Read the detailed step-by-step at https://humbertosilva.com/visual-composer-infinite-image-carousel/
*/
// auxiliary code to create triggers for the add and remove class for later use
(function($){
$.each(["addClass","removeClass"],function(i,methodname){
var oldmethod = $.fn[methodname];
$.fn[methodname] = function(){
oldmethod.apply( this, arguments );
this.trigger(methodname+"change");
return this;
}
});
})(jQuery);
// main function for the infinite loop
function vc_custominfiniteloop_init(vc_cil_element_id){
var vc_element = '#' + vc_cil_element_id; // because we're using this more than once let's create a variable for it
window.maxItens = jQuery(vc_element).data('per-view'); // max visible items defined
window.addedItens = 0; // auxiliary counter for added itens to the end
// go to slides and duplicate them to the end to fill space
jQuery(vc_element).find('.vc_carousel-slideline-inner').find('.vc_item').each(function(){
// we only need to duplicate the first visible images
if (window.addedItens < window.maxItens) {
if (window.addedItens == 0 ) {
// the fisrt added slide will need a trigger so we know it ended and make it "restart" without animation
jQuery(this).clone().addClass('vc_custominfiniteloop_restart').removeClass('vc_active').appendTo(jQuery(this).parent());
} else {
jQuery(this).clone().removeClass('vc_active').appendTo(jQuery(this).parent());
}
window.addedItens++;
}
});
// add the trigger so we know when to "restart" the animation without the user knowing about it
jQuery('.vc_custominfiniteloop_restart').bind('addClasschange', null, function(){
// navigate to the carousel element , I know, its ugly ...
var vc_carousel = jQuery(this).parent().parent().parent().parent();
// first we temporarily change the animation speed to zero
jQuery(vc_carousel).data('vc.carousel').transition_speed = 0;
// make the slider go to the first slide without animation and because the fist set of images shown
// are the same that are being shown now the slider is now "restarted" without that being visible
jQuery(vc_carousel).data('vc.carousel').to(0);
// allow the carousel to go to the first image and restore the original speed
setTimeout("vc_cil_restore_transition_speed('"+jQuery(vc_carousel).prop('id')+"')",100);
});
}
// restore original speed setting of vc_carousel
function vc_cil_restore_transition_speed(element_id){
// after inspecting the original source code the value of 600 is defined there so we put back the original here
jQuery('#' + element_id).data('vc.carousel').transition_speed = 600;
}
// init
jQuery(document).ready(function(){
// find all vc_carousel with the defined class and turn them into infine loop
jQuery('.vc_custominfiniteloop').find('div[data-ride="vc_carousel"]').each(function(){
// allow time for the slider to be built on the page
// because the slider is "long" we can wait a bit before adding images and events needed
var vc_cil_element = jQuery(this).prop("id");
setTimeout("vc_custominfiniteloop_init('"+vc_cil_element+"')",2000);
});
});
如果遇到问题,请尝试使用PHP_INT_MAX并使其排队,具体取决于jQuery,例如:
function enqueue_my_scripts()
{
// This example expects you to create a file with the JavaScript above in wp-content/themes/yourtheme/assets/js/infinite_visualcomposer_carousel.js
wp_enqueue_script('infinite-vs-carousel', get_stylesheet_directory_uri() . 'assets/js/infinite_visualcomposer_carousel.js', array('jquery'), filemtime(get_stylesheet_directory() . '/assets/js/infinite_visualcomposer_carousel.js'), true);
}
add_action('wp_enqueue_scripts', 'enqueue_my_scripts', PHP_INT_MAX);
所有功劳归Humberto Silva所有,我只是在这里移植此答案,以在博客离线时保存解决方案。
答案 1 :(得分:0)
/* 将 Visual Composer Image Carousel 变成 Visual Composer Infinite Image Carousel 在你主题的 header.php 上的标签之前包含 在 https://humbertosilva.com/visual-composer-infinite-image-carousel/ 阅读详细的分步说明 */
// auxiliary code to create triggers for the add and remove class for later use
(function($){
$.each(["addClass","removeClass"],function(i,methodname){
var oldmethod = $.fn[methodname];
$.fn[methodname] = function(){
oldmethod.apply( this, arguments );
this.trigger(methodname+"change");
return this;
}
});
})(jQuery);
// init
jQuery(document).ready(function(){
// find all vc_carousel with the defined class and turn them into infine loop
jQuery('.vc_custominfiniteloop').find('div[data-ride="vc_carousel"]').each(function(){
// allow time for the slider to be built on the page
// because the slider is "long" we can wait a bit before adding images and events needed
var vc_cil_element = jQuery(this).prop("id");
setTimeout(vc_custominfiniteloop_init(vc_cil_element),3000);
});
});
// main function for the infinite loop
function vc_custominfiniteloop_init(vc_cil_element_id){
var vc_element = '#' + vc_cil_element_id; // because we're using this more than once let's create a variable for it
window.maxItens = jQuery(vc_element).data('per-view'); // max visible items defined
window.addedItens = 0; // auxiliary counter for added itens to the end
// go to slides and duplicate them to the end to fill space
jQuery(vc_element).find('.vc_carousel-slideline-inner').find('.vc_item').each(function(){
// we only need to duplicate the first visible images
if (window.addedItens < window.maxItens) {
if (window.addedItens == 0 ) {
// the fisrt added slide will need a trigger so we know it ended and make it "restart" without animation
jQuery(this).clone().addClass('vc_custominfiniteloop_restart').removeClass('vc_active').appendTo(jQuery(this).parent());
} else {
jQuery(this).clone().removeClass('vc_active').appendTo(jQuery(this).parent());
}
window.addedItens++;
}
});
// add the trigger so we know when to "restart" the animation without the user knowing about it
jQuery('.vc_custominfiniteloop_restart').bind('addClasschange', null, function(){
// navigate to the carousel element , I know, its ugly ...
var vc_carousel = jQuery(this).parent().parent().parent().parent();
// first we temporarily change the animation speed to zero
jQuery(vc_carousel).data('vc.carousel').transition_speed = 0;
// make the slider go to the first slide without animation and because the fist set of images shown
// are the same that are being shown now the slider is now "restarted" without that being visible
jQuery(vc_carousel).data('vc.carousel').to(0);
// allow the carousel to go to the first image and restore the original speed
setTimeout(vc_cil_restore_transition_speed(jQuery(vc_carousel).prop('id')),5000);
});
// // restore original speed setting of vc_carousel
function vc_cil_restore_transition_speed(element_id){
// after inspecting the original source code the value of 600 is defined there so we put back the original here
jQuery('#' + element_id).data('vc.carousel').transition_speed = 5000;
}
}
感谢 Humberto Silva,我只是将这个答案移植到这里以保存解决方案,以防博客离线。
刚刚根据我的需要对此代码进行了一些修复。所以不要问我为什么粘贴相同的代码....