You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

开发WordPress插件:如何让Thickbox弹窗实现响应式?

解决Thickbox在WordPress插件中不支持响应式的问题

Thickbox确实是个老牌的模态框组件,但原生设计就没考虑响应式——它的尺寸是通过JS硬计算固定值,直接写width:auto或者vh单位会被它的内置逻辑覆盖。下面给你两个可行的解决方案,按需选择:

方案1:改造现有Thickbox使其支持响应式

我们需要通过自定义JS和CSS,强制覆盖Thickbox的固定尺寸逻辑,让它自适应屏幕:

第一步:添加自定义JS代码

把这段代码放到你的插件JS文件里(或者通过wp_enqueue_script注册加载):

jQuery(document).ready(function($) {
    // 监听Thickbox打开事件,重写尺寸规则
    $(document).on('tb_show', function() {
        // 重置模态框容器的尺寸和定位
        $('#TB_window').css({
            'width': 'auto',
            'height': 'auto',
            'max-width': '90vw',
            'max-height': '90vh',
            'left': '50%',
            'top': '50%',
            'transform': 'translate(-50%, -50%)',
            'margin': '0'
        });
        // 调整内容区域的自适应规则
        $('#TB_ajaxContent').css({
            'width': '100%',
            'height': 'auto',
            'max-height': '80vh',
            'overflow-y': 'auto',
            'padding': '20px'
        });
        // 禁用Thickbox自带的位置计算函数,防止它重置我们的设置
        if (typeof tb_position === 'function') {
            window.tb_position = function() {};
        }
    });

    // 窗口 resize 时重新调整模态框位置
    $(window).on('resize', function() {
        if ($('#TB_window').is(':visible')) {
            $('#TB_window').css({
                'left': '50%',
                'top': '50%',
                'transform': 'translate(-50%, -50%)'
            });
        }
    });
});

第二步:添加自定义CSS样式

wp_enqueue_style把这段CSS加到你的插件里:

#TB_window {
    position: fixed !important;
    box-sizing: border-box !important;
}

#TB_ajaxContent {
    box-sizing: border-box !important;
}

/* 移动端优化 */
@media (max-width: 768px) {
    #TB_window {
        max-width: 95vw !important;
        max-height: 95vh !important;
    }

    #TB_ajaxContent {
        padding: 15px !important;
        font-size: 14px;
    }
}

这样修改后,Thickbox就会自适应不同屏幕尺寸,内容超出时还会自动出现滚动条。

方案2:替换为WordPress原生的响应式模态框(推荐)

如果不想折腾老组件,WordPress自带了wp-modal组件,原生支持响应式,用法也更现代:

第一步:注册加载原生模态框资源

在你的插件PHP文件里添加:

function digisoft_enqueue_modal_assets() {
    wp_enqueue_script('wp-modal');
    wp_enqueue_style('wp-modal');
}
add_action('admin_enqueue_scripts', 'digisoft_enqueue_modal_assets');

第二步:编写模态框HTML

替换你原来的Thickbox内容:

<div id="digisoft-clicktocall-modal" class="wp-modal" style="display:none;">
    <div class="wp-modal-backdrop"></div>
    <div class="wp-modal-dialog">
        <div class="wp-modal-content">
            <div class="wp-modal-header">
                <h2 class="wp-modal-title">Votre information</h2>
                <button class="wp-modal-close" aria-label="Close modal"></button>
            </div>
            <div class="wp-modal-body">
                <form action="#" method="post">
                    <label for="digisoft_clickToCall_lastnameClient">Votre nom :</label><br>
                    <input id="digisoft_clickToCall_lastnameClient" type="text" name="lastnameClient"><br>
                    <!-- 其他表单元素继续写在这里 -->
                    <button type="submit" style="margin-top:15px;">Envoyer</button>
                </form>
            </div>
        </div>
    </div>
</div>

第三步:添加控制模态框的JS

jQuery(document).ready(function($) {
    // 假设你的触发按钮ID是open-clicktocall-modal
    $('#open-clicktocall-modal').on('click', function(e) {
        e.preventDefault();
        $('#digisoft-clicktocall-modal').addClass('is-open');
        $('body').addClass('modal-open');
    });

    // 关闭模态框的逻辑
    $('.wp-modal-close, .wp-modal-backdrop').on('click', function() {
        $('#digisoft-clicktocall-modal').removeClass('is-open');
        $('body').removeClass('modal-open');
    });

    // 按ESC键关闭
    $(document).on('keydown', function(e) {
        if (e.key === 'Escape' && $('#digisoft-clicktocall-modal').hasClass('is-open')) {
            $('#digisoft-clicktocall-modal').removeClass('is-open');
            $('body').removeClass('modal-open');
        }
    });
});

这个方案不需要额外处理响应式,wp-modal会自动适配手机、平板和桌面设备,而且和WordPress后台的UI风格更统一。

内容的提问来源于stack exchange,提问作者ebillis

火山引擎 最新活动