如何写好JavaScript | 青训营笔记

101 阅读6分钟

这是我参与「第四届青训营 -前端场」笔记创作活动的的第3篇笔记

如何写好JavaScript

1.1 写好JS的一些原则

. 各司其职:让HTML,CSS,和js职能分离。 . 组件封装:好的UI组件具备正确性,扩展性,复用性。 . 过滤抽象:应用函数式编程思维

1.2组件封装

组件是指Web页面上抽出来一个个包含模板(HTML),功能(JS)和样式(CSS)的单元。好的组件具备封装性,正确性,扩展性,复用性。

eg:

用原生 JS 写一个电商网站的轮播图:

结构(HTML)

 <div id="my-slider" class="slider-list">
      <ul>
        <li class="slider-list__item--selected">
          <img src="https://p5.ssl.qhimg.com/t0119c74624763dd070.png">
        </li>
        <li class="slider-list__item">
          <img src="https://p4.ssl.qhimg.com/t01adbe3351db853eb3.jpg">
        </li>
        <li class="slider-list__item">
          <img src="https://p2.ssl.qhimg.com/t01645cd5ba0c3b60cb.jpg">
        </li>
        <li class="slider-list__item">
          <img src="https://p4.ssl.qhimg.com/t01331ac159b58f5478.jpg">
        </li>
      </ul>
    </div>

结构

轮播图是一个典型的列表结构,我们可以使用无序列表ul元素来实现。 表现(CSS)

#my-slider{
    position: relative;
    width: 790px;
  }

  .slider-list ul{
    list-style-type:none;
    position: relative;
    padding: 0;
    margin: 0;
  }

  .slider-list__item,
  .slider-list__item--selected{
    position: absolute;
    transition: opacity 1s;
    opacity: 0;
    text-align: center;
  }

  .slider-list__item--selected{
    transition: opacity 1s;
    opacity: 1;
  }

表现

  • 使用 CSS 绝对定位将图片重叠在同一个位置
  • 轮播图切换的状态使用修饰符(modifier)
  • 轮播图的切换动画使用 CSS transition

行为(JS)

 class Slider{
    constructor(id){
      this.container = document.getElementById(id);
      this.items = this.container
      .querySelectorAll('.slider-list__item, .slider-list__item--selected');
    }
    getSelectedItem(){
      const selected = this.container
        .querySelector('.slider-list__item--selected');
      return selected
    }
    getSelectedItemIndex(){
      return Array.from(this.items).indexOf(this.getSelectedItem());
    }
    slideTo(idx){
      const selected = this.getSelectedItem();
      if(selected){ 
        selected.className = 'slider-list__item';
      }
      const item = this.items[idx];
      if(item){
        item.className = 'slider-list__item--selected';
      }
    }
    slideNext(){
      const currentIdx = this.getSelectedItemIndex();
      const nextIdx = (currentIdx + 1) % this.items.length;
      this.slideTo(nextIdx);
    }
    slidePrevious(){
      const currentIdx = this.getSelectedItemIndex();
      const previousIdx = (this.items.length + currentIdx - 1)
        % this.items.length;
      this.slideTo(previousIdx);  
    }
  }

  const slider = new Slider('my-slider');
  slider.slideTo(3);

行为:API

image.png

总结:基本方法

  • 结构设计

  • 展现效果

  • 行为设计

    API (功能)

    Event (控制流)

插件化

解耦:

  • 将控制元素抽取成插件

  • 插件与组件之间通过依赖注入 方式建立联系

  • 将TML模块化,更容易扩展

补:静态界面搭建总结

通常类似于导航栏、项目logo、快捷导航、查看更多、友情链接、立即制作等使用超链接a标签进行制作

定位 所谓的定位,简单来说就是通过css样式属性(float或position)设置HTML元素运行时在HTML页面中的位置。

css中的定位主要分为浮动(float)和定位(position)

使用固定定位这一属性定义网页元素的时候,相对的父级或者参照物是浏览器窗口;当position属性设置为fixed时,即将元素设定为固定定位,这一属性脱离普通文档流存在,所以设定后,它将始终显示于固定的位置,不随浏览器窗口变化而变化,也不随浏览器滚动条而改变位置

脱离文档流:fixed,absolute;

脱离文档流 能让 HTML 元素脱离文档流的方式:

将元素设置为浮动 将元素设置为绝对定位 将元素设置为固定定位 position属性 position 属性具有 4 个值:

static:表示静态定位,默认值(不开启定位) absolute:表示绝对定位 fixed:表示固定定位 relative:表示相对定位 显示与溢出 显示与隐藏 如下所示:

display 属性:用来设置 HTML 元素的显示类型。 visibility 属性:用来设置显示或隐藏 HTML 元素。 display属性 CSS display 属性用来设置 HTML 元素的显示类型,例如将 HTML 页面中某个元素设置为块级元素、内联元素或者行内块级元素的显示类型。当然,display 属性也可以将某个元素隐藏,在运行该 HTML 页面时,是看不到这个元素的效果的。

display 属性的值较多,这里主要围绕显示隐藏进行学习。该属性的常用值如下所示:

block:表示将某个元素的显示类型设置为块级元素。 inline:表示将某个元素的显示类型设置为内联元素。 inline-block:表示将某个元素的显示类型设置为行内块级元素。 none:表示将某个元素进行隐藏,不显示在 HTML 页面中。 当为某个元素设置 display 属的值为 none 时,表示关闭了该元素在 HTML 页面中的显示。这种情况下,由于隐藏的元素不再在 HTML 页面中占用任何区域,所以会导致该元素后的所有兄弟元素的布局显示位置。并且,该元素的所有后代元素也同样会被关闭显示效果。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            width: 100px;
            height: 100px;
        }

        .box1{
            background-color: grey;
        }
        .box2{
            background-color: purple;
            display:none;
            /* 当前元素设置为隐藏
               所占区域消失
               当前元素设置为显示
               将display设置为非none值 */
        }
        .box3{
            background-color: yellow;
        }
    </style>
</head>
<body>
    <!-- <div></div> -->
    <div class="box1"></div>
    <div class="box2"></div>
    <div class="box3"></div>
</body>
</html>

image.png

这是运行display:none;之前和运行display:none;之后的两个效果

visibility属性

visibility 属性的值常用的有 2 个,如下所示:

  • visible:表示将某个元素设置为显示。
  • hidden:表示将某个元素设置为隐藏。

内容溢出 overflow属性 CSS overflow 属性用来设置当子级元素溢出父级元素的区域时,要如何进行处理。该属性的值具有如下几种:

visible:l默认值。内容不会被修剪,会显示在父级容器之外。 hidden:内容会被修剪,并且其余内容不可见。 scroll:内容会被修剪,浏览器会显示滚动条以便查看其余内容。 auto:由浏览器决定,如果内容被修剪,就会显示滚动条。 当设置 overflow 属性的值为 hidden 时,表示如果子级元素溢出父级元素时,将溢出部分的内容进行隐藏

当设置 overflow 属性的值为 scroll 时,表示如果子级元素溢出父级元素时,浏览器显示滚动条来查看溢出部分的内容

值得注意的是,当设置 overflow 属性的值为 scroll 时,无论子级元素是否溢出父级元素,浏览器都会显示滚动条

当设置 overflow 属性的值为 auto 时,浏览器会根据具体的情况来判断是否显示滚动条,具体情况如下:

如果子级元素没有溢出父级元素的话,浏览器则不显示滚动条。 如果子级元素溢出父级元素的话,浏览器则显示滚动条。 ext-overflow属性 CSS text-overflow 属性用来设置当文本内容溢出时,要如何进行处理。该属性的值具有如下几种:

clip:将文本内容超出父级容器的部分隐藏。 ellipsis:将文本内容超出父级容器的部分使用省略号(…)表示。 string:将文本内容超出父级容器的部分使用指定文本内容表示,例如“.”等。 注意:当设置 text-overflow 属性时,同时需要设置 overflow 属性为非 visible,否则 text-overflow 属性将无效

z-index设置层级必须拥有定位属性 在需要给某一元素设定层级的时候,必须设置定位属性,否则不起作用; 注意:

  1. (1)z-index的默认值是0,同级元素取值越大,定位元素在层叠元素中越靠上;
  2. (2)父子元素比较,父元素z-index不会起作用,子元素在z-index正负值上才会与父元素产生层叠效果。
  3. (3)不同父元素且父元素设置z-index情况下,子元素依照自己父元素的z-index发生层叠(即“拼爹”)。
  4. (4)在上一条情况的基础上,修改子元素的z-index只会影响该子元素的层叠效果,对父元素不产生影响。
  5. (5)同样在(3)的情况下,为子元素z-index设置负值,那他们就都会被父元素覆盖掉。 2、如果取值相同,根据书写顺序,后来者居上。

3、数字后面不能加单位。

4、只有相对定位,绝对定位,固定定位有此属性,其余标准流,浮动,静态定位都无此属性。