【译】设计师/后端工程师也能马上实践!前端设计(CSS设计)的技巧

本文是我在众成翻译平台上认领并翻译的:设计师/后端工程师也能马上实践!前端设计(CSS设计)的技巧 ,正文内容如下:

大家好,我是2015年的应届毕业生小原,职位是前端工程师。不久前我加入了新业务的开发,负责前端的设计和实现。我想在回顾当时做法的同时,总结出一套能够轻松实现的前端编程设计方法。

什么是高灵活性的前端开发设计

不论开发什么样的业务,都可能面临界面样式没有完全确定,或者今后还需要增加或改变功能点的情况。因此代码开发与业务构思一样,都需要具备高度的灵活性,对变化频繁的前端来说更是如此。

前端开发的灵活性是指,前端代码能在多大程度上高效的、持续地应对界面更新。

我们需要应对哪些变化

界面的变化需求是各种各样的,比如“把这个按钮的颜色和大小改一下”或者“把这块内容往上移一些,让它更醒目一点”之类的。这些修改需求虽然看起来五花八门,但其实都可以分为【功能点的布局】的变化和【功能点的外观】的变化这两类。

分离【功能点的布局】与【功能点的外观】

将这两者分离能够形成高效的敏捷性开发周期:从精益开发、设计构思到针对业务不断地进行测试、逐步改善功能。在这种开发模式下,将用户场景(接触功能点的流程 → 功能点的布局)和印象唤起(外观引起的情绪性操作 → 功能点的外观)分离并独立修改的情况也会很多。如果把【功能点的布局】与【功能点的外观】这两个要素分离开来进行独立开发,那么其中一个要素改变的时候另一个要素就不会产生bug(比如改变外观的时候布局被打乱)。这样一来就能够实现快速响应更新的高效率开发了。另外,由于能够将功能的各个组成部分像堆积木一样组装起来构建网站,开发人员还可以轻松地尝试各种各样的布局。

也就是说,在前端开发中,采用将【功能点的布局】与【功能点的外观】有意识地分离开来的设计,能够使代码具备足够的灵活性来应对业务改进的需求。而且这种设计实施起来非常简单。

明白这一点之后,即使你不懂前端,也能大致了解什么是具有灵活性的良好编程设计了吧。

分离开发【功能点的布局】与【功能点的外观】的方法

引言说的有点多了,还是来看看具体应该如何进行上文所述的前端开发吧。 总体思路是,在有关DOM构造和CSS的部分,遵循分离【功能点的布局】与【功能点的外观】这一规则进行代码编写。 ※ 详细的规范:文件结构与布局的命名遵循SMACSS风格,模块的命名则遵循BEM风格。

【功能点的外观】代码编写方法

首先介绍【功能点的外观】,这部分代码我采用了流动设计。这里的流动设计是指,元素的宽高尺寸依赖于外层元素,随外层元素宽高尺寸的变化而变化。代码实现如下所示:

    // 例1 左边栏设计
    <div class="item">
        //与item的外观相关的所有css类名全部包含“item”
        <div class="item__movie">...</div>
        <div class="item__body">
            <div class="item__body__title">...</div>
            <div class="item__body__prof">
                //在item中添加了prof组件
                //同样与prof的外观相关的所有css类名全部包含"prof"
                <div class="prof">
                    <div class="prof__user">
                        <div class="prof__user__img"></div>
                        <div class="prof__user__inf"></div>
                    </div>
                </div>
            </div>
            <div class="item__body__tag">...</div>
        </div>
        <div class="underline"></div>
    </div>

/** 外层的.item的设计要注意 **/
.item{
        width: 100%; /** 为了将宽度的设置交给【item的布局】css文件,在这里将宽度设为100% **/
        /** float: left; 反例  设置【item的布局】的css不要写 **/
        /** margin: 10px; 反例  设置【item的布局】的css不要写  **/
        /** 以下是设置外观的css **/
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        -webkit-box-shadow: 0px 1px 3px rgba(51, 51, 51, 0.3);
           -moz-box-shadow: 0px 1px 3px rgba(51, 51, 51, 0.3);
                box-shadow: 0px 1px 3px rgba(51, 51, 51, 0.3);
        -webkit-border-radius: 3px;
           -moz-border-radius: 3px;

}

/** 为避免在item外发生css干扰进行嵌套**/
/** 另外,使用__明确表示这是item的子元素**/
.item .item__body{
    /** 自由设置css **/
    ...
}
.item .item__body .item__body__title{
    /** 自由设置css **/
    ..
}
    // 例2 右边栏设计
    <div class="nav">
        <div class="nav__title--l">...</div>
        <div class="nav__select">
            <div class="nav__select__child">...</div>
            <div class="nav__select__child">...</div>
            <div class="nav__select__child">...</div>
        </div>
        <div class="nav__title--s">...</div>
        <div class="nav__title--s">...</div>
        <div class="nav__title--s">...</div>
    </div>
/** 外层的.nav的设计要注意 **/
.nav{
    /**为了将宽度的设置交给【nav的布局】css,在这里将宽度设为100% **/
        width: 100%;
        height: 100%;
        /** float, margin之类与布局有关的css不要写 **/
        /** 以下是设置外观的css */
        -webkit-box-shadow: 1px 0px 3px rgba(153, 153, 153, 0.5);
           -moz-box-shadow: 1px 0px 3px rgba(153, 153, 153, 0.5);
                box-shadow: 1px 0px 3px rgba(153, 153, 153, 0.5);
        position: relative;
        color: #e9e8e8;
        background-color: #253038;
}

/** 避免在nav外发生css干扰**/
.nav .nav__title{
    /** 自由设置css **/
    ...
}
.nav .nav__title.nav__title--l{
    /** 自由设置css **/
    ...
}
.nav .nav__select{
    /** 自由设置css **/
    ..
}

为什么这样写?

这段代码的目的是将class="item"class="nav"这两个元素内部包含的所有子元素的【功能点的外观】整合起来。class="item"所包含的class="item__body"等内部元素的css设计也可以进一步细化,但首先要注意的是,class="item"class="nav"这两个父元素的与【功能点的布局】相关的css设计没有写在这个css文件中。

这样一来,对class="item"class="nav"这两个元素来说,【功能点的外观】就被独立出来了。

※像class="nav__title--l"这样包含“__"或“-”的命名方法是基于BEM记法的。在这里的作用只是一种命名规范,比如为了明确地防止在元素class="item"外发生css干扰。

【功能点的布局】代码编写方法

接下来介绍【功能点的布局】,为了设定各个组成部分的位置,我准备了一个盒模型。代码实现如下所示:

<html>
    <head>...</head>
    <body>
        <div class="l-wrap">
            <div class="l-main">
                <div class="l-header"></div>
                <div class="l-height-offset"></div>
                <div class="l-side"></div>
                <div class="l-cont">
                    <div class="l-cont__body"></div>
                </div>
            </div>
        </div>
    </body>
</html>

/** 在设定布局的代码中加上前缀“l-” **/
/** background, color, border等与外观有关的css不要写 **/
/** 感觉就像在编写只定义了大小和位置的透明盒子 **/
.l-wrap {
    width: 100%;
    height: 100%;
    /**  像这样与外观有关的css不要写 **/
}
.l-main {
    width: 100%;
    min-height: 100%;
    vertical-align: top;
}
/** 如果要写设定外观的代码,要通过不同的类名来写 **/
.main {
    background-color: #fbfbfc;
}
.l-header {
    position: fixed;
    z-index: 100;
    top: 0;
    left: 0;
    width: 100%;
    height: 48px;
}
.l-height-offset {
    height: 48px;
}
.l-side{
    position: fixed;
    z-index: 99;
    top: 48px;
    width: 230px;
    height: 100%;
    max-height: 100%;
}
.l-cont{
    -webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
            box-sizing: border-box;
    width: 100%;
    padding-left: 230px;
    margin: 0 auto;
}
.l-cont__body {
    -webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
            box-sizing: border-box;
    width: 100%;
    max-width: 1064px;
    min-height: 80%;
    padding: 48px 28px;
    margin: 0 auto;
}

为什么这样写?

这段代码的目的是完成【功能点的布局】。此时与【功能点的外观】有关的css不能出现。感觉就像在编写只定义了大小和位置的透明盒子。

※像class="l-cont"这样有前缀“l-”的类名,目的是表明这是用于布局的css。这种命名方式是对SMACSS记法的模仿。与模仿BEM记法时一样,它的作用只是一种命名规范,是为了明确地将【功能点的布局】独立出来所作的标记。

将【功能点的外观】嵌入【功能点的布局】上的结果

将上述【功能点的外观】嵌入【功能点的布局】上的结果如下所示:

简单的工作!

只需要将【功能点的外观】像积木一样嵌入到【功能点的布局】上就大功告成了。 将两者分离后,一方面修改外观的时候不会再出现打乱布局的情况,另一方面在添加/删减功能时也只需要增减积木块就行了。

再次总结

只要掌握了分离【功能点的布局】与【功能点的外观】这一技巧,就能编写出具有灵活性的代码

如果你是设计师、后端工程师等非前端工作者,因为被老板说“我想做个网站但人手不足,你来想办法写写代码吧!!”而开始写前端代码的时候,请一定要尝试这种方法。如果能因此减少你对前端代码的畏惧,让你能够自信地编写代码,那就再好不过了。

时间: 2024-10-20 10:07:36

【译】设计师/后端工程师也能马上实践!前端设计(CSS设计)的技巧的相关文章

Java 后端工程师实习总结

2017-9-16 8 月份开始到现在,进行了一个多月的实习,岗位是 Java Web 后端开发.这过程学到的知识着实比自学要来得多,而且也让我意识到需要学习的知识也更加多.在这里我会在比较大的方面总结这次实习中学习到的事情,以及之后需要努力学习的知识. 基础 经过一个多月的项目的锻炼,最大一点感受就是基础的重要.这里我指的是数据结构基础.因为经历过实际项目的开发,无疑我更清楚一个企业项目里的编程是怎样一会事,明白实际用到的技术大概是怎样而这个过程我了解到基本的数据结构是如此重要.老实说,我感觉

帮设计师与工程师更好沟通的实用技巧

摘要:设计师与工程师的交流经常是鸡同鸭讲,牛头对不上马嘴,为了帮同学们搞定这个难题,一位国外的设计师兼开发者整理了一个列表,帮同学们能跟工程师无障碍沟通,全是非常实用的知识点. 开发者一般不是令人惊艳的设计师,设计师也通常不是出色的开发者.虽然有很多例外,但这两行的门道对对方而言都是难以言说的谜,然而双方却要在这种情况下合作完成项目.作为在两个领域都工作过的人,我为设计师整理了一个列表,使他们能够更好地辅助开发者开发应用和网站. Photoshop 开发者经常需要处理设计师制作的Photosho

PHP程序员的职业规划,走进PHP后端工程师的世界

PHP程序员的职业体系,小记留查. PHP是最广泛的we开发语言. PHP历史:1994年创建,1995年对外发表第一个版本,名为:personal home page tools,之后发表PHP1.0.1995年中期,PHP2.0,从此建立了PHP在动态网站开发的地位.1997,PHP3.2000年PHP4.0.2004年7月,PHP5.0,改版以Zend II为引擎,实现面向对象. PHP的职业前景:webb3.0的升温,互联网技术发展的热潮,技术创新等特点,决定了要依靠最快卡法速度和最低成

解决前后端工程师协同工作的问题

前后端工程师工作协同工作主要环节在于数据交互与业务流程控制. 在数据交互方面遇到这种情况,前后端工程师一开始没有沟通好数据交互格式,因为后端做得快,已经写完接口,出了接口文档,而前端工程师在开发的时候使用了一些框架或者是一些插件,而框架的接口数据有规定,但是后端出的接口数据与前端开发所需要的接口数据不一样,这时候前端工程师就处于被动状态,临时解决问题方法只有三个: 一.把后端传过来的数据在前端再转化一次,转成框架需要的接口数据. 缺点:加大了前端开发时间,影响前端页面性能. 二.前端重新自己写一

今日头条2017后端工程师实习生笔试题 - 题解

今日头条2017后端工程师实习生笔试题 最大映射 题意 给n(不超过50)个字符串,每个字符串(长度不超过12)由A-J的大写字符组成.要求将每个字符映射为0-9,使得每个字符串可以看作一个整数(不能有前导零),求这些字符串映射后得到数字的最大和值.(数据保证至少有一个字符不是任何字符串的首字母) 思路 根据字符所在的位置,累积统计每个字符的权值,从右到左权值分别为1, 10, 100, 1000..... 然后排序,从权值最小的到权值最大的依次映射为0-9,求和即为答案. 注意 由于每个字符串

前后端分离的思考与实践(一)

原文出处: 淘宝UED - 常胤 也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离) 前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了"前后端"的定义,引入前端同学都熟悉的NodeJS,试图探索一条全新的前后端分离模式. 随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制

前后端分离的思考与实践(六)

原文出处: 淘宝UED - 筱谷 Nginx + Node.js + Java 的软件栈部署实践 起 关于前后端分享的思考,我们已经有五篇文章阐述思路与设计.本文介绍淘宝网收藏夹将 Node.js 引入传统技术栈的具体实践. 淘宝网线上应用的传统软件栈结构为 Nginx + Velocity + Java,即: 在这个体系中,Nginx 将请求转发给 Java 应用,后者处理完事务,再将数据用 Velocity 模板渲染成最终的页面. 引入 Node.js 之后,我们势必要面临以下几个问题: 技

腾讯社招 —— 腾讯游戏后端工程师-电话面试

腾讯游戏后端工程师电话面试内容 本来想着9月份再往大厂投简历,但是由于一些其他因素,在boss上投了腾讯三个部门,记录一下2019年05月23号第一个部门的电话一面内容. 描述一下linux系统中的进程与线程,进程中哪些是线程共享的,线程拥有哪些私有的内容. 说一下自己对go语言和java和c之间的区别. 协程相比进程线程有哪些不同. goroutine的优点和缺点. go语言如何实现继承封装和多态. tcp和udp的区别,dup的头部有哪些字段,tcp头部有哪些字段. 简单介绍一下你在公司的项

2019年Java后端工程师常见面试题和感想

来新公司有5个月了,从第二个月开始就参与公司后端工程师的面试工作了,包括校招在内,面试超过100个(包括40个校招的终面)应聘者了,应聘者中有超过10年的技术经理,有6年以上的高级开发,有3到5年的中级开发,有刚毕业的初级开发,当然还有未毕业的硕士生本科生,有入职公司的,也有外包公司来参与公司项目的,总之,各种水平层次的都有,每个人的素质也参差不齐,今天就分两个部分讲一讲,一个是作为技术面试官,我比较喜欢问的问题,二是面试后的一些感想,希望对大家有帮助,同时也是要鞭策自己. 一,常见的面试题 这