构建步骤进度条(css和jquery)

rryofs0p  于 2023-02-12  发布在  jQuery
关注(0)|答案(8)|浏览(396)

你已经在paypal这样的网站上看到过这种类型的进度条了。如何使用CSSjquery来设置它呢?我有4页,每页是一个步骤...所以4个步骤。

laik7k3q

laik7k3q1#

我一直在寻找一个解决方案,将可视化的过程步骤在我的网络应用程序。我发现了下面的精彩文章由Stephen A托马斯:
跟踪纯CSS中的进度(Original Link now dead
在他的方法中,托马斯甚至只使用CSS --没有Javascript!从本质上讲,他文章中的以下CSS代码对我来说很有用:

<style>

    <!-- Progress with steps -->

    ol.progtrckr {
        margin: 0;
        padding: 0;
        list-style-type: none;
    }

    ol.progtrckr li {
        display: inline-block;
        text-align: center;
        line-height: 3em;
    }

    ol.progtrckr[data-progtrckr-steps="2"] li { width: 49%; }
    ol.progtrckr[data-progtrckr-steps="3"] li { width: 33%; }
    ol.progtrckr[data-progtrckr-steps="4"] li { width: 24%; }
    ol.progtrckr[data-progtrckr-steps="5"] li { width: 19%; }
    ol.progtrckr[data-progtrckr-steps="6"] li { width: 16%; }
    ol.progtrckr[data-progtrckr-steps="7"] li { width: 14%; }
    ol.progtrckr[data-progtrckr-steps="8"] li { width: 12%; }
    ol.progtrckr[data-progtrckr-steps="9"] li { width: 11%; }

    ol.progtrckr li.progtrckr-done {
        color: black;
        border-bottom: 4px solid yellowgreen;
    }
    ol.progtrckr li.progtrckr-todo {
        color: silver; 
        border-bottom: 4px solid silver;
    }

    ol.progtrckr li:after {
        content: "\00a0\00a0";
    }
    ol.progtrckr li:before {
        position: relative;
        bottom: -2.5em;
        float: left;
        left: 50%;
        line-height: 1em;
    }
    ol.progtrckr li.progtrckr-done:before {
        content: "\2713";
        color: white;
        background-color: yellowgreen;
        height: 1.2em;
        width: 1.2em;
        line-height: 1.2em;
        border: none;
        border-radius: 1.2em;
    }
    ol.progtrckr li.progtrckr-todo:before {
        content: "\039F";
        color: silver;
        background-color: white;
        font-size: 1.5em;
        bottom: -1.6em;
    }

</style>

以及示例中的HTML标记(我使用Grails GSP页面动态生成标记和'done/todo'类):

<ol class="progtrckr" data-progtrckr-steps="5">
    <li class="progtrckr-done">Order Processing</li>
    <li class="progtrckr-done">Pre-Production</li>
    <li class="progtrckr-done">In Production</li>
    <li class="progtrckr-done">Shipped</li>
    <li class="progtrckr-todo">Delivered</li>
</ol>

希望能帮上忙。对我来说很管用。

更新:以下(缩短)版本也运行良好。

ol.progtrckr {
        display: table;
        list-style-type: none;
        margin: 0;
        padding: 0;
        table-layout: fixed;
        width: 100%;
    }
    ol.progtrckr li {
        display: table-cell;
        text-align: center;
        line-height: 3em;
    }
    ... and the rest of the CSS ...

    <ol class="progtrckr">
        ...
    </ol>

display: table; table-layout: fixed; width: 100%确保列表项的大小自动相等,只要内容不溢出。无需使用data-progtrckr-steps及其关联的CSS。

11dmarpk

11dmarpk2#

这个页面上有很多非常好的答案,我在谷歌上搜索了更多,但没有一个答案勾选了我愿望清单上的所有复选框:

  • 仅CSS,无Javascript
  • 坚持汤姆肯尼的Best Design Practices
  • 像其他答案一样布局
  • 每个步骤都有名称和编号
  • 响应式布局:字体大小无关
  • 流体布局:列表和它的项目按可用宽度缩放
  • 姓名和号码在其所在区块中居中显示
  • "done"颜色上升到并包括活动项,但不会超过它。
  • 活动项目应以图形方式突出

所以我混合了几个例子的代码,修复了我需要的东西,下面是结果:

我使用了以下CSS和HTML:

/* Progress Tracker v2 */
ol.progress[data-steps="2"] li { width: 49%; }
ol.progress[data-steps="3"] li { width: 33%; }
ol.progress[data-steps="4"] li { width: 24%; }
ol.progress[data-steps="5"] li { width: 19%; }
ol.progress[data-steps="6"] li { width: 16%; }
ol.progress[data-steps="7"] li { width: 14%; }
ol.progress[data-steps="8"] li { width: 12%; }
ol.progress[data-steps="9"] li { width: 11%; }

.progress {
    width: 100%;
    list-style: none;
    list-style-image: none;
    margin: 20px 0 20px 0;
    padding: 0;
}

.progress li {
    float: left;
    text-align: center;
    position: relative;
}

.progress .name {
    display: block;
    vertical-align: bottom;
    text-align: center;
    margin-bottom: 1em;
    color: black;
    opacity: 0.3;
}

.progress .step {
    color: black;
    border: 3px solid silver;
    background-color: silver;
    border-radius: 50%;
    line-height: 1.2;
    width: 1.2em;
    height: 1.2em;
    display: inline-block;
    z-index: 0;
}

.progress .step span {
    opacity: 0.3;
}

.progress .active .name,
.progress .active .step span {
    opacity: 1;
}

.progress .step:before {
    content: "";
    display: block;
    background-color: silver;
    height: 0.4em;
    width: 50%;
    position: absolute;
    bottom: 0.6em;
    left: 0;
    z-index: -1;
}

.progress .step:after {
    content: "";
    display: block;
    background-color: silver;
    height: 0.4em;
    width: 50%;
    position: absolute;
    bottom: 0.6em;
    right: 0;
    z-index: -1;
}

.progress li:first-of-type .step:before {
    display: none;
}

.progress li:last-of-type .step:after {
    display: none;
}

.progress .done .step,
.progress .done .step:before,
.progress .done .step:after,
.progress .active .step,
.progress .active .step:before {
    background-color: yellowgreen;
}

.progress .done .step,
.progress .active .step {
    border: 3px solid yellowgreen;
}
<!-- Progress Tracker v2 -->
<ol class="progress" data-steps="4">
    <li class="done">
        <span class="name">Foo</span>
        <span class="step"><span>1</span></span>
    </li>
    <li class="done">
        <span class="name">Bar</span>
        <span class="step"><span>2</span></span>
    </li>
    <li class="active">
        <span class="name">Baz</span>
        <span class="step"><span>3</span></span>
    </li>
    <li>
        <span class="name">Quux</span>
        <span class="step"><span>4</span></span>
    </li>
</ol>

从上面的例子中可以看出,现在有两个列表项类需要注意:activedone。当前步骤使用class="active",之前的所有步骤使用class="done"
还要注意ol标记中的data-steps="4";设置这个到步骤的总数以应用正确的大小到全部列表项目.
请随意摆弄JSFiddle,尽情享受吧!

pkln4tw6

pkln4tw64#

这就是我如何使用纯CSS和HTML(没有JavaScript/图像等)实现它。
http://jsfiddle.net/tuPrn/
它在大多数浏览器中性能都会下降(我确实需要添加一个修复程序,以解决〈IE9中缺少last-of-type的问题)。

thigvfpy

thigvfpy5#

我也有同样的需求来创建一种步骤进度跟踪器,所以我为此创建了一个JavaScript插件。下面是这个步骤进度跟踪器的JsFiddle演示。您也可以在GitHub上访问它的代码。
它的基本功能是,将json数据(以下面描述的特定格式)作为输入,并在此基础上创建进度跟踪器。
它的html看起来有点像下面所示的默认CSS,但你可以自定义它作为每一个主题的应用程序。有一个选项显示工具提示文本的每一个步骤以及。

下面是一些代码片段:

//container div 
<div id="tracker1" style="width: 700px">
</div>

//sample JSON data
var sampleJson1 = {
ToolTipPosition: "bottom",
data: [{ order: 1, Text: "Foo", ToolTipText: "Step1-Foo", highlighted: true },
    { order: 2, Text: "Bar", ToolTipText: "Step2-Bar", highlighted: true },
    { order: 3, Text: "Baz", ToolTipText: "Step3-Baz", highlighted: false },
    { order: 4, Text: "Quux", ToolTipText: "Step4-Quux", highlighted: false }]
};    

//Invoking the plugin
$(document).ready(function () {
        $("#tracker1").progressTracker(sampleJson1);
    });

希望它对其他人也有用!

gzjq41n4

gzjq41n46#

我是这么做的:
1.创建jQuery. progressbar()将div加载到进度条中。
1.在进度条的底部创建步骤 * title *。用
CSS
定位它们。
1.然后我在jQuery中创建函数,每次用户进入下一步时,该函数都会更改进度条的 * 值 *。

    • 超文本标记语言**
<div id="divProgress"></div>
<div id="divStepTitle">
    <span class="spanStep">Step 1</span> <span class="spanStep">Step 2</span> <span class="spanStep">Step 3</span>
</div>

<input type="button" id="btnPrev" name="btnPrev" value="Prev" />
<input type="button" id="btnNext" name="btnNext" value="Next" />
    • 中央支助组**
#divProgress
{
    width: 600px;
}

#divStepTitle
{
    width: 600px;
}

.spanStep
{
    text-align: center;
    width: 200px;
}
    • Javascript/jQuery语言**
var progress = 0;

$(function({
    //set step progress bar
    $("#divProgress").progressbar();

    //event handler for prev and next button
    $("#btnPrev, #btnNext").click(function(){
        step($(this));
    });
});

function step(obj)
{
    //switch to prev/next page
    if (obj.val() == "Prev")
    {
        //set new value for progress bar
        progress -= 20;
        $("#divProgress").progressbar({ value: progress });

        //do extra step for showing previous page
    }
    else if (obj.val() == "Next")
    {
        //set new value for progress bar
        progress += 20;
        $("#divProgress").progressbar({ value: progress });

        //do extra step for showing next page
    }
}
wa7juj8i

wa7juj8i7#

我在tweek @帕特里克上创建了一个razor组件来显示一个枚举的当前状态栏,效果非常好。
剃刀组件页面-案例状态剃刀:

<p>Case Status Tracker</p>
<ol class="casestatus">
    @foreach (var s in statusBars)
    {
        <li class="@s.State">
            <span class="name">@s.Name</span>
            <span class="step"><span class="count"></span></span>
        </li>
    }
</ol>
<hr />

@code {
    //Enum Status Names
    private string[] status;
    //Current Status - best if parameter
    private Status currentStatus;
    //List of Names and progress states - done, active, (empty)
    private List<statusBar> statusBars { get; set; }

    protected override async Task OnInitializedAsync()
    {
        //Test current status (progress)
        currentStatus = Status.Engineering;
        statusBars = new List<statusBar>();
        status = Enum.GetNames(typeof(Status));
        var statusval = Enum.GetValues(typeof(Status)).Cast<int>().ToList();
        for(int i=0; i < status.Length; i++){
            var value = statusval[i];
            string state = "done";
            if (((int)currentStatus) == value)
            {
                state = "active";
            } else {
                if (((int)currentStatus) < value)
                {
                    state = "";
                }
            }
            statusBars.Add(new statusBar()
                {
                    Name = status[i],
                    State = state
                });
        }
    }
    public class statusBar
    {
        public string Name { get; set; }
        public string State { get; set; }
    }
    public enum Status
    {
        Request = 0,
        Submitted = 1,
        Engineering = 2,
        InApproval = 3,
        Approved = 4,
        Production = 5,
        Complete = 6
    }

}

CaseStatus.razor.css:

/* casestatus Tracker v2.1 */
.casestatus {
    counter-reset: li;
    display: flex;
    flex-wrap: nowrap;
    justify-content: space-evenly;
    width: 100%;
    list-style: none;
    list-style-image: none;
    margin: 20px 0 20px 0;
    padding: 0;
}

    .casestatus li {
        flex-grow: 1;
        text-align: center;
        position: relative;
    }

    .casestatus .name {
        display: block;
        margin-bottom: 1em;
        color: white;
        opacity: 0.3;
    }

    .casestatus .step {
        color: black;
        border: 3px solid silver;
        background-color: silver;
        border-radius: 50%;
        line-height: 2;
        width: 2em;
        height: 2em;
        display: inline-block;
    }

        .casestatus .step span.count:before {
            opacity: 0.3;
            content: counter(li);
            counter-increment: li
        }

    .casestatus .active .name,
    .casestatus .active .step span {
        opacity: 1;
    }

    .casestatus .step:before {
        content: "";
        display: block;
        background-color: silver;
        height: 0.4em;
        width: 50%;
        position: absolute;
        bottom: 0.8em;
        left: -0.76em;
    }

    .casestatus .step:after {
        content: "";
        display: block;
        background-color: silver;
        height: 0.4em;
        width: 50%;
        position: absolute;
        bottom: 0.8em;
        right: -0.76em;
    }

    .casestatus li:first-of-type .step:before {
        display: none;
    }

    .casestatus li:last-of-type .step:after {
        display: none;
    }

    .casestatus .done .step,
    .casestatus .done .step:before,
    .casestatus .done .step:after,
     .casestatus .active .step, 
    .casestatus .done + .active .step:before {
        background-color: yellowgreen;
    }

    .casestatus .done .step,
    .casestatus .active .step {
        border: 3px solid yellowgreen;
    }

2o7dmzc5

2o7dmzc58#

我所要做的是使用同样的技巧经常用于悬停在按钮上。准备一个图像,有2个部分:(1)上半部分为灰色,表示未完成;(2)下半部分为彩色,表示已完成。使用同一图像4次,组成进度条的4个步骤,未完成的步骤顶部对齐,未完成的步骤底部对齐。
为了利用图像对齐,您必须使用图像作为4个div的背景,而不是使用img元素。
这是用于背景图像对齐的CSS:

div.progress-incomplete {
  background-position: top;
}
div.progress-finished {
  background-position: bottom;
}

相关问题