一个项目前端布局给我的思考

内容包括: HTML(讲述你不知道的absolute和float关系)和javascript(自己写的一段原生js实现双击切换效果)

最近在一个项目中发现一个自己一直忽视的问题 position 和 float 的混用问题,position定位给我们前端开发中页面的布局带来了很多的好处,但如果页面使用过多的position定位,你将会发现,页面的布局超出了你的控制,就算是最终经过各种修改尝试,页面达到了你的设计效果,但是回过头来你再审视你的代码你会不禁感慨‘我擦,这是一坨什么!’。

所以,需要加深基础的学习,从而简化布局工作量,用最少的代码来实现我们所需要的布局效果,通过这次的实践我发现了自己前端开发中存在知识缺陷问题,所以写了一篇文章和大家相互学习。

要实现的页面布局效果是下面这个样子的,它由三部分组成菜单按钮,导航栏,侧边栏,看到这个样子同学会不以为然,‘不就是这么常见的布局吗?貌似也不会有什么技术含量呀!你不会是在逗我吧’

点击查看效果示例

最终效果图

这时我想说,‘no!no no no!各位看官莫急,且听在下慢慢道来’,我们如果在每个模块加上不同颜色的边框你就会发现不同之处,下面图片中的一些模块的名称定义,需要记一下哟,这会更方便你阅读全文:
点击查看效果示例
各个模块加边框后的显示效果

1.使用图文混合的布局解决导航栏的布局

<a class="l-link" href="javascript:;">
    <div class="l-float">
        ![](./svg/menu.svg)
    </div>
</a>

<ul class="l-list">
    <li class="l-list-item">首页</li>
    <li class="l-list-item">分类一</li>
    <li class="l-list-item">分类二</li>
    <li class="l-list-item">分类三</li>
</ul>

我们常见的形式为:

 ![](default.jpg)
 <p>这是一个图文混合布局</p>

是有一个行内元素和一个块状元素组成,或者是有inline, inline-block, block转换的行内元素或者块状元素。

2.使用position定位中的 absolute或者fixed的特性,由于fixed是absolute的扩展,只是定义改变了定位出现的形式,所以fixed继承了absolute的破坏性和包裹性两个特性。对于这两个特性不了解的同学可以百度相关方面的文章。

百度搜索好文章

在上述代码结构上加上l-container容器,使用position:fixed,使用fixed的包裹性
效果图如下:

包裹特性使用后效果图

使用过图文混合效果的同学应该知道,右边导航栏的高度随着左边的高度变化而变化,所以解决l-list 的高度不是内容的高度的方法即是在l-list中加入overflow:hidden;即可做到如下图的效果:

position-float-5.png
  代码结构如下:

 <div class="l-container">
      <a class="l-link" href="javascript:;">
         ……
      </a>

      <ul class="l-list">
        ……
      </ul>
</div>

3.侧边栏和菜单按钮的布局(讲述你不知道的absoute和float关系)

它们是兄弟关系,都能使元素脱离文档流(慕课网知识充电),但是还有一层关系你要知道?集中注意力往下看你哟!
如何使导航栏中的菜单按钮达到更好的用户触发使用效果?
所以设计成了如最终效果图显示的布局,
a,增大按钮的可触发范围使之与侧边栏的宽度等距;
b,使菜单按钮一部分遮挡侧边栏的一部分区域,从而实现更好的切换效果

实现a设计简单增加宽高样式,如果不能设置将元素转化为行内块状元素。
侧边栏的实现不用说就是position:fixed;或者position:absolute;
实现b就要稍微动一下心思。
通常,当我们写完代码后测试发现,效果并不是我们想的样子,我们发现实际显示效果是侧边栏的一部分遮挡住了菜单按钮,‘我擦,这个难不住机智的我们’,使用z-index:99999999;但是我们刷新页面后发现不是这个样子的,这是为什么呢?

我们都知道float ,和 absolute 都能使被修饰的模块脱离文档流,但是脱离文档流后两者的层级关系如何,这个问题有的人想过,可能大部分人都没有想过,这个我也看过很多文章发现基本没有人说的明白。但是这并不妨碍我发表一下个人的观点:
*虽然float和absolute都能使元素脱离文档流,但是absolute脱离文档流后就不影响原来所处容器内的元素布局,但是float却不是,举一个最常见的例子就是清除浮动,所以,虽然说float,absolute都是脱硫文档流,但严格地讲float应该称之为半脱离文档流。因此在层级关系上来说absolute的层级更高。
*从我们写的这个例子来讲l-container positon:fixed;
l-menu float:left;样式后,l-container包裹(理解包裹特性)l-menu也可以知道abso的层级高于float的层级。
github下载代码如果喜欢记得添加个星星-
虽然有些同学不知道这是为什么,但是不妨碍我们解决问题,那就是将l-container和 l-postion这两个同根模块都设置position:absolute或者position:fixed;样式,对就是这个样子的,我们开发的过程中与到类似的问题,我们也是采用了‘同一性’的原则,就像我们在解决不同浏览器兼容性问题时采用的normal.css一样,将属性同一。

这部分的代码结构是:

 <div class="l-container">
      <a class="l-link" href="javascript:;">
         ……  // 菜单按钮
      </a>

      <ul class="l-list">
        ……  // 导航
      </ul>
</div>

<div class="l-position">
 …… // 侧边栏
</div>

附上:js侧边栏实现的js原生代码:

var flag = true; // 显隐标识符
var obj = document.getElementsByClassName('l-link')[0]; 
var lPos = document.getElementsByClassName('l-position')[0];

obj.onclick = function(){
    if(flag){
        // 添加 l-active
        objClass = lPos.getAttribute('class') || '';
        lPos.setAttribute('class', objClass + ' l-active');
        return flag = false;
    } else {
        // 去除 l-active
        objClass = lPos.getAttribute('class');
        objArr = objClass.split(/\s+/);
        if(objArr && objClass !== null){
            for(var i=0, len=objArr.length; i<len; i++ ) {
                if(objArr[i] === 'l-active'){
                    objArr.splice(i, 1);
                }
            }
            var objClass2 = objArr.join(' ').replace(/^\s|\s$/g, '');
            lPos.setAttribute('class', objClass2) ;
            return flag = true;
        }
    }
}

github下载地址:

本文相关文件为position-float.html和position-float.html

其他文件有时间不妨也点一下,相信或多或少会对你有一定的帮助!感谢支持!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,744评论 1 92
  • CSS布局 布局是CSS中一个重要部分,本文总结了CSS布局中的常用技巧,包括常用的水平居中、垂直居中方法,以及单...
    web前端学习阅读 1,593评论 1 38
  • 前言 现在,我们被称为前端工程师。然而,早年给我们的称呼却是页面仔。或许是职责越来越大,整体的前端井喷式的发展,使...
    Calvin李阅读 492评论 0 0
  • 昨天学到的是好词,今天却是不吉利的Ominous,乍一看有点像Omnipotent(万能的),因为Omni作为词缀...
    FeBird阅读 1,052评论 0 0
  • 有两件事,一定是亏本的买卖:一是发脾气,哪怕你再有理,也难免会得罪人,失去机会;另外一种是冲动下做承诺,脑子一热,...
    罗掌柜real阅读 138评论 0 0