zoukankan      html  css  js  c++  java
  • CSS 笔记

    这篇文章记录一些 css 的基本概念

    float

    它脱离文档流,相对于它的包含块,放置自己的位置,包含块不是position!=static,这一点跟absolute fix的元素有点区别。包含块指的是它最近的块级祖先。

    介绍一下几个属性 offsetTop, offsetLeft, offsetParent, offsetWidth, offsetHeight,

    • offsetParent: mdn,最近的父级元素,同时该父级元素必须是 positioned 元素,也就是 position == relative,absolute,fixed 的最近父级元素。如果没有这样的元素,那么最近的td,th,table 会被返回,如果还没有,那么body 被返回。

    这个元素是offsetTop, offsetLeft 的参考系。

    <div class="offsetParent" style="position:relative;">
      <div class="NOT offsetParent">
        <div>Which element is my offsetParent?</div>
      </div>
    </div>
    
    • offsetLeft 它其实描述的是 borderbox 的左边 相对于 offsetparent 的 paddingbox 的左边的距离,

    • offsetTop 它描述的是 borderbox 的顶部距离 offsetparent 的 paddingbox 的顶部的距离

    • offsetWidth/offsetHeight,它描述的是 borderbox 的宽高。MDN

    • Element.getBoundingClientRect() 这个函数可以获取元素的相对于ViewPort的位置跟大小信息。
      可以参考下面这幅图
      offset picture

    clientWidth clientHeight MDN

    它实际上值的是 paddingbox 的宽与高,但是要移除 scrollbar 的宽高。 对于 inline element 和没有 CSS 的元素,返回 0. 参考这副图
    对于去除页面的抖动,有两篇文章张鑫旭 引用 2

    总结一下: scrollbar 会占据容器的可用空间,原本 border-box 内部就是 pading-box, padding-box 内部是 contentbox.但是当 scrollbar 出现时,border-box 内部会有 padding-box + scrollbar。
    分享一段 antd 里面的一个方法 getScrollBarSize(),这个方法通过添加元素的方式来获取 scrollbar 的大小,得到后,再把添加的 dom 移除掉。

    export default function getScrollBarSize(fresh) {
      if (typeof document === "undefined") {
        return 0;
      }
    
      if (fresh || cached === undefined) {
        const inner = document.createElement("div");
        inner.style.width = "100%";
        inner.style.height = "200px";
    
        const outer = document.createElement("div");
        const outerStyle = outer.style;
    
        outerStyle.position = "absolute";
        outerStyle.top = 0;
        outerStyle.left = 0;
        outerStyle.pointerEvents = "none";
        outerStyle.visibility = "hidden";
        outerStyle.width = "200px";
        outerStyle.height = "150px";
        outerStyle.overflow = "hidden";
    
        outer.appendChild(inner);
    
        document.body.appendChild(outer);
    
        const widthContained = inner.offsetWidth;
        outer.style.overflow = "scroll";
        let widthScroll = inner.offsetWidth;
    
        if (widthContained === widthScroll) {
          widthScroll = outer.clientWidth;
        }
    
        document.body.removeChild(outer);
    
        cached = widthContained - widthScroll;
      }
      return cached;
    }
    
  • 相关阅读:
    ubuntu lvm模式进行扩容
    Kickstart Round G 2018
    AtCoder Regular Contest 102 D
    论文阅读 | Clustrophile 2: Guided Visual Clustering Analysis
    Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) E. Down or Right
    SQL语句报错:Incorrect string value: 'xE9x98xBFxE6x96xAF...'
    SQL语句报错:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near
    WAMP集成环境虚拟路径修改
    L2-025 分而治之(图)
    L2-024 部落(并查集)
  • 原文地址:https://www.cnblogs.com/kongshu-612/p/14877665.html
Copyright © 2011-2022 走看看