控制父级别hover + 兄弟元素控制

改动点: 控制父级别hover + 兄弟元素控制

&:hover {
  .announcement-default-wrap{
    display: block;
    padding: 10px 23px;
    border-radius: 4px;

    .announcement-default-title-wrap {
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
    
    .announcement-default-content-wrap {
      font-size: 12px;
      line-height: normal;
      letter-spacing: normal;
      margin-top: 6px;
      word-wrap:break-word;
      white-space: pre-line;
    }
  }
  }
  &:hover{
    .announcement-show-wrap{
      &.announcement-icon-title{
        display: none;
      }
    }
  }
  .announcement-edit + .announcement-default-wrap {
    display: none;
  }
  .announcement-edit + .announcement-show-wrap {
    &.announcement-icon-title{
      display: none;
    }
  }

-------------------------源码--------------------------------

import React, { useState, useRef, useEffect } from 'react'
import PropTypes from 'prop-types'
import _ from 'lodash'
import CX from 'classnames'

import CancelButton from '../CancelButton'
import SmallButton from '../SmallButton'

import './index.less'

export default function ClassroomAnnouncement(props) {
  const {
    announcement, onSendAnnouncement, style, isEditable, theme,
  } = props

  const [announcementStatus, setAnnouncementStatus] = useState('normal')

  const inputElem = useRef(null)

  useEffect(() => {
    if (announcementStatus === 'edit') {
      inputElem.current.value = announcement
    }
  }, [announcement, announcementStatus])

  const handleEditAnnouncement = () => {
    setAnnouncementStatus('edit')
  }

  const handleCancelAnnouncementEdit = () => {
    setAnnouncementStatus('normal')
  }

  const handleSaveAnnouncement = () => {
    const elem = inputElem.current
    const inputString = _.trim(elem.value)
    onSendAnnouncement(inputString)
    elem.value = ''
    setAnnouncementStatus('normal')
  }

  const showNormalAnnouncement = (
    // 学生应该判断公告是否为空
    isEditable === false ? announcement !== '' : true
  )

  return (
    <div
      className={
        CX('announcement-wrap', {
          'announcement-wrap-normal': theme === 'normal',
          'announcement-wrap-dark': theme === 'dark',
          'announcement-fixed-height': showNormalAnnouncement,
        })
      }
      style={style}
    >
      {
        showNormalAnnouncement && announcementStatus !== 'edit' && (
        <div className="announcement-show-wrap announcement-icon-title">
          <i className="announcement-show-icon" />
          <span className="announcement-show-font">{announcement || '点击发布教室公告'}</span>
        </div>
        )
      }
      {
        announcementStatus === 'edit' && (
          <div className="announcement-edit">
            <div className="announcement-edit-header announcement-icon-title">
              <i className="announcement-edit-icon" />
              <span className="announcement-show-font">编辑教室公告</span>
            </div>
            <div className="announcement-edit-body">
              <textarea
                className="announcement-edit-textarea"
                placeholder="点击编辑公告信息"
                ref={inputElem}
                // defaultValue={announcement}
                maxLength="140"
              />
            </div>
            <div className="announcement-edit-footer">
              <SmallButton
                onClick={handleSaveAnnouncement}
                text="发 布"
                theme={theme}
              />
              <CancelButton
                onClick={handleCancelAnnouncementEdit}
                text="取 消"
                style={{
                  marginLeft: '24px',
                }}
                theme={theme}
              />
            </div>
          </div>
        )
      }
      {
        <div className="announcement-default-wrap">
          <div className="announcement-default-title-wrap">
            <div className="announcement-default-title-left announcement-icon-title">
              <i className="announcement-show-icon" />
              <span className="announcement-show-font">公告信息</span>
            </div>
            <div className="announcement-default-title-right">
              {
                  isEditable && (
                    <SmallButton
                      onClick={handleEditAnnouncement}
                      text="编 辑"
                      theme={theme}
                    />
                  )
                }
            </div>
          </div>
          <div className="announcement-default-content-wrap">
            <span>{announcement || '当前未设置公告信息'}</span>
          </div>
        </div>
      }
    </div>
  )
}

ClassroomAnnouncement.propTypes = {
  announcement: PropTypes.string,
  onSendAnnouncement: PropTypes.func.isRequired,
  style: PropTypes.object,
  isEditable: PropTypes.bool,
  theme: PropTypes.string,
}

ClassroomAnnouncement.defaultProps = {
  announcement: '',
  style: {},
  isEditable: true,
  theme: 'normal',
}

.announcement-wrap {
  width: 100%;
  box-sizing: border-box;
  z-index: 1;

  .announcement-show-wrap {
    padding: 12px 23px;
  }

  .announcement-icon-title {
    display: flex;
    align-items: center;
    font-size: 12px;
    line-height: normal;
    letter-spacing: normal;

    .announcement-show-icon,.announcement-edit-icon {
      flex: 0 0 auto;
      width:15px;
      height: 15px;
    }

    .announcement-show-font {
      flex: 1 1 auto;
      margin-left:7px;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
  }

  .announcement-default-wrap {
    display: none;
  }
  &:hover {
  .announcement-default-wrap{
    display: block;
    padding: 10px 23px;
    border-radius: 4px;

    .announcement-default-title-wrap {
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
    
    .announcement-default-content-wrap {
      font-size: 12px;
      line-height: normal;
      letter-spacing: normal;
      margin-top: 6px;
      word-wrap:break-word;
      white-space: pre-line;
    }
  }
  }
  &:hover{
    .announcement-show-wrap{
      &.announcement-icon-title{
        display: none;
      }
    }
  }
  .announcement-edit + .announcement-default-wrap {
    display: none;
  }
  .announcement-edit + .announcement-show-wrap {
    &.announcement-icon-title{
      display: none;
    }
  }

  .announcement-edit{
    padding: 12px 17px;
    border-radius: 4px;
    .announcement-edit-header{
      color: #364152;
    }

    .announcement-edit-body{
      .announcement-edit-textarea{
        height: 120px;
        width: 100%;
        margin: 8px 0;
        padding: 13px;
        border-radius: 4px;
        outline: none;
        resize: none;
        opacity: 0.56;
        font-size: 12px;
        letter-spacing: normal;
        line-height: normal;
        box-sizing: border-box;
      }
    }
  }

  &.announcement-wrap-normal{
    .announcement-show-wrap{
      background: #fff;
    }

    .announcement-default-wrap{
      background: #fff;
      box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);

      .announcement-default-content-wrap{
        color: #364152;
      }
    }

    .announcement-icon-title{
      color: #6b9af9;

      .announcement-show-icon{
        background: url('~ROOT/shared/assets/image/icon-announcement-show-normal-51-45.png') no-repeat center center;
        background-size: 15px;
      }

      .announcement-edit-icon{
        background-image: url('~ROOT/shared/assets/image/icon-announcement-edit-normal-48-48.png');
        background-size: 15px;
      }
    }

    .announcement-edit{
      box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
      background: #fff;
      .announcement-edit-textarea{
        border: solid 1px #f0f2f8;
        background-color: #ffffff;
        color: #364152;
      }
    }
  }

  /* 黑暗主题 */
  &.announcement-wrap-dark{
    padding: 0 12px;

    .announcement-show-wrap{
      background: transparent;
      padding: 12px;
    }

    .announcement-icon-title{
      color: #ffffff;

      .announcement-show-icon{
        background: url('~ROOT/shared/assets/image/icon-announcement-show-normal-dark-51-45.png') no-repeat center center;
        background-size: 15px;
      }

      .announcement-edit-icon{
        background-image: url('~ROOT/shared/assets/image/icon-announcement-edit-normal-dark-48-48.png');
        background-size: 15px;
      }

      .announcement-show-font{
        opacity: 0.6;
      }
    }

    .announcement-default-wrap{
      box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.5);
      border: solid 1px #ffffff;
      background-color: #5e6775;
      padding: 10px 12px;

      .announcement-default-content-wrap{
        color: #ffffff;
      }
    }

    .announcement-edit{
      box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.5);
      border: solid 1px #ffffff;
      background: #5e6775;
      padding: 12px;
      .announcement-edit-textarea{
        border: solid 0.5px rgba(255, 255, 255, 0.6);
        background-color: rgba(216, 216, 216, 0);
        color: #ffffff;
        opacity: 1;

        &::placeholder{
          color: #ffffff;
        }
      }
    }
  }

  &.announcement-fixed-height{
    height: 41px;
  }
}

.screen-share-layout-component-wrap .announcement-wrap{
  pointer-events: all;
}


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 一、理论基础知识部分 1.1、讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起T...
    我家媳妇蠢蠢哒阅读 3,104评论 2 106
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 3,781评论 0 0
  • 概述 在网易云课堂学习李南江老师的《从零玩转HTML5前端+跨平台开发》时,所整理的笔记。笔记内容为根据个人需求所...
    墨荀阅读 2,320评论 0 7
  • 1.块级元素和行内元素 块级(block-level)元素;行内(内联、inline-level)元素。 块元素的...
    饥人谷_小侯阅读 1,967评论 1 4
  • 《每个故乡都在消逝》——王开岭
    QAQ想入菲菲阅读 174评论 0 0