Bootstrap-select 插件:如何避免闪烁

Posted

技术标签:

【中文标题】Bootstrap-select 插件:如何避免闪烁【英文标题】:Bootstrap-select plugin: how to avoid flickering 【发布时间】:2014-06-08 17:03:17 【问题描述】:

Bootsrap-select 插件很棒 (http://silviomoreto.github.io/bootstrap-select/)。它提供了一种在 Bootstrap 中创建华丽的选择菜单的极其简单的方法。然而,我遇到的一个问题是页面加载时“闪烁”。我的意思是相当直截了当:

    页面加载原始 html 选择元素(当然看起来像废话) Bootstrap-select 插件 JS 运行 在页面加载后的某个明显时间,原始 HTML 选择元素在第 (2) 步中被 JS 转换为漂亮的 Bootstrap-select 元素。

因此,用户首先看到 HTML 选择元素,然后看到它切换到漂亮的 Bootstrap-select 项,因此“闪烁”。

有没有人找到解决问题的好方法?

【问题讨论】:

可能是像select visibility:hidden; 这样的CSS定义? 你能发布你的代码吗?在查看网站时(除了 js 等...),您只是在使用他的自定义类创建一个选择元素? 这是我要修复的页面:audioblocks.com/search/?srch-type=music 代码并不多。渲染页面。在必要的选择元素上调用 selectpicker() 函数。 【参考方案1】:

要在加载 bootstrap-select 之前显示空白,请将其添加到您的 css。

select 
   visibility: hidden;

【讨论】:

在我的例子中,select 实际上是在 Bootstrap 启动并影响它周围的元素之后改变了它的位置,所以visibility: hidden; 不足以掩盖这种效果。我不得不使用display: none; 完全隐藏它。【参考方案2】:

没有很好的方法来防止闪烁,但您可以将其最小化。

问题在于,除了您遇到的任何其他瓶颈之外,您还必须首先下载并解析大量 javascript 文件。 Bootstrap-Select 依赖于 Bootstrap,而 Bootstrap 本身又依赖于 jQuery。当所有的 javascript 加载完成时,页面可能已经呈现。

您可以做的一件事是尽量减少闪烁,将select 元素的样式设置为尽可能与最终产品相似,以便它们占用相同数量的屏幕空间。当插件加载时,它无论如何都会隐藏这个控件并用它自己的实现替换它。使用您要传递给 selectpicker() 函数的选择器和如下样式:

.selectpicker 
    width: 220px;
    height:34px;
    margin-bottom: 10px;

Working Demo in fiddle

注意:我故意使用setTimeout 延迟了加载时间,因此差异更加明显。

setTimeout(function()  $(".selectpicker").selectpicker(); , 500);

如果仍然无法接受,您可以显示加载图形,直到页面完全加载。 改编自Loading screen example:

将此添加到您的 HTML:

<div id="loader"></div> 

在 CSS 中这样设置样式:

#loader 
    position: fixed;
    left: 0px;
    top: 0px;
    width: 100%;
    height: 100%;
    z-index: 9999;
    background: url('http://i.imgur.com/ntIrgYXs.gif') 50% 50% no-repeat grey;

加载页面后,使用以下 JavaScript 将其删除:

$("#loader").fadeOut("slow");

Working Demo Of Loading Screen In Fiddle

【讨论】:

谢谢!我要测试一下。 @user3565737,还记得为您认为有帮助的任何答案点赞,并接受任何最能解决您在 Stack Overflow 上发布的问题的答案。 当前对 Bootstrap 4.5 和 bootstrap-select 1.13.* 的修复是 height: 38px;【参考方案3】:

在替换之前使用size 限制select 的高度:

<select size="1">
    <option>Option 1</option>
    <option>Option 2</option>
    <option>Option 3</option>
    <option>Option 4</option>
</select>

围绕这个属性的规范说:

'size' 定义下拉列表中可见选项的数量

【讨论】:

它做得很好:D【参考方案4】:

这个解决方案对我有用:

<select class="selectpicker">
    <option>Option 1</option>
    <option>Option 2</option>
    <option>Option 3</option>
    <option>Option 4</option>
</select>

<script>
    $('.selectpicker').selectpicker(  
        width: '100%'
    );
</script>

我只是在创建选择下拉菜单后立即放置脚本,而不是等待文档准备好!

【讨论】:

【参考方案5】:

最好最简单的答案:

将现有的 Bootstrap 类 invisible 添加到标记页面上的 Select 对象中,无论是 HTML Input 元素还是 HTML Select 元素:https://getbootstrap.com/docs/5.1/utilities/visibility/

例如

<input class="visible">...</div>
<input class="invisible">...</div>

这可以防止 HTML 版本的 Select/DDL 对用户可见,同时保留 SELECT 将占用的布局空间(在 bootstrap-select JS 初始化后呈现)。

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review

以上是关于Bootstrap-select 插件:如何避免闪烁的主要内容,如果未能解决你的问题,请参考以下文章

bootstrap-select 插件多选下拉框提交时为啥还是只提交一个值?

bootstrap-select 的多选+模糊查询下拉框详解(官方示例文档解读)

下拉插件 (带搜索) Bootstrap-select 从后台获取数据填充到select的 option中 用法详解

python测试开发django-151.bootstrap-select下拉框

Bootstrap-select on click 获取点击值

bootstrap-select js jQuery控制select属性变化