看到渣浪的查看文章或者查看大图有个效果:弹窗查看内容时,如果内容过长有滚动条,则滚动条会被放到body区滚动

什么意思呢?

看个图片,一般正常弹窗是有宽高限制的,如果内容过长则直接在弹窗中进行滚动

点我预览

将滚动位置放到整个body中,让弹窗中内容自适应高度

这么做的好处自然很明显,body区域有更大的可视区域,来看看最后的效果

点我预览

那具体是怎么实现呢

其实不算很难,各位看官可以先想一想能怎么搞

首先,得先弄一个基本的弹窗逻辑,为了简单,就直接操作了。可以自行封装

写个HTML结构

<button class="show-big-img" data-h="300">查看大图 h300</button>
<button class="show-big-img" data-h="3000">查看大图 h3000</button> <div class="layer-shade"></div>
<div class="layer-wrap">
<a href="javascript:;" class="layer-close">&times;</a>
<div class="layer-content">
<p class="show-origin-img">
<a href="javascript:;">查看原图</a>
</p>
<div class="big-img">
<div class="big-img__item">我是图片</div>
</div>
</div>
</div>

将 layer-shade 看作遮罩,将 layer-wrap看作弹窗,将 layer-content 看作弹窗内容区,将 big-img__item 看作这里的长图片(长内容)

把样式写好

 body {
&.layer-scroll-in-body {
overflow: hidden;
}
} .layer-shade {
display: none;
position: fixed;
width: 100%;
height: 100%;
top:;
left:;
background-color: #000;
opacity: .15; &.visible {
display: block;
}
} @keyframes bounceIn {
to {
opacity:;
transform: scale(1);
}
} .layer-wrap {
display: none;
z-index:;
position: fixed;
width: 70%;
height: 50%;
top: 100px;
left: 100px;
background-color: #000;
border-radius: 3px; opacity:;
transform: scale(.3); &.visible {
display: block;
animation: bounceIn .5s;
animation-fill-mode: both;
} &.layer-scroll-in-body {
position: absolute;
height: auto;
} &__wrapper {
overflow: auto;
position: fixed;
top:;
right:;
width: 100%;
height: 100%;
}
} .layer-close {
position: absolute;
top: -16px;
right: -12px;
width: 24px;
height: 24px;
text-decoration: none;
color: #fff;
background: #999;
border-radius: 50%;
border: 3px solid #fff;
text-align: center;
line-height: 22px;
font-size: 22px; &:hover {
background-color: #358eea;
}
} .layer-content {
height: 100%;
overflow: auto;
} .show-origin-img {
position: absolute;
top: 5px;
right: 20px;
font-size: 12px; a {
color: #fff;
text-decoration: none; &:hover {
text-decoration: underline;
}
} } .big-img {
display: flex;
justify-content: center;
box-sizing: border-box;
padding: 20px; &__item {
display: flex;
justify-content: center;
align-items: center;
max-width: 100%;
width: 300px;
height: 3000px;
background-color: #c7bdb3;
}
}

最后加上JS操作逻辑

// 显示弹窗
function showLayer(onShow, onClose) {
var $body = $('body'),
$layerShade = $('.layer-shade'),
$layerWrap = $('.layer-wrap'); // 查看大图
$('.show-big-img').click(function() {
$layerWrap.find('.big-img__item').css('height', $(this).attr('data-h')); // 显示前处理
if (onShow && typeof onShow === 'function') {
onShow($body, $layerWrap);
} $layerShade.addClass('visible');
$layerWrap.addClass('visible');
}); $('.layer-close').click(function() {
// 关闭前处理
if (onClose && typeof onClose === 'function') {
onClose($body, $layerWrap);
} $layerShade.removeClass('visible');
$layerWrap.removeClass('visible');
});
} // 显示弹窗,并设置弹窗内容滚动区为body区
function showLayerScrollInBody(setPageScroll) {
// 模拟:确保显示弹窗前页面由垂直方向滚动条
setPageScroll && $('.show-big-img').css('margin-bottom', 2000); showLayer(function($body, $layer) {
// body设置 overflow: hidden
$body.addClass('layer-scroll-in-body'); $layer
.addClass('layer-scroll-in-body')
// 弹出层增加一层父级
.wrap('<div class="layer-wrap__wrapper">');
}, function($body, $layer) {
// 关闭弹窗,则恢复
$body.removeClass('layer-scroll-in-body'); $layer
.removeClass('layer-scroll-in-body')
.unwrap();
});
} showLayer(); /* showLayerScrollInBody(); */ /* showLayerScrollInBody(true); */

代码不算太复杂,如果到这里为止已经看懂的话,应该不需要再往下看了

一般的弹窗实现,需要设置遮罩层和弹窗的position为fixed,才能更好地保证页面有滚动条的时候位置不会出错。

fixed之后,弹窗的最大高度为视窗高度,若要使得弹窗的内容区直接显示出来,就必须设置为非fixed值,而弹窗不能少了定位,那就只能使用 absolute值了

但设置了absolute就无法计算页面有滚动条的时候的位置,所以需要给弹窗包裹一层父级,设置为fixed,则弹窗基于此父级来定位,相应的 top 和 left 值无需改变

$layer.wrap('<div class="layer-wrap__wrapper">');
&__wrapper {
overflow: auto;
position: fixed;
top:;
right:;
width: 100%;
height: 100%;
}

原先弹窗是设置了高度的,所以需要进行重置。推荐使用css类名来切换,方便维护

$layer.addClass('layer-scroll-in-body')
&.layer-scroll-in-body {
position: absolute;
height: auto;
}

在页面有滚动条的时候,还要注意页面的滚动条会不会和弹窗中的滚动条产生冲突,如

所以需要给body设置

$body.addClass('layer-scroll-in-body');
body {
&.layer-scroll-in-body {
overflow: hidden;
}
}

最后,记得在弹窗关闭的时候,还原相关的更改即可

弹窗查看内容时 内容滚动区域设置为body区的更多相关文章

  1. PyQt(Python+Qt)学习随笔:QScrollArea滚动区域layout布局的作用及设置方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 滚动区域可以设置布局,布局的作用其实与其他布局一样,就是在滚动区域大小调整时,滚动区域内的子部件跟随 ...

  2. 第15.29节 PyQt(Python+Qt)入门学习:containers容器类部件QScrollArea滚动区域详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 Scroll Area提供了一个呈现在其他部件上的可滚动区域视图,滚动区域用于显示框架内的 ...

  3. 滚动条ScrollViewer防止滚动时按内容跳跃式滚动的设置

    原文:滚动条ScrollViewer防止滚动时按内容跳跃式滚动的设置 属性中将CanContentScroll设置为False,滚动时就不会跳了,会连续的滚动

  4. PyQt(Python+Qt)学习随笔:怎么在QScrollArea滚动区域中展示子部件的超长内容?

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 滚动区域可以针对部署在其上的子部件在不可见时进行滚动展示,但这种滚动展示仅只能展示内容层可见范围的子 ...

  5. DEDECMS织梦全站动态化访问(包括自由列表freelist)及发布内容时自动动态化设置

    DEDECMS织梦 - 全站已有内容全部设置为动态化访问(包括自由列表freelist),以及发布内容时自动为动态化,设置分为三个步骤: 1.将所有文档设置为“仅动态”:执行以下mysql语句:upd ...

  6. 列表内容自动向上滚动(原生JS)

    效果展示 (鼠标移入,滚动停止:鼠标移出,滚动继续) 实现原理 1. html结构:核心是ul > li,ul外层包裹着div.因为想要内容循环滚动无缝衔接,所以在原有ul后面还要有一个一样内容 ...

  7. 微信小游戏排行榜页滚动查看排行榜(canvas指定区域溢出滚动,懒渲染)

    在微信小游戏中,好友排名数据是能在关系数据域操作,整个关系数据域只会返回一个最终的sharedCanvas,并且这个canvas不能调用toDataURL()方法,所以要展示好友排行榜的话只能在关系数 ...

  8. android 自定义无限循环播放的viewPager。轮播ViewPager。实现循环播放 广告,主题内容,活动,新闻内容时。

    前言 实际项目需要一个 播放广告的控件,可能有多个广告图片.每个一段时间更换该图片.简单来说,就是一个 “循环播放图片”的控件. 间隔时间更换图片 一般来说,图片切换时需要有动画效果 需要支持手势,用 ...

  9. 查看jar包内容

    查看jar包内容 查看jar包内容的基本命令: jar tf jar-file 参数解释: The t option indicates that you want to view the table ...

随机推荐

  1. 在ExtJS中查看视频

    listeners: { render: function() { win.update( '<video src="' + path+ '" width="100 ...

  2. windows下qt的.exe的dll文件怎么配齐

    用qt自带的windeploy工具即可 win键打开开始菜单 找到qt目录下的qt for desktop(mingw)并打开 qtcreater或者vs打开要部署的项目,构建成release模式,运 ...

  3. php中的冒泡排序和选择排序d

    //冒泡算法 //定义一个数组  $arr=arr{2,5,1155,3,8}; $len=count($arr); for($i=0;$i<$len-1;$i++) //定义以下需要宣传的次数 ...

  4. maven 项目快速下载jar方式

    maven仓库默认在国外,使用难免很慢,尤其是下载依赖的时候,换为国内镜像,让你感受飞一般的感觉.国内支持maven镜像的有阿里云,开源中国等,这里换为阿里云的. 修改maven配置文件setting ...

  5. PYTHON进阶(3)

    学习内容: 1.Python模块redis 2.Python模块memcach 3.Python模块SQLAlchemy 一.Python模块redis redis介绍 二.Python模块memca ...

  6. C++用法及学习心得

    通过对C++语言的学习,我感觉C++语言是有一定难度却又是非常有趣的科目.也是很有帮助的,对我们未来工作学习而言.我们可以通过C++语言进行更深层次的理解和思考.通过学习我懂得了C++语言是面向对象的 ...

  7. asp.net中的Filter类型其实是被当作单例的

    Filter对请求进行过滤.例如,在进行身份验证的基础上增加一些权限判断,对于身份验证通过的用户,检测其是否有开通UserSpace,如果没有则在Response中说明.示例代码如下: public ...

  8. 微服务中Feign快速搭建

    在微服务架构搭建声明性REST客户端[feign].Feign是一个声明式的Web服务客户端.这使得Web服务客户端的写入更加方便 要使用Feign创建一个界面并对其进行注释.它具有可插入注释支持,包 ...

  9. 四面美团,收割 offer

    阅读本文大概需要 6 分钟. 来源:https://blog.csdn.net/csuliyajin2012/article/details/49430659 美团我是在拉勾网上投的简历,之前也投过一 ...

  10. Java核心技术卷一基础知识-第11章-异常、断言、日志和调试-读书笔记

    第11章 异常.断言.日志和调试 本章内容: * 处理错误 * 捕获异常 * 使用异常机制的技巧 * 使用断言 * 日志 * 调试技巧 * GUI程序排错技巧 * 使用调试器 11.1 处理错误 如果 ...