点击空白区域隐藏此模块

点击空白区域隐藏此模块

因为今天公司做项目的时候用到了,也百度看了一些资料,总结一下简单的写法吧,基于vue框架写的这个东西,以下拉菜单组件为例子,我自己总结了一下

首先要明了想要操作的目标元素和触发事件

触发显示的目标元素:你要对于通过哪个元素来触发事件
想要显示或者隐藏的目标元素:通过点击不同的区域显示还是隐藏的元素
触发的监听事件:既然是点击肯定是click,或者是鼠标的按下和松开mousedown等等,这个例子我们用click

<template>
  <div>
    <div>
      <div class="drop">
        <div class="outer">{{ index }}</div>
        <ion-icon
          ref="ico"
          class="iions"
          name="caret-down-sharp"
        ></ion-icon>
        <div>
          <div class="inner" v-show="show">
            <ul>
              <li
                v-for="(item, index) in datas"
                :key="index"
                @click="pitch(item)"
              >
                {{ item }}
              </li>
            </ul>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "DateSelector",

  data() {
    return {
      name: "",
      show: true,
      datas: [2020, 2021, 2022],
      index: "",
    };
  },
  computed: {},
  mounted() {
    document.addEventListener("click", this.select);
  },
  methods: {
    select($event) {
      this.show = true;
      let sp = this.$refs.ico;
      if (sp) {
        if (!sp.contains($event.target)) {
          //这句是说如果我们点击到了id为myPanel以外的区域
          this.show = false;
        }
      }
    },
    pitch(item) {
      this.index = item;
    },
  },
  watch: {},
};
</script>
<style scoped>
.selectdate {
  display: flex;
  height: 20px;
  line-height: 20px;
  margin-top: 5px;
  margin-bottom: 5px;
}

.drop {
  position: relative;
  display: flex;
  width: 80px;
  line-height: 20px;
  border-bottom: 1px solid rgba(0, 0, 0, 0.5);
}
.outer {
  width: 56px;
  height: 20px;
  text-align: center;
  line-height: 20px;
}

.iions {
  font-size: 15px;
  margin-top: 2px;
  cursor: pointer;
}

ul {
  width: 80px;
  padding: 0;
  margin: 0;
  list-style: none;
}
li {
  height: 20px;
  background: #fff;
  text-align: center;
  padding: 0;
  margin: 0;
  list-style: none;
  border-bottom: 1px solid rgba(0, 0, 0, 0.3);
  cursor: pointer;
  line-height: 25px;
}
.inner {
  position: absolute;

  top: 25px;
  left: 0px;
  z-index: 1000;
}
.qi {
  display: inline-block;
  width: 40px;
  text-align: center;
}
</style>

简单写了一个小组件作为样例做示范
需求分析:因为做下拉框时候,点击其他空白区域使得下拉框关闭,下拉框通过👇按钮触发也就是触发显示的目标元素,下拉列表通过v-show=”show“控制隐藏还是显示下拉的列表也就是想要显示或者隐藏的目标元素
(1)需要判断点击的是👇按钮还是👇按钮之外的区域,如果是按钮则直接使得show=true,如果是区域外的地方则show=false

但是怎么判断是否为区域外还是区域内呢?

我们直接做一个监听即可,监听整个click事件,也就是我们说的触发的监听事件,那么我们三元素已经凑齐了,

第一步,我们对于点击事件做一个全局的监听(无论在哪里点击都可以响应)

mounted() {
    document.addEventListener("click", this.select);
  },

每次点击时候都会触发this.select这个方法,这个方法也就是下边的方法

 select($event) {
      let sp = this.$refs.ico;
      if (sp) {
        if (!sp.contains($event.target)) {
          //这句是说如果我们点击到了触发显示的目标元素以外的区域
          this.show = false;
        }else{
 			this.show = true;
		}
      }
    },

触发之后我们传入一个$event是指当前触发的是什么事件(鼠标事件,键盘事件等)而后续我们也会用到 $event.target则指的是事件触发的目标,即哪一个元素触发了事件,这将直接获取该dom元素,直接在这里解释了

继续,我们这里通过$refs直接得到触发显示的目标元素,(vue框架知识,不像用document特别繁琐,这里vue独特的方式非常方便不多说)
(1)判断该元素是否存在
(2)判断是否点击到了触发显示的目标元素以外的区域,如果是直接显示fasle,否则显示出来即可
!sp.contains( $event.target)

简单就说这么多,用到了觉得不错,总结下来,还是那句话,积少成多,终成大器!
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 您可以通过在QLineEdit周围放置一个透明的QWidget来实现这个功能。当用户单击这个QWidget时,您可以隐藏QCalendarWidget,当用户单击QLineEdit时,您可以显示QCalendarWidget。 以下是一个简单的代码示例,它实现了这个功能: ``` #include <QtWidgets> class DateSelectionDialog : public QDialog { Q_OBJECT public: DateSelectionDialog(QWidget *parent = nullptr) : QDialog(parent) { QVBoxLayout *layout = new QVBoxLayout(this); m_calendar = new QCalendarWidget(this); layout->addWidget(m_calendar); connect(m_calendar, &QCalendarWidget::clicked, this, &DateSelectionDialog::onCalendarClicked); } QDate selectedDate() const { return m_selectedDate; } signals: void dateSelected(const QDate &date); private slots: void onCalendarClicked(const QDate &date) { m_selectedDate = date; emit dateSelected(date); hide(); } private: QCalendarWidget *m_calendar; QDate m_selectedDate; }; class DateLineEdit : public QLineEdit { Q_OBJECT public: DateLineEdit(QWidget *parent = nullptr) : QLineEdit(parent) { setReadOnly(true); m_backgroundWidget = new QWidget(this); m_backgroundWidget->setFixedSize(size()); m_backgroundWidget->setStyleSheet("background-color: transparent;"); m_backgroundWidget->lower(); connect(m_backgroundWidget, &QWidget::clicked, this, &DateLineEdit::onBackgroundClicked); connect(this, &QLineEdit::clicked, this, &DateLineEdit::onClicked); } private slots: void onClicked() { QPoint pos(0, height()); pos = mapToGlobal(pos); m_dateSelectionDialog.move(pos); m_dateSelectionDialog.show(); } void onBackgroundClicked() { m_dateSelectionDialog.hide(); } void onDateSelected(const QDate &date) { setText(date.toString(Qt::ISODate)); } private: DateSelectionDialog m_dateSelectionDialog; QWidget *m_backgroundWidget; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); DateLineEdit dateLineEdit; dateLineEdit.show(); return app.exec(); } #include "main.moc" ``` 在这个代码示例中,我们创建了一个名为DateLineEdit的自定义QLineEdit,它包含一个DateSelectionDialog对象和一个透明的QWidget对象。当用户单击QLineEdit时,我们显示DateSelectionDialog。当用户单击透明QWidget时,我们隐藏DateSelectionDialog。当用户选择日期时,我们使用setText()方法设置QLineEdit中的文本。另外,当用户单击空白区域时,DateSelectionDialog会自动隐藏。 ### 回答2: 要实现点击空白区域隐藏日历,可以通过以下步骤来实现: 1. 首先,需要在页面上布置一个包含日历的元素,可以是一个弹出、一个下拉菜单或一个固定位置的日历区域。 2. 我们可以利用HTML和CSS来创建日历的UI界面,包括日期的选择、日历的显示等。 3. 使用JavaScript来实现点击空白区域隐藏日历的功能。可以通过给整个页面添加一个点击事件监听器,当用户点击页面上的任意区域时触发事件。 4. 在点击事件中,我们需要判断点击区域是否是日历区域的外部区域。可以通过比较点击的坐标和日历区域的位置来判断。如果点击在日历区域内部,则不做任何操作;如果点击在日历区域外部,则隐藏日历。 5. 当用户点击了日历区域外部时,可以通过修改日历元素的样式来隐藏日历。可以使用CSS中的display属性或visibility属性来控制日历的显示与隐藏。 6. 最后,为了增强用户体验,可以在实现的基础上添加一些附加功能,比如当用户点击其他区域时,如果日历已经显示,则隐藏日历;如果日历已经隐藏,则不做任何操作。 通过以上步骤,就可以实现点击空白区域隐藏日历的功能了。这样用户可以方便地在页面上选择日期,并且不会干扰到其他的操作。 ### 回答3: 要实现点击空白区域日历隐藏,可以通过以下步骤: 1. 监听空白区域点击事件:首先,需要在页面中添加一个透明的或者不可见的元素,覆盖整个页面,作为空白区域。然后,使用JavaScript或者其他适用的技术,给这个元素绑定一个点击事件监听器。 2. 判断点击事件来源:在点击事件监听器中,需要判断点击事件的来源。如果点击事件触发的元素不属于日历组件,则执行隐藏日历的操作,否则忽略该点击事件。 3. 隐藏日历:如果点击事件的来源不是日历组件,那么就执行隐藏日历的操作。隐藏日历可以通过修改日历组件的样式或者添加一个class来实现。可以设置日历组件为display: none;,或者添加一个样式类,该类将日历元素的display属性设置为none。 这样,当用户点击空白区域时,就会触发点击事件,通过判断事件来源是否为日历组件,来决定是否隐藏日历。这种实现方式可以确保只在非日历组件区域点击隐藏日历,而在点击日历组件时不会隐藏日历。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值