zoukankan      html  css  js  c++  java
  • Simple上网导航--静态版

      现在的网址导航显然是一个针对小白用户的网页大全,新闻、笑话、视频、黄段子要什么有什么,一个网址导航竟然也要滑动好多页。其实80%的功能我都用不到,但是它们却时刻展现在我的眼前。所以我决定做一个简洁清晰的网址导航,我的目标是牺牲20%的功能,提升80%的体验。本来是想给自己用的,用了一段时间感觉还不错,再让我回头用hao123会觉得特不清晰,干脆直接挂出来吧,反正也花不了几个钱,说不准还会有人喜欢。先看东西吧:Simple 最简洁的上网导航。可以随意拖动网址排序,删除或添加网址。Simple面向的用户是追求简洁实用的小众群体,并不针对小白用户,我觉得可能白领居多,不知是否合您的口味。跟大家简单分享一下纯静态版的实现,以及我的一些想法,本菜并不擅长做前端,如果出现低级错误,可不要贱笑啊。代码与最新的代码可能有所差别,可以直接查看源代码,注释比较详细。

    一. 页面布局

    <!doctype html>//省略了若干js,css引用,省略了不重要的页面元素
    <html lang="zh">
    <head>
    <meta charset="utf-8">
    <title>Simple 最简洁的上网导航</title>
    <link rel="shortcut icon" type="image/ico" href="img/favicon.ico" />
    </head>
    <body>
        <div>
            <div id="head">
                <a href="#" onclick="showAbout()">帮助</a> <a href="#" onclick="reset()">重置</a> 
            </div>
            <div id="logo">Simple</div>
            <div id="trashContainer">
                <img id="trash" src="img/trash.png"/><img id="trash_tip" src="img/trash_tip.png" style="display:none"/>
            </div>
            <div id="searchContainer">
                <form id="searchForm" action="http://www.baidu.com/s" target="_blank">
                    <input id="search" type="text" name="wd" baiduSug="2" />
                </form>
            </div>
            <div style="margin-top: 50px">
                <ul id="sortable">
                    <li no="1"><a href="http://www.baidu.com" target="_blank" style="background: url(img/defaultIcon.png) no-repeat 0px 0px">百 度</a></li>
    <!--省略无数网址--> </ul> </div> </div> <div id="about"> <ol> <li>按空格键,可将焦点置于搜索框内; 按 Ctrl+&lt;- 键,可清空搜索框</li>
    <li>默认搜索为百度,关键词前空一格则使用google搜索</li> <li>网址可拖动调换位置并随意删除</li> <li>点击重置可恢复到最最原始的页面</li> <li>看在我们连logo都省了的份上,推荐给身边的朋友吧</li> </ol> <a style="float: right; text-decoration: none;" href="#" onclick="$('#about').hide('fast');">关闭</a> </div> </body> <script charset="gbk" src="http://www.baidu.com/js/opensug.js"></script> </html>

      先说说功能系数,功能系数是指模块功能所占整个页面功能的百分比。我要使页面布局符合每个模块的功能系数。也就是说某模块的功能系数越高,那么它的位置就越显眼,在用户视野范围内的时间就越长。

      页面主要是三个部分:Logo文字、搜索框、网址列表。其中Logo文字以显示一秒随后隐藏的方式来展现,我觉得以这种方式来展现Logo显得页面不那么呆板,最终隐藏掉Logo显得整个页面又不乏稳重,同时还保持了页面的简洁。最有用的当然是搜索框和下边的网址导航了,搜索框没有搜索按钮,因为我觉得搜索按钮的功能系数也是非常的低,Simple针对的用户不是小白用户,所以直接省略掉搜索按钮。网址列表仍然没有达到我理想的效果,后续还会慢慢改善。如何保持网站列表清晰又不花哨是一个值得探讨的问题,相信会有一个比较好的方案。

      还有一个删除网址的垃圾桶,Simple没有在周围添加一个设置图标按钮,点击后在网址边上显示删除符号。而是直接在拖动的过程中,显示垃圾桶提示用户可以删除,保持了页面的简洁。 

      帮助、重置、添加是这里最不常用的功能,所以让它靠在了右上方不起眼的地方,以与它们的功能系数匹配。 

    二. 搜索框功能

      点开帮助看一下,会看到有几个关于搜索框的功能点。js库使用的是jquery和jquery.cookie。

      平时用搜索的时候有两点稍有不便,一个是焦点问题。我们的页面加载完成就将焦点放在了搜索框中,直接输入即可。另外按下空格键就可以将焦点放到搜索框中,如果按了空格键并且搜索框没有焦点,则使它获得焦点。这里采用的是keyup事件,如果用keydown事件的话,等文本框获得焦点之后,空格字符仍然会输入到文本框中。

    $(document).keyup(function(e) {
            if (e.keyCode == 32 && document.activeElement.id != "search") {
                $("#search").focus();
            }
        });

      另一个是删除关键字问题,如果想删除关键字直接按ctrl+backspace即可,比ctrl+a再删除还方便,整个过程不需要鼠标的参与。是不是很爽啊,什么?你还是习惯咔咔咔咔摁删除?哎,习惯问题,我刚开始也是咔咔咔咔摁删除,但这是无意识的操作,如果有意识地用几次ctrl+backspace就会觉得由衷的爽。代码如下:

    $("#search").keydown(
                    function(e) {
                        if (e.ctrlKey == 1 && e.keyCode == 8) {
                            $("#search").val("");
                        }
                    });

      默认情况下按回车键调用百度搜索,搜索内容前置一个空格将调用google搜索,最近封网越加严重,google基本上不了了,裆中央看来是不想让同志们愉快地玩耍了。看代码吧,当看到有空格时就改变相应的属性,然后提交表单。这里为什么用表单而不用window.open呢?window.open兼容性有问题,至少在我的手机上点回车是不响应的。

    $("#search").keydown(
                    function(e) {if (e.keyCode == 13) {
                            var keyword = $("#search").val();
                            if (keyword.length > 0 && keyword.charAt(0) == ' ') {
                                $("#searchForm").attr("action","https://www.google.com.hk/search");
                                $("#search").attr("name","q");
                            } else {
                                $("#searchForm").attr("action","http://www.baidu.com/s");
                                $("#search").attr("name","wd");
                            }
                            $("#searchForm").submit();
                            return false;
                        }
                    });

      当你输入关键字时,会得到提示,这里的提示来自百度,在搜索框上加baiduSug属性,再引入下边的opensug.js即可,baiduSug等于1时,用鼠标点击提示项会自动提交表单,等于2时不会自动提交表单。提示框最下边的“百度搜索框提示”稍微有点别扭,可以把js下载下来将提示删除。我刚开始是这么干的,后来想了想又直接用了原版,万一百度找上门来让我赔钱就麻烦了。

    <script charset="gbk" src="http://www.baidu.com/js/opensug.js"></script>

    三. Logo显示

      logo显示有啥好说的?logo的颜色是会变的奥,不信明天再刷一下看看,我们让logo一周七个颜色,每天都不一样,每天带给大家不一样的心情。代码使logo透明度用一秒的时间从0变到1,停留一秒,再用一秒的时间从1变到0。

    function loadLogo() {
            var colorArray = [ "#45b97c", "green", "violet", "#faa755", "#6950a1",
                    "#4c4c4c", "#ef5b9c" ];
            $("#logo").css("color", colorArray[new Date().getDay()]);
            $("#logo").fadeTo(1000, 1, function() {
                setTimeout(function() {
                    $("#logo").fadeTo(1000, 0);
                }, 1000);
            });
        }

    四. 网址添加

      点击右上角的添加即可弹出网址添加框,输入网址或网站名会有提示,选择并回车即可。网址提示框的实现可以看我的另一篇博客《贡献个网址搜索提示框》,就不再重复介绍了。这里只看一下添加网址的逻辑。先是大概的判断一下输入,校验一下网址,校验逻辑不是很严格。然后将网址名字、网址、编号保存到cookie中,过期时间设为1000天,如果不设的话,默认关闭浏览器cookie就没了。中间省略部分函数的代码,太多了就不贴了,看名字应该知道是什么意思。

            function add() {
                var name = $("#mysite-name-add").val().trim();
                var url = $("#mysite-url-add").val().trim();
                if (name == '' || url == '') {
                    addtip("添加内容不能为空", "red");
                    return;
                }
    
                url = url.replace(/^(http|https):///, '');
                if (!isURL(url)) {
                    addtip("网址不规范", "red");
                    return;
                }
    
                if (name.length == 2)//网站名两个字时中间加一个空格
                    name = name[0] + ' ' + name[1];
    
                var customArray;
                var custom = $.cookie('custom');
                if (custom == undefined)
                    customArray = [];
                else
                    customArray = $.parseJSON(custom);
    
                var currentNo = getCustomMaxNo() + 1;
                customArray.push({
                    "name" : name,
                    "url" : url,
                    no : currentNo
                });
                //save to cookie
                $.cookie('custom', JSON.stringify(customArray), {
                    expires : 1000
                });
    
                appendSite(currentNo, name, url);//添加网址
                changeOrder();//保存网址顺序
                $("#mysite-name-add").val('');
                $("#mysite-url-add").val('');
                $("#btn-site-back").focus();
                addtip(name + " 添加成功", "green");
            }

    五. 网址拖动

      每个人常用的网址都不一样,每个网址的使用频率也不一样,所以我们的网址可以直接拖动变换位置。拖动用到了jquery.ui库的sortable,可以任意拖动对象排序,并设置排序的一系列回调函数,changeOrder就是排序完毕并发生改变时的回调函数。每个网址都有一个编号,当位置变动时,将编号依次纪录到cookie中。

    function changeOrder(){
            var order=[];
            $("#sortable li").each(function(){
                order.push($(this).attr("no"));
            });
            $.cookie('order',JSON.stringify(order),{expires:1000});
        }

    六. 网址删除

      网址拖动的过程中,搜索框上方会出现一个垃圾桶的图标,当网址覆盖垃圾桶时,垃圾桶的颜色会变成红色,这时候松开鼠标,网址就被删掉了。这里使用了jquery.ui库的droppable,它允许其他对象拖放到它上面,并提供了一系列的监听事件,例如覆盖、移除、放下等。垃圾桶是使用了两个不同的img,默认显示绿色的隐藏红色的。监听到开始拖放网址时(这个是sortable的事件)显示垃圾桶,网址覆盖到垃圾桶时隐藏绿色img显示红色img。如果松开鼠标直接将网址删除,并隐藏垃圾桶。这里为什么要选取两个img,而不是用一个img,监听到事件改变它的src属性呢?如果这样的话,每次改变src属性,浏览器都会重新请求资源,所以图片切换会跟不上。就算可以解决重新请求资源的问题,第一次改变src还是要请求的,这样会使第一次图片切换跟不上。所以直接用两个img,页面加载完成就开始请求图片,再切换时就不会因为请求资源带来延时了。看代码吧。

    $("#trashContainer").droppable({
                drop : function(event, ui) {
                    $(ui.draggable).remove();
                    deleteCustom($(ui.draggable).attr("no"));//如果网址是用户添加的,将在cookie中将添加的网址删除
                    $("#trash_tip").css("display", "none");
                    $("#trash").css("display", "block");
                },
                out : function(event, ui) {
                    $("#trash_tip").css("display", "none");
                    $("#trash").css("display", "block");
                },
                over : function(event, ui) {
                    $("#trash").css("display", "none");
                    $("#trash_tip").css("display", "block");
                }
            });

    七. 网址加载

      说一下我们的网址加载策略吧,像这些导航类的网站,默认网址列表可能会发生变化,比如我在后台删除或者添加了网址。为了最大化的提高用户体验,针对自定义过的用户,我们不让他受任何影响,没有自定义过的就按照后台定义的最新网址来。如果时间长了,后台变换的网址多了,想重新整理网址让所有用户都变为最新的网址列表,就变换网址版本,如果网址版本出现变化,不管有没有自定义都重新来过。如何实现呢,对于后台删除的网址,在网址对应的li上加个type="delete"属性,添加的网址直接添加即可。打开网站时,读取cookie,判断是否有版本变更,判断用户是否自定义过。如果没有自定义过将带有type="delete"属性的网址删除。如果自定义过,先把用户添加的网址追加到网址列表,再按保存的顺序把相应编号的网址移动到最后,可能还剩几个网址没有在order里出现,这些网址就是被用户删除掉的,算一下有几个,再把前边的几个删掉就ok了。

    function loadWebSites() {
            //判断版本变更
            if ($.cookie('ver') != '0.9') {
                $.removeCookie("order");
                $.removeCookie("custom");
                $.cookie('ver', '0.9', {
                    expires : 1000
                });
            }
    
            //判断是否已经自定义过
            var order = $.cookie('order');
            if (order != undefined) {
                var custom = $.cookie('custom');
                if (custom != undefined) {
                    //add custom
                    $($.parseJSON(custom)).each(function() {
                        appendSite(this.no, this.name, this.url);
                    });
                }
    
                //change order
                var orderObject = $.parseJSON(order)
                $(orderObject).each(function() {
                    $("#sortable li[no='" + this + "']").appendTo($("#sortable"));
                });
    
                //remove deleted item
                var deletedCount = $("#sortable li").length - orderObject.length;
                $("#sortable li:lt(" + deletedCount + ")").remove();
            } else {
                $("#sortable li[type=delete]").remove();
            }
        } 

       今天是网站正式上线的第一天,后续还会不断地完善更新,欢迎大家提出任何建议。感兴趣的朋友请关注Simple上网导航的官方微博(左上角公告里有新浪微博关注按钮),我们会进行更多的互动。如果能分享给身边的朋友那更是感激不尽,先谢过了。其实文章和代码已经写好很久了,今天才上线是因为走了些弯路,以后再跟大家聊一下这些非技术方面的问题吧。

  • 相关阅读:
    Oracle-连接多个字段
    Oracle-like 多条件过滤
    SQL-Union、Union ALL合并两个或多个 SELECT 语句的结果集
    EXCEL-批量删除筛选出的行,并且保留首行
    EXCEL-REPLACE()替换字符串最后几位 删除字符串最后几位
    Oracle-常用表的查询、增加列、删除列、修改列值功能【增删改查】
    Excel-返回列表或数据库中的分类汇总(汇总可以实现要还是不要统计隐藏行功能) subtotal()
    Excel-统计各分数段人数 frequency()
    Excel-给出指定数值的日期 date()
    Class类的理解与获取Class的实例
  • 原文地址:https://www.cnblogs.com/luguo3000/p/3768707.html
Copyright © 2011-2022 走看看