首页

Vue框架设置响应式布局

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

最近折腾自己的网站,在自适应方面发现有了很多新的方法,感叹前端的技术真是日新月异,从以前只能这样,到现在除了这样,还可以那样,甚至再那样......技术永无止境啊。

回到主题,自适应响应式布局这个话题古老而新颖,从最早的不同分辨率的屏幕,到现在遍布各个生活角落的移动设备,响应式布局已经成了几乎所有互联网公司必备的条件。在我的映像中,bootstrap一直是响应式的头号选择,的确,其中的各种xl,xs,栅格布局让响应式变得很容易。

话说,这Vue做响应式,其实一点都不复杂:一个生命周期钩子,一个条指令,一套js判断语句解决,说到这,高手们应该早已经明白如何操作了, 这篇文章就给广大刚入门的同学们拓宽一下吧(不熟悉Vue的同学,还是先恶补一下Vue基础吧)。

一个生命周期钩子——mounted:挂载时操作;一条指令——v-show(本例中采用,非绝对):根据条件显示;一套js判断语句:if/else或者switch/case。具体操作起来很简单:(代码直接展示)

<!--这是一段导航html-->
<nav id="nav-part" class="easyUtil-backImgPostion easyUtil-flexContainerRow">
<ul class="easyUtil-flexContainerRow">
<li class="nav-list" :class="nav.className" v-for="(nav,i) in navs">
<a :href="nav.href">{{nav.name}}</a>
</li>
</ul>
<div id="serach-part" v-show="show"><input type="search" id="search" :placeholder="placeholder" class="easyUtil-input"><button id="searchBtn" class="easyUtil-btn">{{btn}}</button></div>
</nav>
var head = new Vue({
el : "#head",
data : {
        //此处省略一千字
show : true
},
mounted : function(){
//可用于设置自适应屏幕,根据获得的可视宽度(兼容性)判断是否显示
let w = document.documentElement.offsetWidth || document.body.offsetWidth;
if(w < 1000){
this.show = false;
}
})
我的目的是在移动设备中不显示搜索栏(search-part)部分,那么利用v-show,和mounted配合,在挂载时检测一下屏幕可视宽度,如果小于1000,则认为是手机,v-show设为false,不显示即可。

看,很简单吧,简单到我觉得自己好像在忽悠。其实到这里,原理已经说完,具体的应用大家可以自行发挥,而且也不一定就用v-show,我这里是为了显示与否,如果大家想添加样式什么的,还可以写别的,甚至于计算属性,watch都可以。只要记住在挂载的时候完成即可,不然页面会有跳动,不利于体验。

可能有人会问,用css的@media就可以完成了,为啥用js,我这里想说的是,我并没有否认@media,这里只是写出更多一种方式,同时结合一下现在很火的前端框架。多一种方法,就多一种解决思路,不至于再回到以前"只能这样"的道路上。具体到实际应用中,当然是最适合的方法为主。前端水深,前端的路子也越来越多,越来也丰富,敞开思维,就会看见不同的天空。

ps一句,js确实需要刷新页面重新加载才会显示,也就是说如果用户将页面从大屏移动到小屏幕,就可能出现布局不响应问题,但是在实际使用中,这种情况几乎不会出现,因为用户不能可能将电脑打开的网页,直接移动到手机上,操作永远都是重新打开,所以js,css在显示效果上是没有区别的(当然如果js太过复杂,性能会有影响)。另外,文中方法的兼容性问题,只要支持Vue的浏览器,都没问题。

就说到这吧,欢迎大神指正,不胜感激!
蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

vue-cli3 + bootstrap3实现响应式布局

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

1、用px2rem配合lib-flexible,让网页适配。

lib-flexible
作用:让网页根据设备dpr和宽度,利用viewport和html根元素的font-size配合rem来适配不同尺寸的移动端设备
安装:

npm install lib-flexible
1
引入:入口文件main.js中:

import "lib-flexible/flexible.js"
1
2、手写一个js小工具,省略rem的计算,加快开发速度。
在src目录下增加一个utils目录,在里面新建一个js文件,写入以下内容:

// 基准大小
const baseSize = 32
// 设置 rem 函数
function setRem () {
    // 当前页面宽度相对于 750 宽的缩放比例,可根据自己需要修改。
    const scale = document.documentElement.clientWidth / 750
    // 设置页面根节点字体大小
    document.documentElement.style.fontSize = (baseSize * Math.min(scale, 2)) + 'px'
}
// 初始化
setRem()
// 改变窗口大小时重新设置 rem
window.onresize = function () {
    setRem()
}


在main.js中引入改js文件:

import "./utils/rem"
1
然后就可以直接用px写页面啦,而不用去计算rem的值,是不是很舒服呢。

3、使用VW。了解下vw 与 vh单位,以viewport为基准,1vw 与 1vh分别为window.innerWidth 与 window.innerHeight的百分之一

安装:

npm i postcss-px-to-viewport -save -dev
1
在package.json中配置如下:

"postcss": {
    "plugins": {
      "autoprefixer": {},
      "postcss-pxtorem": {
        "rootValue": 32,
        "propList": ["*"]
      }
    },
    "plugins": {
      "autoprefixer": {},
      "postcss-px-to-viewport": {
        "viewportWidth": 750,
        "minPixelValue": 1
      }
    }
  },

4、利用bootstrap实现响应式图片

在 Bootstrap 版本 3 中,通过为图片添加 .img-responsive 类可以让图片支持响应式布局。其实质是为图片设置了 max-width: 100%;、 height: auto; 和 display: block; 属性,从而让图片在其父元素中更好的缩放。
对于图片的大小限制一定要在图片的父级元素进行限制。

5、利用bootstrap的栅格系统,下面列一下栅格系统的参数:

超小屏手机 (<768px) 小屏幕平板(>=768px) 中等屏桌面(>=992px) 大屏桌面(>=1200px)
类前缀 .col-xs .col-sm .col-md .col-lg
列数 12 12 12 12
.container最大宽度 None(自动) 750px 970px 1170px
举个移动设备和桌面的例子:


<!-- Stack the columns on mobile by making one full-width and the other half-width -->
<div class="row">
  <div class="col-xs-12 col-md-8">.col-xs-12 .col-md-8</div>
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
</div>

<!-- Columns start at 50% wide on mobile and bump up to 33.3% wide on desktop -->
<div class="row">
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
  <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
</div>

<!-- Columns are always 50% wide, on mobile and desktop -->
<div class="row">
  <div class="col-xs-6">.col-xs-6</div>
  <div class="col-xs-6">.col-xs-6</div>
</div>

还有更多对响应式的支持,就不一一列举了。


知乎 Redesign 视觉设计

涛涛

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

请登录并验证邮箱后查看原图请登录并验证邮箱后查看原图请登录并验证邮箱后查看原图请登录并验证邮箱后查看原图请登录并验证邮箱后查看原图请登录并验证邮箱后查看原图请登录并验证邮箱后查看原图请登录并验证邮箱后查看原图请登录并验证邮箱后查看原图请登录并验证邮箱后查看原图

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务

WEB前端响应式布局之BootStarp使用

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

Bootstrap:
 

1. 概念: 一个前端开发的框架,Bootstrap,来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使得 Web 开发更加快捷。
    * 框架:一个半成品软件,开发人员可以在框架基础上,在进行开发,简化编码。
    * 好处:
        1. 定义了很多的css样式和js插件。我们开发人员直接可以使用这些样式和插件得到丰富的页面效果。
        2. 响应式布局。
            * 同一套页面可以兼容不同分辨率的设备。

2. 快速入门
  
    1. 下载Bootstrap
    2. 在项目中将这三个文件夹复制
    3. 创建html页面,引入必要的资源文件

3.演示案例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>Bootstrap HelloWorld</title>

    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
        <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
    <script src="js/jquery-3.3.1.min.js"></script>
    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
    <script src="js/bootstrap.min.js"></script>
</head>
<body>
    <h1>你好,世界!</h1>
</body>
</html>
响应式布局
同一套页面可以兼容不同分辨率的设备。
* 实现:依赖于栅格系统:将一行平均分成12个格子,可以指定元素占几个格子
* 步骤:
    1. 定义容器。相当于之前的table、
        * 容器分类:
            1. container:两边留白
            2. container-fluid:每一种设备都是100%宽度
    2. 定义行。相当于之前的tr   样式:row
    3. 定义元素。指定该元素在不同的设备上,所占的格子数目。样式:col-设备代号-格子数目
        * 设备代号:
            1. xs:超小屏幕 手机 (<768px):col-xs-12
            2. sm:小屏幕 平板 (≥768px)
            3. md:中等屏幕 桌面显示器 (≥992px)
            4. lg:大屏幕 大桌面显示器 (≥1200px)

    * 注意:
        1. 一行中如果格子数目超过12,则超出部分自动换行。
        2. 栅格类属性可以向上兼容。栅格类适用于与屏幕宽度大于或等于分界点大小的设备。
        3. 如果真实设备宽度小于了设置栅格类属性的设备代码的最小值,会一个元素沾满一整行。

CSS样式和JS插件
 

1. 全局CSS样式:
    * 按钮:class="btn btn-default"
    * 图片:
        *  class="img-responsive":图片在任意尺寸都占100%
        *  图片形状
            *  <img src="..." alt="..." class="img-rounded">:方形
            *  <img src="..." alt="..." class="img-circle"> : 圆形
            *  <img src="..." alt="..." class="img-thumbnail"> :相框
    * 表格
        * table
        * table-bordered
        * table-hover
    * 表单
        * 给表单项添加:class="form-control" 
2. 组件:
    * 导航条
    * 分页条
3. 插件:
    * 轮播图

 

演示案例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>Bootstrap HelloWorld</title>
 
    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
     <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
    <script src="js/jquery-3.3.1.min.js"></script>
    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
    <script src="js/bootstrap.min.js"></script>
    <style>
        .paddtop{
            padding-top: 10px;
        }
        .search-btn{
            float: left;
            border:1px solid #ffc900;
            width: 90px;
            height: 35px;
            background-color:#ffc900 ;
            text-align: center;
            line-height: 35px;
            margin-top: 15px;
        }
 
        .search-input{
            float: left;
            border:2px solid #ffc900;
            width: 400px;
            height: 35px;
            padding-left: 5px;
            margin-top: 15px;
        }
        .jx{
            border-bottom: 2px solid #ffc900;
            padding: 5px;
        }
        .company{
            height: 40px;
            background-color: #ffc900;
            text-align: center;
            line-height:40px ;
            font-size: 8px;
        }
    </style>
</head>
<body>
 
   <!-- 1.页眉部分-->
   <header class="container-fluid">
       <div class="row">
           <img src="img/top_banner.jpg" class="img-responsive">
       </div>
       <div class="row paddtop">
           <div class="col-md-3">
               <img src="img/logo.jpg" class="img-responsive">
           </div>
           <div class="col-md-5">
               <input class="search-input" placeholder="请输入线路名称">
               <a class="search-btn" href="#">搜索</a>
           </div>
           <div class="col-md-4">
               <img src="img/hotel_tel.png" class="img-responsive">
           </div>
 
       </div>
       <!--导航栏-->
       <div class="row">
           <nav class="navbar navbar-default">
               <div class="container-fluid">
                   <!-- Brand and toggle get grouped for better mobile display -->
                   <div class="navbar-header">
                       <!-- 定义汉堡按钮 -->
                       <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                           <span class="sr-only">Toggle navigation</span>
                           <span class="icon-bar"></span>
                           <span class="icon-bar"></span>
                           <span class="icon-bar"></span>
                       </button>
                       <a class="navbar-brand" href="#">首页</a>
                   </div>
 
                   <!-- Collect the nav links, forms, and other content for toggling -->
                   <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                       <ul class="nav navbar-nav">
                           <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
                           <li><a href="#">Link</a></li>
                           <li><a href="#">Link</a></li>
                           <li><a href="#">Link</a></li>
                           <li><a href="#">Link</a></li>
                           <li><a href="#">Link</a></li>
 
                       </ul>
                   </div><!-- /.navbar-collapse -->
               </div><!-- /.container-fluid -->
           </nav>
 
       </div>
 
       <!--轮播图-->
       <div class="row">
           <div id="carousel-example-generic" class="carousel slide" data-ride="carousel">
               <!-- Indicators -->
               <ol class="carousel-indicators">
                   <li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
                   <li data-target="#carousel-example-generic" data-slide-to="1"></li>
                   <li data-target="#carousel-example-generic" data-slide-to="2"></li>
               </ol>
 
               <!-- Wrapper for slides -->
               <div class="carousel-inner" role="listbox">
                   <div class="item active">
                       <img src="img/banner_1.jpg" alt="...">
                   </div>
                   <div class="item">
                       <img src="img/banner_2.jpg" alt="...">
                   </div>
                   <div class="item">
                       <img src="img/banner_3.jpg" alt="...">
                   </div>
 
               </div>
 
               <!-- Controls -->
               <a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
                   <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
                   <span class="sr-only">Previous</span>
               </a>
               <a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
                   <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
                   <span class="sr-only">Next</span>
               </a>
           </div>
    </div>
 
 </header>
<!-- 2.主体部分-->
   <div class="container">
        <div class="row jx">
            <img src="img/icon_5.jpg">
            <span>黑马精选</span>
        </div>
 
       <div class="row paddtop">
           <div class="col-md-3">
                <div class="thumbnail">
                    <img src="img/jiangxuan_3.jpg" alt="">
                    <p>上海直飞三亚5天4晚自由行(春节预售+亲子/蜜月/休闲游首选+豪华酒店任选+接送机)</p>
                    <font color="red">&yen; 699</font>
                </div>
           </div>
           <div class="col-md-3">
               <div class="thumbnail">
                   <img src="img/jiangxuan_3.jpg" alt="">
                   <p>上海直飞三亚5天4晚自由行(春节预售+亲子/蜜月/休闲游首选+豪华酒店任选+接送机)</p>
                   <font color="red">&yen; 699</font>
               </div>
 
           </div>
           <div class="col-md-3">
 
               <div class="thumbnail">
                   <img src="img/jiangxuan_3.jpg" alt="">
                   <p>上海直飞三亚5天4晚自由行(春节预售+亲子/蜜月/休闲游首选+豪华酒店任选+接送机)</p>
                   <font color="red">&yen; 699</font>
               </div>
           </div>
           <div class="col-md-3">
 
               <div class="thumbnail">
                   <img src="img/jiangxuan_3.jpg" alt="">
                   <p>上海直飞三亚5天4晚自由行(春节预售+亲子/蜜月/休闲游首选+豪华酒店任选+接送机)</p>
                   <font color="red">&yen; 699</font>
               </div>
           </div>
           </div>
           <div class="row jx">
               <img src="img/icon_6.jpg">
               <span>国内游</span>
           </div>
           <div class="row paddtop">
               <div class="col-md-4">
                   <img src="img/guonei_1.jpg">
               </div>
               <div class="col-md-8">
                   <div class="row">
                       <div class="col-md-4">
                           <div class="thumbnail">
                               <img src="img/jiangxuan_3.jpg" alt="">
                               <p>上海直飞三亚5天4晚自由行(春节预售+亲子/蜜月/休闲游首选+豪华酒店任选+接送机)</p>
                               <font color="red">&yen; 699</font>
                           </div>
                       </div>
                       <div class="col-md-4">
                           <div class="thumbnail">
                               <img src="img/jiangxuan_3.jpg" alt="">
                               <p>上海直飞三亚5天4晚自由行(春节预售+亲子/蜜月/休闲游首选+豪华酒店任选+接送机)</p>
                               <font color="red">&yen; 699</font>
                           </div>
 
                       </div>
                       <div class="col-md-4">
 
                           <div class="thumbnail">
                               <img src="img/jiangxuan_3.jpg" alt="">
                               <p>上海直飞三亚5天4晚自由行(春节预售+亲子/蜜月/休闲游首选+豪华酒店任选+接送机)</p>
                               <font color="red">&yen; 699</font>
                           </div>
                       </div>
 
                   </div>
                   <div class="row">
                       <div class="col-md-4">
                           <div class="thumbnail">
                               <img src="img/jiangxuan_3.jpg" alt="">
                               <p>上海直飞三亚5天4晚自由行(春节预售+亲子/蜜月/休闲游首选+豪华酒店任选+接送机)</p>
                               <font color="red">&yen; 699</font>
                           </div>
                       </div>
                       <div class="col-md-4">
                           <div class="thumbnail">
                               <img src="img/jiangxuan_3.jpg" alt="">
                               <p>上海直飞三亚5天4晚自由行(春节预售+亲子/蜜月/休闲游首选+豪华酒店任选+接送机)</p>
                               <font color="red">&yen; 699</font>
                           </div>
 
                       </div>
                       <div class="col-md-4">
 
                           <div class="thumbnail">
                               <img src="img/jiangxuan_3.jpg" alt="">
                               <p>上海直飞三亚5天4晚自由行(春节预售+亲子/蜜月/休闲游首选+豪华酒店任选+接送机)</p>
                               <font color="red">&yen; 699</font>
                           </div>
                       </div>
                        </div>
 
           </div>
 
       </div>
   </div>
   <!-- 3.页脚部分-->
   <footer class="container-fluid">
       <div class="row">
           <img src="img/footer_service.png" class="img-responsive">
       </div>
       <div class="row company">
           CSDN博客杨校老师 版权所有Copyright 2017-2019, All Rights Reserved 鲁ICP备19007759号-1
       </div>
 
   </footer>
</body>
</html> 
蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

用一个实战案例,告诉你如何处理复杂需求!

涛涛

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

新人设计师可能都会遇到这样的问题:在设计一个复杂需求的时候,各种场景、可能性在脑中来回乱窜,常常觉得逻辑不够严密。设计完成后,又被各方质疑,提出各种异常场景,导致频繁修改,缝缝补补。本文将和大家分享下解决以上问题的小方法。

本文就以「企业内部权限分配平台」的需求为案例,整理了之前处理复杂需求的一些思路。讲讲在交互设计的过程中,如何避免以上两种情况,让我们的工作更好地服务用户,体现价值。

理解需求

首先,我想任何设计师在设计产品的时候第一步都是理解需求,这包括了需求的目标背景、角色场景、产品逻辑等,不同的需求侧重点会不同。以「企业内部权限分配平台」的需求为例,目标背景和角色都比较简单,但是一般涉及权限的产品,背后的逻辑就会很复杂,场景情况也很多。

和产品沟通,和用户沟通,甚至网上找资料,都是理解需求的一些好方法。比如本次设计的需求是关于权限分配,这一篇《网易高手:角色权限设计的100种解法》的文章,就很好地帮助我理解权限分配背后的设计逻辑。

包括理解需求内的专有名词,为其建立特殊的标识样式,也是帮助自己、团队、用户更好地理解产品需求的一种方式。

△ 名词解释

需求结构化

我们在最初思考需求的时候,肯定会从场景/问题出发,思考怎么去解决这个问题,是以「人」的思维来思考这个问题的,这是必然的,也是正确的。但此时我们的思维是散点式的,例如当我们想到权限分配的需求时,可能会说:这次我们要新增一个「岗位」的概念,让权限和岗位绑定,不要和人绑定。对了,还有人员离职这个问题困扰业务很久了,我们这次要在人员离职的时候进行……

所以,在最初的需求框架确定后,我得到的是这样两段文字:

看上去已经非常全面了,但由于我们是散点式地收集需求,很多时候可能还是会有遗漏,或者说错误关联了内在逻辑,导致一些逻辑冲突、漏洞。

此时,我们需要将我们的思维从「散点式收集」转为「结构化梳理」。从需求说明里抽丝剥茧,我们可以得到:

  • 用户角色有三类:超级管理员、业务管理员、HR;
  • 操作对象是:部门、岗位、人员、权限包;
  • 可执行的操作包括传统的:增、删、改、查,还有和本次业务相关的「关联」,即权限的赋予。

各个对象之间的关系又是怎样呢?我们把所有的对象两两组合,再把没有关系的删掉。

也就是:

  • 在部门可以下设立岗位,岗位必须从属部门;
  • 人员必须从属某一部门;
  • 人员必须从属某一岗位;
  • 权限包可以赋予给部门;
  • 权限包可以赋予给岗位;
  • 人员和权限包没有任何直接关联,这也是本次权限分配的核心。

这个具体的业务逻辑并不重要,不需要去费心理解,重要的是这样一种结构化思考的方法,可以应用在后续各种各样的设计中。

对象间的关联,再和我们刚才梳理的人物、操作相结合,就可以还原成一系列的需求描述:「角色」可以在「A对象」下「操作」「B对象」,例如:超级管理员可以在部门下新增岗位。

至此,我们已经可以建立「需求→功能对应表」:

其中,红色部分都是在之前散点式的需求罗列中没有考虑到的功能点,通过结构化的梳理,我们可以提前把它们都一一补齐。

这个过程可以减少我们最小颗粒功能点的遗漏,避免在做完大部分设计后,突然发现遗漏了某个功能,任务时间点又已经到了,慌慌忙忙地加功能,就可能会影响整体的设计思路和框架。

设计的减法:只考虑主流程

完成了功能点的整理归纳后,就可以开始我们的界面设计了。在最初的界面设计中,这三点需要做减法:

  • 优先进行框架设计,不要在一开始就考虑细节;
  • 优先完成主流程,再考虑异常场景;
  • 按照功能对应表将各个模块独立设计完成,再添加快捷操作。

当然,可以先把可能存在的异常、细节都记录下来,以便后续补充。

比如,在人员权限分配的界面结构中,分为三个大模块:

在有了界面框架和功能对应表后,我们做设计会变得比较简单,按照之前整理的「需求→功能对应表」,把每个小颗粒的功能细节填充到界面框架内即可。

设计的加法:回归场景,考虑细节

当主流程设计完毕之后,我们就要开始做加法了,在之前,我们一直是用一种纯理性的视角来完成我们的设计,保持纯理性的设计会有两个问题:

  • 很多业务场景靠逻辑思维是无法想象的,必须设身处地站在用户的角度去思考,才能理解场景,进而补充可能的体验细节。
  • 纯理性的设计,可能在功能点上是完整的,但在用户体验上是缺失的。

例如,纯从逻辑思维角度你能想到在一个企业里有人是没有任何部门归属的吗?然而现实中就存在这样的情况──外包人员。不结合实际场景,我们也不知道用户一天需要处理多少次重复操作,目前的设计对他是否足够便捷。

作为一个企业内部权限分配平台,我们可以把部⻔、岗位、人员等对象作为初始线索,站在不同的用户使用角度,沿着线索去全面地思考场景,修改功能。有一些实在难以理解的业务,找用户聊聊也是一个好方法。

很快,我们就找到了下面这些特殊场景。

1. 人员变动

  • 新增人员流程:找到新加入部门→找到岗位→添加人,由于企业内部还有一个最基础的 OA 系统,那么HR是否会需要重复操作,一个人员在不同平台添加两次?是否增加了他的工作成本?
  • 人员变动频繁,是否容易遗忘?

处理方法:行政架构自动同步,红点待办。

我们与 OA 系统数据打通,自动形成四类待办红点:人员新增、人员离职、行政部门新增、行政部门删除。

这样 HR 就不需要重复做新人员的添加操作,只需要业务管理员把 OA 内无法覆盖的人员岗位设定好就可以,也不会出现遗漏的情况。

2. 高管兼职

例如某位高管:本身为 A 部门负责人,临时兼任 B 部门负责人,那么当他不再负责 B 部门时,该如何处理他的岗位?离职?转岗?似乎都不合适。

处理方法:新增岗位移除功能。

3. 外包人员

了解到现实情况中,外包人员是没有部门归属的,但是实际上他们肯定也有自己负责的业务范围和岗位,在初始化时如何安置没有部门的人?

处理方法:新增一个部门,叫做「无岗位人员」,并且标红作为待办,提醒操作者去处理这些「无岗位人员」。

4. 人员离职/转岗

在进行功能设计整合时,我考虑是否「人员离职」应该叫「人员删除」更系统化?是否可以直接整合为一个「人员编辑」的功能,将离职、转岗的操作合并?(实际上这2个功能操作起来确实比较相似)

处理方法:最终我依然保留了「人员离职」、「人员转岗」的功能,因为这样更场景化,用户清晰地知道自己当前该操作什么。

目前对一个人进行离职操作的路径是:找到原部门→找到岗位→找到人→处理离职,而我们的企业有 2500+ 员工,对于离职操作者 HR 来说,这个路径是否现实?是否快捷?

处理方法:新增搜索功能,直接搜索人名→处理离职,这个功能也方便了其他找人的场景。

5. 更多

诸如此类的考虑还有很多,例如新建部门的时候是否会有空部门,在企业进行组织架构重组时是否会有大批量的人员、组织变动,进而需要有批量操作等等。找到最初的线索,站在用户的角度沿着线索思考,进行全局扫描,就会发现很多需要做加法的地方,发现的方式可以是观察、访谈、思考等任何方式。

在已经保证了主流程的简洁、清晰后,再用全局扫描的方式去搜集特殊场景,给我们的设计做加法,可以保证我们整体的设计框架是清晰可用的,而特殊场景是散落在骨干上的各种小分支。

如果我们可以做到,对所有的主干场景、分支场景了然于心,并且有自己的优先级考虑,那么对于项目成员、用户提出的质疑,我们也有足够的理由来证明自己设计的合理性。

当然,场景基本考虑全面后,还有最后一步,就是统一交互,完善细节,这一步也是设计上的加法。

总结

以上,就是一个针对复杂需求的加减设计法案例,总结来说有四个大步骤:

  • 从实际场景出发,发现问题,理解需求;
  • 需求结构化:把本源的场景、需求结构化成功能对应表;
  • 设计的减法:先解决最根本的问题;
  • 设计的加法:回归场景,全面考虑。

所以,交互设计师是需要理性和感性的结合,要有抽丝剥茧,提炼总结的能力,也要有贴近用户关注情感的细腻。把自己的工作规范化,减少无效付出,也是我们的一种能力。希望本篇文章对新人设计师有一些帮助,也欢迎大家一起探讨交流。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务

根据输入实时发送请求(防抖函数)

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

有这样一种常见的需求:有一个搜索框,需要根据用户的输入进行实时的查询。也就是说用户每输入一个字符就要发送一次请求。

想到的做法是监听输入框的keyup时间然后在回调里发送异步请求。

这样做的不足也很明显:

其实我们并不需要用户每次输入时都发送请求,这样会给服务器造成不必要的压力。

因为发送的是异步请求,有可能查询的结果和最后输入的内容并不匹配。

如何解决以上两种问题呢? 有两种解决方案

首先我们规定当用户停止输入1秒(具体时间根据自己需求而定)后再根据输入框的值发送请求。
其次我们利用定时器来解决以上问题。
第一种方案:直接看代码吧

vat timer
$('.input').on('keyup', function(e) {
    clearTimeout(timer)
    timer = setTimeout(function() {
      // do something
    }, 1000)
})

首先定义一个定时器timer
监听输入框的keyup事件,在回调函数里先清除timer,这一步总能保证在用户停止输入1秒后执行最后一个timer。如果用户输入的间隔小于1秒就不会执行timer
这么写似乎不太抽象,而且定义了一个全局变量timer,不友好!稍加改动一下:

function debounce(func,delay){
    var timer
    return function(){
        clearTimeout(timer)
        var event = arguments[0]  // 获取原生event参数
        timer = setTimeout(function(){
            func(event)
        },delay)
    }
}
function handle(event){
    // do something 
}
$('.input').on('keyup', debounce(handle, 1000))

这样是不是复用性更高,我们只需要在handle函数中写我们的处理逻辑就可以了。而且没有了全局变量,避免了全局污染的可能!!

*第二种方案: *

var lastTime
$('.input').on('keyup', function(e) {
    lastTime = e.timeStamp
    setTimeout(function() {
        console.log('timeout')
        if (lastTime == e.timeStamp) {
            // do something
        }
    }, 1000)
})

首先定义一个时间戳来保存最后一次输入的时间
然后1秒后在定时器里判断保存的时间戳和触发事件的时间戳e.timeStamp是否相同,只要1秒内又输入了内容,e.timeStamp就回变化。
但是这种写法有个弊端,用户键入几次就会执行几次setTimeout,也就是说当用户连续键入多个字符后,会有多个任务被推入待执行队列,然后每隔1秒执行,只是在执行的时候判断要不要发送异步请求,这种方式不会发送多余的异步请求,但是会执行多余的任务,这无疑浪费了性能。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

JQuery中的DOM操作(1)

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

DOM树

                                 

    在访问页面时,需要与页面中的元素进行交互式的操作。在操作中,元素的访问是最频繁、最常用的,主要包括对元素属性、内容、值CSS的操作。

一、操作元素的属性

attr()   prop() 获取或设置元素的属性值

两者区别:简单来说,对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。

针对属性对象不同

prop( )是针对Dom元素属性,attr( )针对HTML元素属性,和attribute与property区别一样。

用于设置的属性值类型不同

attr()函数操作的是文档节点的属性,因此设置的属性值只能是字符串类型,如果不是字符串类型,也会调用其toString()方法,将其转为字符串类型。

prop()函数操作的是JS对象的属性,因此设置的属性值可以为包括数组和对象在内的任意类型。

应用版本不同

attr()是jQuery 1.0版本就有的函数,prop()是jQuery 1.6版本新增的函数。毫无疑问,在1.6之前,你只能使用attr()函数;1.6及以后版本,你可以根据实际需要选择对应的函数。

其他不同

对于表单元素的checked、selected、disabled等属性,Attr()方法拿不到值,请使用prop()函数来设置或获取checked、selected、disabled等属性。对于其它能够用prop()实现的操作,也尽量使用prop()函数。如下图代码:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="js/jquery-1.9.1.min.js"></script>
</head>
<body>
<input type="button" id="btn1" value="按钮">
<input type="button" id="btn2" value="按钮">
<script>
    //操作元素的属性
    //attr() prop()获取或设置元素的属性值
    $("#btn1").attr("value","按钮1");//将#btn1的value值改为按钮1
    $("#btn1").prop("value","按钮2");//将#btn1的value值改为按钮2
    console.log( $("input[type='button']").prop("value"));//获取#btn1的value值,输出为按钮2
    console.log($("#btn2").attr("value"));//获取#btn1的value值,输出为按钮
    //设置多个属性值
    $("input[type='button']").prop({
        width:"200px",
        value:"hello"
    });//同时设置宽度为100px,value值为hello
    //根据输出结果,width值设置失败,value值设置成功
    console.log($("input[type='button']").prop("width"));//0
    console.log($("input[type='button']").attr("width"));//0
    $("input[type='button']").attr({
        width:"200px",
        value:"HELLO"
    })//同时设置宽度为200px,value值为HELLO
    //根据输出结果可以看到,width和value均设置成功
    console.log($("input[type='button']").prop("width"));//0
    console.log($("input[type='button']").attr("width"));//200px
 
//    var btn=$("input[type='button']");
//    btn.attr("data-src","pink");
//    console.log(btn.attr("data-src"));//pink
//    console.log(btn.prop("data-src"));//undefined
    
    
    var btn=$("input[type='button']");
    btn.prop("data-src","pink");
    console.log(btn.attr("data-src"));//undefined
    console.log(btn.prop("data-src"));//pink
 
</script>
二、删除元素的属性

removeAttr( name ) ,其中name为元素属性的名称

removeProp( name ) ,其中name为元素属性的名称

 

三、元素内容的操作

在JQuery中,操作元素内容的方法包括html( )和text( )。前者与JavaScript中的innerHTML属性类似,即获取或设置元素的HTML内容;后者类似于JavaScript中的innerText属性,即获取或设置元素的文本内容。区别如下:

语法格式 参数说明 功能描述
html() 无参数 用于获取元素的HTML内容
html(val) val参数为元素的HTML内容 用于设置元素的HTML内容
text() 无参数 用于获取元素 的文本内容
text(val) val参数为元素的文本内容 用于设置元素的文本内容
<script>
    //js中的写法 innerHTML  innerText
    var sd=document.getElementById("block");
    sd.innerText="小猫吃鱼";
    console.log(sd.innerHTML);//小猫吃鱼
    console.log(sd.innerText);//小猫吃鱼
//    //jquery  html()  text() 和js一致  获取或设置元素的html值或文本值
    console.log($("#block").html());//小猫吃鱼
    console.log($("#block").text());//小猫吃鱼
    $("#block").text("小猫抓老鼠");//修改innerText内容
    console.log($("#block").html());//小猫抓老鼠
    console.log($("#block").text());//小猫抓老鼠
    $("#block").html("小猫吃肉肉");//修改innerHTML内容
    console.log($("#block").html());//小猫吃肉肉
    console.log($("#block").text());//小猫吃肉肉
</script>
四、操作表单元素的值

val()   获取或设置表单元素的value值

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="js/jquery-1.9.1.min.js"></script>
</head>
<body>
<input type="text" id="txt" value="请输入...">
<script>
    console.log( $("#txt").val());// 获取#txt的value值  输出为:请输入...
    $("#txt").val("12345");//修改#txt的value值为12345
    console.log( $("#txt").val());//12345
</script>
</body>
</html>
五、元素样式的操作

1.直接设置元素样式值

在JQuery中,通过css()方法为某个指定的元素设置样式值,语法格式如下:

css(name,value) ,其中name为样式名称,value为样式的值

css()可以设置样式也可以获取样式



2.增加CSS类别

通过addClass()方法增加元素类别的名称,语法格式如下:

addClass(class) ,其中参数class为类名称,可以同时增加多个,用空格隔开即可,如addClass(class0 class1 class2 ...)

3.删除CSS类别

与addClass()方法相对应,removeClass()方法用于删除类别,语法格式与addClass()相同,如果不设定参数,则删除元素中的所有类名称

4.类别切换

通过toggleClass()方法切换不同的元素类别,语法格式如下:

toggleClass(class) ,其中参数class为类别名称,其功能是当元素中含有名称为class的CSS类别时,删除该类别,若没有,则增加该类别

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="js/jquery-1.9.1.min.js"></script>
</head>
<body>
<button id="btn" class="btndata">按钮</button>
<script>
    $("#btn").addClass("btn1");//追加一个类名称
    $("#btn").addClass("btn2 btn3");//追加多个类名称
    $("#btn").removeClass("btn2 btn1");//移除类名称
    $("#btn").removeClass();//移除所有类名称
    $("#btn").toggleClass("btn1");//类的切换 toggleClass()  如果有类名称则替换  如果没有就添加
</script>
</body>
</html>
六、jquery操作子父节点

children()  找父元素里面的子节点

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="js/jquery-1.9.1.min.js"></script>
</head>
<body>
<ul>
    <li class="lilist">1</li>
    <li class="lidata">2</li>
    <span>6</span>
    <li class="lilist">3</li>
    <span>5</span>
    <li class="lilist">4</li>
    <span>7</span>
</ul>
<script>
        console.log($("ul").children());//输出ul 下的所有子节点
        console.log($("ul").children()[0]);//输出ul下索引为0的子节点
        console.log($("ul>li").first());//输出ul里面第一个li
        console.log($("ul>li").last());//输出ul里面最后一个li
        console.log($("ul>li").eq(2));//eq()  根据索引找元素
        console.log($("ul>li").first().siblings(".lilist"));//找同胞元素  输出和first()相同类名称的元素
        console.log($("ul>li").eq(1).prev());//找当前元素的前一个元素
        console.log($("ul>li").eq(2).prevAll("span"));//当前元素前面的所有指定元素
        console.log($("ul>li").eq(2).prevAll());//当前元素前面的所有元素
        console.log($("ul>li").eq(1).next());//找当前元素的下一个元素
        console.log($("ul>li").eq(1).nextAll("li"));//当前元素后面的所有指定元素
        console.log($("ul>li").eq(1).nextAll());//当前元素后面的所有元素
        console.log($("ul>li").eq(0).is(".qq"));//is() 判断当前对象是谁  输出true  or  false  当前元素与类名称相符  输出true
</script>
</body>
</html>
七、JQuery中的尺寸问题

下面以高度为例进行说明

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="js/jquery-1.9.1.min.js"></script>
    <style>
       .ss{
           width: 200px;
           height: 200px;
           margin: 10px 10px;
           padding: 20px 20px;
       }
    </style>
</head>
<body>
<div class="ss"></div>
<script>
        console.log($(".ss").height());//200  可视区域  不包括内外边距 
        console.log($(".ss").innerHeight());//240  包括内边距的距离  
        console.log($(".ss").outerHeight());//240  包括内边距的距离
</script>
</body>
</html>
蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

vue-router的两种模式的区别

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

1、大家都知道vue是一种单页应用,单页应用就是仅在页面初始化的时候加载相应的html/css/js一单页面加载完成,不会因为用户的操作而进行页面的重新加载或者跳转,用javascript动态的变化html的内容

优点: 良好的交互体验,用户不需要刷新页面,页面显示流畅, 良好的前后端工作分离模式,减轻服务器压力,
缺点: 不利于SEO,初次加载耗时比较多

2、hash模式
vue-router默认的是hash模式—使用URL的hash来模拟一个完整的URL,于是当URL改变的时候,页面不会重新加载,也就是单页应用了,当#后面的hash发生变化,不会导致浏览器向服务器发出请求,浏览器不发出请求就不会刷新页面,并且会触发hasChange这个事件,通过监听hash值的变化来实现更新页面部分内容的操作

对于hash模式会创建hashHistory对象,在访问不同的路由的时候,会发生两件事:
HashHistory.push()将新的路由添加到浏览器访问的历史的栈顶,和HasHistory.replace()替换到当前栈顶的路由

在这里插入图片描述

在这里插入图片描述

3、history模式

主要使用HTML5的pushState()和replaceState()这两个api来实现的,pushState()可以改变url地址且不会发送请求,replaceState()可以读取历史记录栈,还可以对浏览器记录进行修改

window.history.pushState(stateObject, title, URL)
window.history.replaceState(stateObject, title, URL)

包括back,forward , go 三个方法
history.go(-2);//后退两次
history.go(2);//前进两次
history.back(); //后退
hsitory.forward(); //前进

区别:

前面的hashchange,你只能改变#后面的url片段。而pushState设置的新URL可以是与当前URL同源的任意URL。
history模式则会将URL修改得就和正常请求后端的URL一样,如后端没有配置对应/user/id的路由处理,则会返回404错误

参考于: https://www.cnblogs.com/ceceliahappycoding/p/10552620.html

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

干货分享:如何更好地使用栅格系统

涛涛

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

栅格系统在UI设计和前端开发中是被应用的很广泛一套体系,但真正能掌握并很好运用的人却不多,一起来学习吧!


环顾身边常见的优秀设计很多都使用了栅格系统,你可能非常赞同在界面中使用栅格系统,但却没有人告诉你应该如何使用它们。


印刷中也会用到栅格,但就本文而言,我主要想讨论的是用于PC和移动设备上的栅格系统设计。


Image title

紫色块放内容


内容块包括文本,图片或者是两者的组合形式,背景颜色实际上不能算是内容元素,除非是作为文本或者图片的容器。


Image title


上图中的粉色块作为栅格中的列,它们构成了内容宽度。一般来说,列宽是不会变的,只是列数会随着设备的不同而变化,比如从PC端的12列变为平板电脑上的8列,然后在移动端变为4列。严格来说,你其实可以定义任何想要的列宽,但大多数情况下的网格列宽都设置在60-80px之间。选择合适的列宽是最重要的,因为它是内容宽度的主要决定因素。


Image title


水槽是在列与列之间的空间。20px是一个常见的尺寸设置,当设计块状或者卡片元素的网格时,这种间距非常重要,比如做照片类设计的时候。有些系统会随着设备宽度的增加而增加水槽的宽度,但也可以保持固定。


Image title


外边距也称为外水槽,是内容宽度之外的空白区域。为了更方便的设计,外边距会随着设备宽度的增加而增加。移动设备的边距通常为20-30px,而在平板电脑和PC端,这个间距通常会差异很大。


下面会介绍一些基本的准则,但要明白在实际设计中其实没有任何硬性的规定。


1. 内容元素必须位于若干列上

其核心思想是内容元素必须位于若干列上,你可以任意分割,比如6x2,3x4,4x3。下面的例子中,我展示了不同分割方式设计的信息卡片。

Image title

Image title

不同栅格设计展示


很棒,这看起来很简单对吧。有的时候,你想把内容严格的套用在栅格布局上,会发现可能不够美观,比如下面的例子。


Image title

Image title



如果我们把内容都放在网格上,文本内容会显得很长,最佳的位置是不严格在任何网格上,这也是可以的,只要理解了整个元素实际上是一个不可见的,更大的容器就行。


Image title

Image title


这也是4x3的布局,只是给了它内部不可见的填充。当把这样的设计稿给到开发时,他们就能很直观的知道这一点,所以这更利于去理解如何实际地分配好内容。


2. 不要将内容元素留在水槽中


Image title

Image title


内容元素应该要在列宽以内,而不能流出在水槽之外,这样会违背栅格化的目的。


3. 只要父级元素对齐栅格,子级可以不完全对齐列

有些时候,你想要将设计和卡片分成两部分,一半是图片,一半是文字。你可能遇到这样尴尬的情况,图片没有完全落在一列上,文字被迫以一种奇怪的方式自适应。其实不用担心,只要“父”容器对齐栅格,这就没有关系。


Image title

Image title

Image title

父子级内容栅格排版示意


4. 除非有意,否则不要把列作为外部填充

所有重要内容都应该与栅格列宽相适应。一开始会觉得奇怪,因为如果不习惯使用网格,可能会把网格宽度当成全部内容区域,所以还需要给它设定一定的内边距。此时外边距就起到了留白的作用,它们充当了内边距。不要在网格内部利用列宽当成内边距,而是要与网格最外面保持对齐,利用网格外的间距来当做留白区域。根据代码实现方式,要么网格内的内容按比例缩放,边距固定,要么外边距与内容同时缩放。


Image title

Image title

正确的内容填充方式和不正确的把栅格当做边距


所以如果有人说“我需要一个1200px宽的设计”,这并不意味着你的设计就是1200px宽,这其实是说设计内容宽度在1200px的画布内,实际内容占位是960px,这样就会有空间留出外边距。


5. 完全出血的元素或纹理图形应该设计在画板边缘,并理解为出血的列网格


Image title

这个页面布局的顶部图片被设计成完全出血


这是一个例外的规则,当背景颜色或者图片在完全出血的情况下,开发同学会把它理解为一个全屏的内容元素。


Image title

Image title


如果设计的是装饰元素之类的内容,可以接受它被裁切掉,此时也可以脱离栅格化的设计。


Image title

Image title

一些图片和文字的出血设计


页眉和页脚有时也有例外,它们不被认为是内容的一部分。有些设计将它们固定在浏览器边缘,有些则喜欢保持内容的宽度,这取决于自身功能和内容的情况。将它们保持在内容宽度内的好处是,当用户在宽屏显示器上看页面时,不需要来回扫视;将它们固定在浏览器上的好处是可以为导航元素提供更多的空间。


栅格化布局如何做到响应式


Image title

图片来源Intuit


Image title


在传统的栅格化系统设计中,列的宽度和水槽的宽度是保持不变的,只是列的“数量”发生变化。为什么要这么处理呢?这是为了让设计更简单。如果一组三张卡片分别放在桌面的四列上,那么在平板电脑上,会显示两张卡片,并把第三张卡片进行折行显示在第二行上。不需要做任何的调整,因为已经知道它位于第四列上了。在手机上,答案也很简单,只需要一张卡片,其他的就会自动堆到下面的行中。如果你愿意,也可以变得有创意,选择只在手机上显示一张卡片,或者做一个水平滚动。这些列的自适应对于代码来说就是很简单的参考。


实际上,web必须呈现任何浏览器的宽度。例如,有一个大显示器,它可以看到1600像素宽的东西,实际上pc端的网页设计是1200px宽,平板电脑上是768px宽,手机是360px宽。所以你会看到一个小于1200px的设计,有大量的留白。但是当你的浏览器再小一个像素,1199px,会发生什么呢?


固定网格


Image title

Image title

固定栅格示意


如果开发那边写了一个固定栅格,当你从桌面缩小到平板电脑,就像是在900px的浏览器宽度时,你不会看到任何变化,设计就像是被剪掉了一样。但当达到768px临界点时,设计马上就会改变,平板电脑上的显示效果就会好起来。如果继续减小这个值,同样的事情也会发生,在到达另一个临界值之前,设计看起来都是不变的。


流动网格


Image title

Image title

流动网格的示例


现在来看看流动网格的特点,当窗口缩小时,内容将动态的发生变化,文本会进行换行,元素也会变窄。然而,这些元素在内容宽度缩小到下一个临界值之前,布局是不会变化的。


所以我想说的是,设计的临界值只是一个更改布局的参考点。这就是为什么列宽和水槽在网格中不会改变的原因,因为我们想让设计师在考虑布局时能够更容易地创建一致性。


混合网格

在实际项目中,使用流动网格和固定网格的组合也是常见的做法。网站通常是流动网格,因为它要去适应各种不同终端的大小。


一些做的很酷的栅格系统

不需要太死板地去坚持传统栅格套路,12、8、4这样的分布,甚至不需要20px的水槽。下面是一些在设计中使用栅格系统做的很棒的设计灵感。


Image title

Invision’s Genome Project


Image title

可以看到,他们的设计故意不去使用任何的水槽,所以看起来是无缝的。


这个网站不仅设计的很好,他们还利用了在设计中展示他们自己的栅格系统来让整体的设计变得更加酷炫。


Dropbox Design


Image title


他们没有设计水槽和外边距,相反,整个页面被分成两半,然后将内容填充到这两部分。


Wordpress


Image title

Wordpress创建账号页面


使用网格的方式取决于你自己。你可以在主要内容部分使用网格,次要内容则不使用。在Wordpress的例子中,页面中间的部分使用栅格化设计,左侧的侧边栏则没有使用。


The Mockup Club


Image title


内容和网格也并不总是从中间开始,对于模型网站,内容在左边也未尝不可。


Instagram


Image title

Image title


我非常确定的说,Instagram的PC端是用上了6列栅格布局。


要点总结

写这篇文章的目的是想提供一些关于如何在响应式设计中使用栅格系统。我知道对于我自己来说,我花了很多年的时间写了大量的代码来理解网格是如何工作的。我在YouYube上看了很多视频,也阅读了大量的文章,但每个人都在关注它为什么重要,却不去注重到底怎么在自己的项目中使用这些原则。


你要做的最好的事情就是从现在开始注意那些优秀设计是如何对齐元素的,你将会开始看到这些模式。为了帮助理解,这里有一些设计系统概述了它们的网格使用:


Google’s Material Design System

Intuit’s Design System

IBM’s Carbon Design System

…And here’s huge list of other systems you can look through


在完全理解了网格的工作原理之后,我已经成为了一名更好的设计师,因为我知道我的设计将如何在临界值之间进行转换。我也可以落地我的设计,使它们能够有一个完美的像素对齐。这样的规范带来了更一致,更简洁的设计,当用户从一个界面到另一个界面流转时,这真的提升了产品的档次。我建议在你的设计中去应用这些网格,并和开发一起,以相同的方式将它们落地,这将会是一个非常不错的进步。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务

官方出品!揭秘阿里巴巴APP 8.0 视觉品牌升级背后的设计思路

涛涛

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

阿里巴巴副总裁、中国内贸事业部总经理汪海在对外分享时提出 1688 已经从信息平台时代进入数字化营销平台时代,让 1688 用户在平台内完成营销和销售一体化的整个商业闭环。1688 的使命也升级成「在数字化经济时代,让天下没有难做的生意!」在全新的业务态势下,为了更好的满足用户需求,阿里巴巴(1688)主客升级势在必行。

首页重要性

首页既是业务分流的中心场景,也是平台卖家判断平台打法,买卖家感知平台价值的重要「门面」。从 UED 专业视角来看,首页是定义 APP 内体验范式及视觉风格的核心场景。

如何改?

1. 盘点现象,定义问题

满足业务新的诉求:平台阶段性战略不同,1688 从曾经的信息平台过渡到交易平台,如今向数字营销平台转型,旧的内容框架难以承载业务的新发展。

提升分流质量:从过去的数据效果来看,需重新判断,在 For 特色采购需求和服务大面采购需求之前,如何平衡调优,提升首页的流量转化效能。

体验升级:移动端 APP 天然生长在手机系统上,系统的风格更迭也牵动着 APP 的变化和升级。在 8.0 升级前,1688APP 存在着 5.0、6.0、7.0 多个由不同设计师在不同时间点所设计的场景,到8.0,APP 趋待从框架层、表现层以及品牌等方面进行统一及升级。

改版策略

1. 聚焦用户价值,基于业务打法升级内容框架

APP 升级前与业务对焦,我们收到三点诉求:

  • 用算法的能力去承接首页买家的转化;
  • 搜索是 B 类买家找品、选商的核心工具,需要引导更多用户更高频地使用搜索;
  • 互联网流量红利到瓶颈期,需要进一步做好新用户的承接。

在内容框架制定上,我们聚焦用户价值,舍掉 7.0 时的内容版块个性化,聚焦做商品的个性化,仅保留For大面用户的营销、内容场景,提升算法推荐区的曝光率,以此区域的商品做首页的直接转化。

2. 弱化容器,突出内容,塑造心智

视觉容器升级

做平视觉框架,选择「大间距分隔」,为内容留出干净、简洁的视觉空间。

精简内容栅格,避免形式给用户阅读带来的负担。

提高留白率,提升页面整体的透气性,为内容留出更清爽、轻松的阅读空间。

拉大字体大小的梯度,加重字体颜色梯度,提升文字的清晰度和可读性。

强调版块特性,塑造买家心智感知,达成业务目标

强化搜索:7.0时,曾上线过将搜索做到「主观上觉得显眼」的测试方案,但相较于之前沉浸式搜索,数据几乎没变化。

8.0 阶段,从视觉表现层跳出看:「强化搜索」并不意味把搜索设计得更「显眼」,而是达成「让更多用户更高频地使用搜索」这一目标。如提升搜索底纹词、热搜词精准度和吸引力、增加搜索布点等,都可能助力达成业务目标。

基于用户单手操作时,拇指在屏幕不同区域的点击体验,选择将搜索组件移到更易于点击、视线更聚焦的屏幕位置,上线后数据提升非常明显。

Banner 升级:7.0 的 Banner 画面丰富度高,加之描述字段多,用户阅读有一定成本,较难在 3 秒内掌握全 Banner 的信息。此外,相比于 C 类用户,B 类用户会更偏理性,我们选择以更冷静、克制的「视觉语气」与 B 类商人对话,而非渲染氛围引导点击。(上线后,同样的活动内容,按新、老两版规范设计投放两套 Banner,新版较老版 UV CTR 约高出 48%)

For 新人:以差异化的利益、个性化秒杀、新人攻略做用户的承接。

营销场景心智差异化表达:营销由伙拼爆品、天天特卖两部分组成,我们判断爆品主打心智为「卖得火爆又便宜」,特卖主打心智是「限时限量抢便宜」,选择将两个区块最关键的特质做强化表达。

内容场景(直播)动态化、互动感、实时性传递:抽象出直播间的方形版面+内容叠加形式来设计,大坑位以动图传递给用户直播的动态感,以红包、个性化商品的多维实时轮播气泡传达直播的互动感、实时性。

3. 升级品牌,贯穿APP场景

为什么要做APP应用内的品牌设计?

品牌设计是将内容层(平台价值)与接收层(用户)做柔性链接的一环,譬如在 APP 场景中,由于有商品、商家、商机等「干货」,即使不特意做品牌设计,用户也能与平台保持刚性、稳定的连接。而反过来看,品牌做得很好,但平台没有「干货」,用户也不会单奔着品牌设计来平台。我们认为,做 APP 应用内的品牌设计,核心价值在于助力用户认知到平台特性,感知平台价值。从设计专业视角来看,APP 应用内的品牌设计,有利于定义并统一 APP 内体验范式及视觉风格,保障用户的体验。

怎么做?

每位设计师所处的业务环境不一样,解决问题策略和方式也千差万别,在 APP 应用内的品牌设计中,个人选择是通过厘清内容层(平台)多层次诉求及 For 用户的价值点,认知、感知接收层(用户)特质及内容倾向,基于内容层底料+接收层用户特质确定设计底层范式,塑造用户感知。

1. 图形范式

在阿里巴巴商业操作系统中,1688 聚焦做 B 类业务,直接服务对象是 B 类买卖家,业务细分出档口尖货、淘工厂、企业采购、淘货源、微商代发、工业品超级店、跨境专供等,这些都是具有一定 B 类特质及体量感的场景,故在 APP 业务门洞及常规图标的表达上,基于扁平 vs 写实、轻盈 vs 厚重、活泼 vs 稳重的维度,图形选定轻拟物、弱对比的设计范式,塑造 B 类场景 For 买家的沉稳、份量感。

此外,异常/空白场景也是平台与用户互动,塑造用户感知品牌的机会。在空态情感化插图部分的绘制上,力求塑形出有份量、易读、有意味的场景以示对应空态,并佐以轻微动效,增强空态的互动感。(在收藏夹、我的供应商等工具型场景,基于空态信息的价值考虑,将空态与工具新手引导相结合,并未做常规的插图。)

2. 色彩范式

标准色

随着业务的发展,我们基于新的业务态势,丰富了 1688 品牌色,以橙红色作营销、利益属性的表达,以商务蓝作服务、数字化属性的表达,以金色作权益属性的表达。

辅助色

在实际产品设计中,品牌色并不足以表达各类业务场景中的多层次的内容。因此,基于 VI 品牌色,裂变出不同重量、层次更丰富的品牌辅助色。

场景用色规则

基于买家角色及场景特征定义用色规则。

1688色域及选色示意

以 HSB 模式划定出偏沉稳的 1688 色域,在日常 banner 及业务场景中可灵活取用。

3. 动效范式及应用

动效是设计的重要手段,良好的动效表达能增强信息表达强度,清晰信息层级关系,提升用户体验的舒适度。做动效之前,将 APP 信息结构平整到三层,保障内容在页面简洁明畅地呈现。

在实际落地中,动效实现非常依赖技术资源,故动效设计之前,应考虑一个前提:动效设计增益内容表达,价值可论证,效果可衡量;同时,考虑接收层用户的商人特质,我们期望动效表达给用户以稳定感,并且在设计表达上能兼顾效率。

在动效呈现部分,主要以缓入、缓出、缓动结合曲线来调节,总的来说,内容入场时节奏稍慢,速度缓,分层加载,交代清信息在 Z 轴上的层次关系,内容出场时节奏快,速度快,内容层级不用再做分层消失。

APP 内典型场景的动效案例及演示:

4. 业务品牌的价值传递

此外,除以上在图形、色彩、动效等基础维度收口外,我们也需要将业务品牌放声给买卖家,以达成业务品牌的价值传递。在 1688 向数字营销平台转型的阶段,业务提出了「源头厂货通天下」的口号,我们通过设计手段,利用 APP 开机启动页及下拉刷新的空间,将「货通天下」的概念强化表达。

结语

以上便是此次首页改版阶段性的记录。在 8.0 的视觉体系里,为更好地突出内容,视觉容器选择尽可能做轻、做平,以冷静、克制的「视觉语气」与 B 类商人对话。当然,这是设计师和业务同学阶段性的选择。后续品牌的完善及产品的优化,仍需结合数据持续打磨。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档