当使用position:fixed时是否可以保持父元素的宽度?

2024-02-05

当我们申请时position:fixed到一个元素,它被采取脱离正常流动 http://quirksmode.org/css/css2/position.html#link7文档的宽度,因此它不尊重其父元素的宽度。 有没有办法让它继承父级的宽度如果这是以百分比形式声明的? (下面的工作用例)

let widthis = $('.box').width();
$('.dimensions').text(`width is ${widthis}`);

$('button').on('click', function() {
  $('.box').toggleClass('fixed');
  let widthis = $('.box').width();
  $('.dimensions').text(`width is ${widthis}`);
});
.container {
  max-width: 500px;
  height: 1000px;
}

.box {
  background-color: lightgreen;
}

.fixed {
  position: fixed;
}

.col-1 {
  border: 1px solid red;
  float: left;
  width: 29%;
}

.col-2 {
  border: 1px solid pink;
  float: left;
  width: 69%;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>Click this to toggle position fixed for the left column</button>
<div class="container">
  <div class="col-1">
    <div class="box">
      fixed content<br>
      <span class="dimensions"></span>
    </div>
    </div>
  
  <div class="col-2">
    some other content
    </div>
  </div>

这是一个有趣的挑战。要解决这个问题,我们首先应该了解什么fixed事实上确实如此。

了解固定

Unlike absolute, fixed 不将自己定位于其最近的亲属父母。反而,fixed 相对于视口定位自身。视口将始终保持固定,这就是为什么您会得到这样的效果。

话虽如此,每当您“继承”任何宽度时,它将与视口相关。因此,当我们尝试将目标元素的宽度设置为其父元素的宽度时,这对我们没有任何好处。

了解有关不同行为的更多信息position https://css-tricks.com/absolute-relative-fixed-positioining-how-do-they-differ/.

快速解决方案

有两种方法可以解决这个问题。

Pure CSS

我们可以用pure CSS来解决这个问题,但是我们需要提前知道宽度。假设它的父元素是300px;

.parent{
    width: 300px;
}

.parent .fixed_child{
    position: fixed;
    width: 300px;
}

JS

现在与移动设备, we don't really have拥有的奢侈设置宽度,尤其是任何超过300px。使用百分比也不起作用,因为它将相对于视口而不是父元素。我们可以使用JS, 在这种情况下使用 jQuery 来实现这一点。让我们看一下function that 将始终设置父级的宽度t 在给定时刻:

 function toggleFixed () {
      var parentwidth = $(".parent").width();      
      $(".child").toggleClass("fixed").width(parentwidth);        
  }

css:

.fixed{
    position:fixed;
}

View in CodePen http://codepen.io/Philll_t/pen/XMVYEa

动态宽度

这很好,但会发生什么如果窗口的宽度改变当用户仍在页面上时,用这个更改父元素?虽然父级可以调整其宽度,但子级将保持函数设置的宽度。我们可以用以下方法解决这个问题jQuery's https://api.jquery.com/resize/ resize()事件监听器。首先,我们需要将创建的函数分成两个:

function toggleFixed() {
   adjustWidth();
   $(".child").toggleClass("fixed");
 }

 function adjustWidth() {
   var parentwidth = $(".parent").width();
   $(".child").width(parentwidth);
 }

现在我们已经分离了每个部分,我们可以单独调用它们,我们将包含切换固定和宽度的原始按钮方法:

$("#fixer").click(
     function() {
       toggleFixed();
     });

现在我们还将调整大小事件侦听器添加到窗口:

 $(window).resize(
     function() {
       adjustWidth();
     })

View in CodePen http://codepen.io/Philll_t/pen/dvJKqQ

那里!现在我们有一个固定元素,当窗口大小调整时,它的大小也会调整。

结论

我们通过理解来应对这一挑战fixed的地位及其局限性。与绝对不同,fixed仅与视口相关,因此不能继承其父级的宽度。

为了解决这个问题,我们需要使用一些 JS 魔法来实现这一点,这对于 jQuery 来说并不需要太多。

在某些情况下,我们需要一种动态方法来缩放不同宽度的设备。我们再次采用了 JS 方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当使用position:fixed时是否可以保持父元素的宽度? 的相关文章

随机推荐

  • spring-mvc中将json解析为java对象

    我熟悉如何从我的返回 json Controller方法使用 ResponseBody注解 现在我正在尝试将一些 json 参数读入我的控制器 但到目前为止还没有运气 这是我的控制器的签名 RequestMapping value ajax
  • findOneAndUpdate 覆盖作为 doc 传递的 2 级以上深度对象中的属性

    假设我有这个架构 var UserSchema new Schema name firstName String lastName String 我创建这个用户 User create name firstName Bob lastName
  • 用户点击时使用ajax加载processing.js sketch

    我正在尝试通过单击 ajax 加载processing js 草图 但它不起作用 如果我立即加载草图 它会起作用 但不会在用户交互时加载 这是我的代码 clicker click function var canvasRef
  • 避免 Google Apps 脚本中出现 formatDate 错误

    我有一个函数可以存储在数组中并循环文档中的数据 在这个里面 有一些单元格的日期格式为 dd mm yyyy 但是当我通过电子邮件发送它时 看起来像2014 年 1 月 1 日星期三 00 00 00 GMT 0300 ART 我在这个函数内
  • IA-64 上出现段错误,但 IA-32 上没有

    我无法访问我的原始账户 https stackoverflow com users 211631 whacko cracko 如果可能的话 请版主合并帐户 这是我的问题 以下 C 程序在 IA 64 上出现段错误 但在 IA 32 上运行良
  • 使用 AngularJS 日期过滤器和 UTC 日期

    我有一个以毫秒为单位的 UTC 日期 我将其传递给 Angular 的日期过滤器以进行人工格式化 someDate date d MMMM yyyy 太棒了 除了someDate采用 UTC 时间 并且日期过滤器认为它是当地时间 我如何告诉
  • String(value) 与 value.toString() 有什么区别

    Javascript 在类型和类型转换方面有很多 技巧 所以我想知道这两种方法是否相同 或者是否存在某些特殊情况使它们不同 它们并不完全相同 实际上 作为函数调用的 String 构造函数 http bclary com 2004 11 0
  • Android:打开指定多个收件人的短信活动[重复]

    这个问题在这里已经有答案了 我正在尝试通过启动意图来启动手机短信提供商 我下面使用的代码是我用来启动意图的代码 Intent sendIntent new Intent Intent ACTION VIEW StringBuilder ur
  • 我应该在 git 别名脚本中使用 `sh -c \"...\"` 或 `"!f() {... ; }; f" 吗?

    我已经开始尝试编写带参数的 git 别名了 我见过一些人运行 shell 脚本 alias shAlias sh c 和其他运行函数 alias fAlias f f 看起来 一旦我加快了 Bash 的速度 这还不是我现在的状态 我想要做的
  • 在清单中声明 Google api 密钥(对于 youtube API)

    使用地图 API 我可以在清单中声明我的密钥
  • 部署的 Azure Function (v2) 未运行

    我有一个 Azure Function v2 可以在本地运行 部署到 Azure 后 一切似乎都正常 包含二进制文件的 bin 文件夹和包含 function json 的函数名称文件夹 但是 当我检查它们是否运行 查看日志 时 它们不在监
  • JavaScript 中的 DOM 解析

    一些背景 我正在使用 JavaScript 开发一个基于 Web 的移动应用程序 HTML 渲染基于 Safari 跨域策略已禁用 因此我可以使用 XmlHttpRequests 调用其他域 这个想法是解析外部 HTML 并获取特定元素的文
  • 使用 Haskell 输入数据

    背景故事 为了更好地理解 Haskell 和函数式编程 我给自己布置了一些作业 我的第一个任务是编写一个程序 可以查看数据集 一组数字 博客中的单词等 搜索模式或重复 对它们进行分组并报告它们 听起来很容易 Question 我希望程序首先
  • SELECT ... ORDER BY xxx LIMIT 1 FOR UPDATE 将锁定多少行?

    我有一个具有以下结构的查询 SELECT WHERE status QUEUED ORDER BY position ASC LIMIT 1 FOR UPDATE 这是 InnoDB 表上的单表 SELECT 语句 场地position I
  • 将 onBlur 与 JSX 和 React 结合使用

    我正在尝试创建一个密码确认功能 仅在用户离开确认字段后才呈现错误 我正在使用 Facebook 的 React JS 这是我的输入组件
  • XSLT 1.0 金额字段必须至少有 2 位小数

    我有两个 xml 有一个金额字段 可以包含 54 2 54 23 54 234 54 234567 等值 有人请告诉我如何确保输出 xml 中至少出现两位小数 当前 54 2 转换为 54 2 但我希望它是 54 20 您可以使用 form
  • 我可以使用没有 getter 和 setter 的 mvc 吗?

    如果我不想公开对象的状态 但仍然需要显示它 例如 以 HTML XML 或 JSON 的形式 我将如何在 MVC 环境中做到这一点 使用导出方法来导出简化的不可变对象 如果愿意的话 可以称为 数据类 是否有意义 添加与接口对话的渲染方法怎么
  • python 属性重载运算符

    是否可以重载 python 属性上的运算符 就像是 class Foo object property def bar self return unfoobar self bar bar setter def bar self baz se
  • 在分析代码时是否应该使用匹配的 (gcc) 编译器优化标志?

    我在用 O3 http linux die net man 1 g 编译代码时 现在我需要对其进行分析 对于分析 我遇到了两个主要选择 valgrind tool callgrind http valgrind org docs manua
  • 当使用position:fixed时是否可以保持父元素的宽度?

    当我们申请时position fixed到一个元素 它被采取脱离正常流动 http quirksmode org css css2 position html link7文档的宽度 因此它不尊重其父元素的宽度 有没有办法让它继承父级的宽度如