select2中的右对齐下拉菜单

Posted

技术标签:

【中文标题】select2中的右对齐下拉菜单【英文标题】:Right-align dropdown menu in select2 【发布时间】:2019-01-13 03:28:26 【问题描述】:

有没有办法在 select2 中将下拉菜单与dropdownAutoWidth: true 右对齐,而不是标准的左对齐?我希望选择保持不变,但下拉菜单向左移动,以便与右侧的选择对齐。请参阅下面的 sn-p 错误对齐...

注意:我想要不同大小的选择和下拉菜单,如图所示。

Edit // 更新了添加direction: rtl; text-align: right; 的建议。这只会使文本右对齐。我希望整个下拉列表与其上方的选定选项右对齐。例如。下拉菜单应突出在所选选项的左侧,而不是右侧。

Edit 2 // 更新为.select2-dropdown left: -69px !important; 这使它看起来像我想要的那样,但是有没有办法不必设置固定值-69px?

$(".form-control").select2(
    width: '100px',
    dropdownAutoWidth : true,
);
.select2-container--default .select2-results > .select2-results__options  direction: rtl; text-align: right; 
.select2-dropdown 
left:-69px !important;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<select class="form-control">
  <option selected="selected">orange</option>
  <option>white</option>
  <option selected="selected">purple</option>
</select>

我希望它看起来像这样,但不是用固定值来实现它。

【问题讨论】:

【参考方案1】:

由于您希望选择和下拉菜单具有不同大小,这是我的解决方案使用 select2 内置选项和一些 CSS,但可能不是完美的。

制作rtl 非常简单,只需使用dir,但我们需要传递一些其他选项,如下所示:

$('select').select2(
    dir: "rtl",
    dropdownAutoWidth: true,
    dropdownParent: $('#parent')
);

这里的关键是dropdownParent,你也需要编辑你的html如下:

<div id='parent'>
    <select>
      <option selected="selected">orange</option>
      <option>white</option>
      <option selected="selected">purple</option>
    </select>
</div>

最后你需要一些 CSS:

#parent 
  /* can be any value */
  width: 300px;
  text-align: right;
  direction: rtl;
  position: relative;

#parent .select2-container--open + .select2-container--open 
  left: auto;
  right: 0;
  width: 100%;

你可以看到它在行动here on codepen

如果您有多个选项,则需要一些 JS 代码来处理 dropdownParent 选项。顺便说一句,如果您删除 dropdownAutoWidth 选项,您的生活会更轻松;)

【讨论】:

【参考方案2】:

如果仍在寻找替代方法。我最近也需要实现这一点,而 RTL 答案对我的项目来说不是一个可行的解决方案。如果您使用的是 select2.js(4.0.6) 并且不介意修改脚本,您可以替换以下代码并通过向目标元素添加类来实现正确定位。

查找第 4381 到 4384 行

var css = 
  left: offset.left,
  top: container.bottom
;

替换为以下内容

var containerWidth = this.$container.outerWidth()
var right = ($("body").outerWidth() - (offset.left + containerWidth));

if (this.$element.hasClass("right-align")) 
    var css = 
        right: right,
        top: container.bottom
    ;
 else 
    var css = 
        left: offset.left,
        top: container.bottom
    ;

将类右对齐添加到您的目标选择输入。

<select id="client_select" class="form-control right-align">
     <option value="01">Example One</option>
     <option value="02">Example Two</option>
     <option value="03">Example Three</option>
</select>

这应该就是你所需要的。如果目标元素具有类,则代码将使用右定位而不是左定位来定位下拉菜单。如果容器设置为父级,则应该工作相同。然而,这并没有经过彻底的测试。它可能不是一个优雅的解决方案,但它不需要用 CSS 覆盖任何东西。在进行更新以添加用于处理右对齐下拉列表的选项之前,应该这样做。希望对您有所帮助。

【讨论】:

谢谢,我去测试一下! 请注意,如果您希望它是动态的(即您不知道选择是否会在页面的最右边),您可以尝试:` var containerWidth = this.$container.外宽(); var bodyWidth = document.body.clientWidth; if (bodyWidth - offset.left 【参考方案3】:

init select with dir: "rtl" 如:

$('select').select2(
   dir: "rtl,
   ...
   ...
   ...
   ...
   )

【讨论】:

【参考方案4】:

我设法让它的工作方式略有不同。我需要将下拉菜单向左展开,同时保持选项文本左对齐。我觉得值得分享。这是设置:

HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<div id="select2-container">
    <select class="form-control">
        <option selected="selected">orange</option>
        <option>white</option>
        <option>purple</option>
    </select>
</div>

CSS

.select2-container.select2-container--default.select2-container--open 
    right: auto;
    left: unset !important;


.select2-container.select2-container--default.select2-container--open .select2-dropdown.select2-dropdown--below 
    width: fit-content !important;
    left: unset;
    right: 0;

JavaScript

$('.form-control').select2( dropdownParent: $('#select2-container') );

结果如下:

【讨论】:

【参考方案5】:

select的option标签不能被css修改,需要做jquery插件 http://selectric.js.org/demo.html 它应该对你有帮助,我的朋友

【讨论】:

请再次阅读我的问题。我不是要修改选项标签。我想重新定位一个 select2 下拉菜单。【参考方案6】:

我认为它会帮助你得到你真正需要的东西。如果你不让我回来

select 
  text-align-last: right;


option 
  direction: rtl;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<select class="form-control">
  <option selected="selected">orange</option>
  <option>white</option>
  <option selected="selected">purple</option>
</select>

【讨论】:

谢谢!我更新了我上面的帖子。不确定是否可以使用纯 css 或是否需要一些 js 计算。

以上是关于select2中的右对齐下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap 4.0.0右对齐导航栏下拉菜单打开时超出视口[重复]

Bootstrap 4 Navbar:右对齐下拉菜单在右侧打开:溢出[重复]

Select2 下拉菜单低于主下拉菜单

Select2:防止 Select2 下拉菜单专注于点击

如何设置 select2 下拉菜单的最小宽度和最大宽度?

无法在 Select2 下拉菜单中选择项目