在本教程中,我们将制作一个jQuery脚本,将常规多选框转换为动画标记输入字段。
当您在下拉框中选择选项时,这些选项将以标记的样式显示在输入字段中。要取消选择某个选项,只需单击标记中的X图标即可。
1.创建倍数
选择页面上的框,然后在中定义占位符文本数据占位符
属性:
<select multiple data-placeholder="Select Languages"> <option>Python</option> <option selected>JavaScript</option> <option>C/C++</option> <option>Java</option> <option>Kotlin</option> <option>PHP</option> <option>Scala</option> <option>Vue.js</option> <option>Angular</option> <option>React</option> </select>
2.在文档中加载所需的jQuery库。
<script src="/path/to/cdn/jquery.min.js"></script>
3.将选择框转换为标签输入。
$(document).ready(function () { var select = $('select[multiple]'); var options = select.find('option'); var div = $('<div />').addClass('selectMultiple'); var active = $('<div />'); var list = $('<ul />'); var placeholder = select.data('placeholder'); var span = $('<span />').text(placeholder).appendTo(active); options.each(function () { var text = $(this).text(); if ($(this).is(':selected')) { active.append($('<a />').html('<em>' + text + '</em><i></i>')); span.addClass('hide'); } else { list.append($('<li />').html(text)); } }); active.append($('<div />').addClass('arrow')); div.append(active).append(list); select.wrap(div); $(document).on('click', '.selectMultiple ul li', function (e) { var select = $(this).parent().parent(); var li = $(this); if (!select.hasClass('clicked')) { select.addClass('clicked'); li.prev().addClass('beforeRemove'); li.next().addClass('afterRemove'); li.addClass('remove'); var a = $('<a />').addClass('notShown').html('<em>' + li.text() + '</em><i></i>').hide().appendTo(select.children('div')); a.slideDown(400, function () { setTimeout(function () { a.addClass('shown'); select.children('div').children('span').addClass('hide'); select.find('option:contains(' + li.text() + ')').prop('selected', true); }, 500); }); setTimeout(function () { if (li.prev().is(':last-child')) { li.prev().removeClass('beforeRemove'); } if (li.next().is(':first-child')) { li.next().removeClass('afterRemove'); } setTimeout(function () { li.prev().removeClass('beforeRemove'); li.next().removeClass('afterRemove'); }, 200); li.slideUp(400, function () { li.remove(); select.removeClass('clicked'); }); }, 600); } }); $(document).on('click', '.selectMultiple > div a', function (e) { var select = $(this).parent().parent(); var self = $(this); self.removeClass().addClass('remove'); select.addClass('open'); setTimeout(function () { self.addClass('disappear'); setTimeout(function () { self.animate({ width: 0, height: 0, padding: 0, margin: 0 }, 300, function () { var li = $('<li />').text(self.children('em').text()).addClass('notShown').appendTo(select.find('ul')); li.slideDown(400, function () { li.addClass('show'); setTimeout(function () { select.find('option:contains(' + self.children('em').text() + ')').prop('selected', false); if (!select.find('option:selected').length) { select.children('div').children('span').removeClass('hide'); } li.removeClass(); }, 400); }); self.remove(); }) }, 300); }, 400); }); $(document).on('click', '.selectMultiple > div .arrow, .selectMultiple > div span', function (e) { $(this).parent().parent().toggleClass('open'); }); });
4.标记输入所需的CSS/CS3样式。
.selectMultiple { width: 400px; position: relative; } .selectMultiple select { display: none; } .selectMultiple > div { position: relative; z-index: 2; padding: 8px 12px 2px 12px; border-radius: 8px; background: #fff; font-size: 14px; min-height: 44px; box-shadow: 0 4px 16px 0 rgba(22, 42, 90, 0.12); transition: box-shadow 0.3s ease; } .selectMultiple > div:hover { box-shadow: 0 4px 24px -1px rgba(22, 42, 90, 0.16); } .selectMultiple > div .arrow { right: 1px; top: 0; bottom: 0; cursor: pointer; width: 28px; position: absolute; } .selectMultiple > div .arrow:before, .selectMultiple > div .arrow:after { content: ""; position: absolute; display: block; width: 2px; height: 8px; border-bottom: 8px solid #99A3BA; top: 43%; transition: all 0.3s ease; } .selectMultiple > div .arrow:before { right: 12px; transform: rotate(-130deg); } .selectMultiple > div .arrow:after { left: 9px; transform: rotate(130deg); } .selectMultiple > div span { color: #99A3BA; display: block; position: absolute; left: 12px; cursor: pointer; top: 8px; line-height: 28px; transition: all 0.3s ease; } .selectMultiple > div span.hide { opacity: 0; visibility: hidden; transform: translate(-4px, 0); } .selectMultiple > div a { position: relative; padding: 0 24px 6px 8px; line-height: 28px; color: #1E2330; display: inline-block; vertical-align: top; margin: 0 6px 0 0; } .selectMultiple > div a em { font-style: normal; display: block; white-space: nowrap; } .selectMultiple > div a:before { content: ""; left: 0; top: 0; bottom: 6px; width: 100%; position: absolute; display: block; background: rgba(228, 236, 250, 0.7); z-index: -1; border-radius: 4px; } .selectMultiple > div a i { cursor: pointer; position: absolute; top: 0; right: 0; width: 24px; height: 28px; display: block; } .selectMultiple > div a i:before, .selectMultiple > div a i:after { content: ""; display: block; width: 2px; height: 10px; position: absolute; left: 50%; top: 50%; background: #4D18FF; border-radius: 1px; } .selectMultiple > div a i:before { transform: translate(-50%, -50%) rotate(45deg); } .selectMultiple > div a i:after { transform: translate(-50%, -50%) rotate(-45deg); } .selectMultiple > div a.notShown { opacity: 0; transition: opacity 0.3s ease; } .selectMultiple > div a.notShown:before { width: 28px; transition: width 0.45s cubic-bezier(0.87, -0.41, 0.19, 1.44) 0.2s; } .selectMultiple > div a.notShown i { opacity: 0; transition: all 0.3s ease 0.3s; } .selectMultiple > div a.notShown em { opacity: 0; transform: translate(-6px, 0); transition: all 0.4s ease 0.3s; } .selectMultiple > div a.notShown.shown { opacity: 1; } .selectMultiple > div a.notShown.shown:before { width: 100%; } .selectMultiple > div a.notShown.shown i { opacity: 1; } .selectMultiple > div a.notShown.shown em { opacity: 1; transform: translate(0, 0); } .selectMultiple > div a.remove:before { width: 28px; transition: width 0.4s cubic-bezier(0.87, -0.41, 0.19, 1.44) 0s; } .selectMultiple > div a.remove i { opacity: 0; transition: all 0.3s ease 0s; } .selectMultiple > div a.remove em { opacity: 0; transform: translate(-12px, 0); transition: all 0.4s ease 0s; } .selectMultiple > div a.remove.disappear { opacity: 0; transition: opacity 0.5s ease 0s; } .selectMultiple > ul { margin: 0; padding: 0; list-style: none; font-size: 16px; z-index: 1; position: absolute; top: 100%; left: 0; right: 0; visibility: hidden; opacity: 0; border-radius: 8px; transform: translate(0, 20px) scale(0.8); transform-origin: 0 0; filter: drop-shadow(0 12px 20px rgba(22, 42, 90, 0.08)); transition: all 0.4s ease, transform 0.4s cubic-bezier(0.87, -0.41, 0.19, 1.44), filter 0.3s ease 0.2s; } .selectMultiple > ul li { color: #1E2330; background: #fff; padding: 12px 16px; cursor: pointer; overflow: hidden; position: relative; transition: background 0.3s ease, color 0.3s ease, transform 0.3s ease 0.3s, opacity 0.5s ease 0.3s, border-radius 0.3s ease 0.3s; } .selectMultiple > ul li:first-child { border-radius: 8px 8px 0 0; } .selectMultiple > ul li:first-child:last-child { border-radius: 8px; } .selectMultiple > ul li:last-child { border-radius: 0 0 8px 8px; } .selectMultiple > ul li:last-child:first-child { border-radius: 8px; } .selectMultiple > ul li:hover { background: #4D18FF; color: #fff; } .selectMultiple > ul li:after { content: ""; position: absolute; top: 50%; left: 50%; width: 6px; height: 6px; background: rgba(0, 0, 0, 0.4); opacity: 0; border-radius: 100%; transform: scale(1, 1) translate(-50%, -50%); transform-origin: 50% 50%; } .selectMultiple > ul li.beforeRemove { border-radius: 0 0 8px 8px; } .selectMultiple > ul li.beforeRemove:first-child { border-radius: 8px; } .selectMultiple > ul li.afterRemove { border-radius: 8px 8px 0 0; } .selectMultiple > ul li.afterRemove:last-child { border-radius: 8px; } .selectMultiple > ul li.remove { transform: scale(0); opacity: 0; } .selectMultiple > ul li.remove:after { -webkit-animation: ripple 0.4s ease-out; animation: ripple 0.4s ease-out; } .selectMultiple > ul li.notShown { display: none; transform: scale(0); opacity: 0; transition: transform 0.35s ease, opacity 0.4s ease; } .selectMultiple > ul li.notShown.show { transform: scale(1); opacity: 1; } .selectMultiple.open > div { box-shadow: 0 4px 20px -1px rgba(22, 42, 90, 0.12); } .selectMultiple.open > div .arrow:before { transform: rotate(-50deg); } .selectMultiple.open > div .arrow:after { transform: rotate(50deg); } .selectMultiple.open > ul { transform: translate(0, 12px) scale(1); opacity: 1; visibility: visible; filter: drop-shadow(0 16px 24px rgba(22, 42, 90, 0.16)); } @-webkit-keyframes ripple { 0% { transform: scale(0, 0); opacity: 1; } 25% { transform: scale(30, 30); opacity: 1; } 100% { opacity: 0; transform: scale(50, 50); } } @keyframes ripple { 0% { transform: scale(0, 0); opacity: 1; } 25% { transform: scale(30, 30); opacity: 1; } 100% { opacity: 0; transform: scale(50, 50); } }