SCSS 管理 z-index

2020-10-19  本文已影响0人  bowen_wu

概述

业务需要编写一个公共组件,这个组件需要 position: fixed;,那么这个组件的 z-index 应该是多少呢?是否会被引用者页面的其他组件覆盖呢?基于此我们需要在项目中进行 z-index 的管理,如何在一个复杂的布局中管理每一个组件的层级呢?

问题

每一个 z-index 实例都会引发许多问题

使用 SCSS

解决方案:在一个统一的地方保存 z-index 的值,所有使用到 z-index 值的地方都去这里取值即可。

  1. 统一的地方
// _zIndex.scss 全局文件

$elements: negative, background-color, border, auto, element, float, positive, modals;
  1. 如何取值
// _function.scss 全局文件

@function get-z-index($list, $element) {
  $z-index: index($list, $element);
  @if $z-index {
    @return $z-index;
  }
  @warn 'There is no item "#{$element}" in this list; choose one of: #{$list}';
  @return null;
}
  1. 使用
// page.scss

.float {
  ...
  z-index: get-z-index($element, float); // z-index: 6;
}

.modal {
  ...
  z-index: get-z-index($element, modals); // z-index: 8;
}
  1. 进阶
    如果布局更复杂,有多个层叠的上下文和层叠顺序,在这种情况下,一个列表可能不够,我们需要创建多个列表,每个列表会被认为是一个上下文
// _zIndex.scss
$elements: negative, background-color, border, auto, element, float, positive,
  modals;
$modal-elements: fields, form-controls, errors, autocomplete-dropdown;

// page.scss
.modal {
  z-index: get-z-index($element, modals); // z-index: 8;

  .field {
    z-index: get-z-index($modal-elements, field); // z-index: 1;
  }

  .form-controls {
    z-index: get-z-index($modal-elements, form-controls); // z-index: 2;
  }
}
  1. 扩展使用
    有些时候我们想在 element 和 float 中间插入一个 z-index,这个时候可以使用 SCSS 的列表函数进行操作
// page.scss
$elements: insert-nth($element, xxx, 5);

.xxx {
  z-index: get-z-index($element, xxx); // z-index: 6;
}

总结

上一篇 下一篇

猜你喜欢

热点阅读