Nano Hash - криптовалюты, майнинг, программирование

Как сделать сердце изменяемого размера в CSS с рамкой

Я хочу сделать форму сердца, размер которой может быть изменен пользователями до любой ширины и высоты и иметь границу 1 пиксель.

  1. Я попробовал сердце, сделанное на чистом CSS: https://stackoverflow.com/a/17386187/1404447

  2. Я попытался использовать шрифт, например: https://www.w3schools.com/charsets/tryit.asp?deci=9829&ent=hearts

  3. а также попробовал изображение SVG: https://css-tricks.com/hearts-in-html-and-css/#inline-svg

Однако вот мои проблемы:

  1. Его нельзя свободно и легко масштабировать, скажем, до 500x200 пикселей. Трудно добавить границу вокруг него

  2. Он не может быть растянут до других пропорций и не может быть увеличен, чтобы соответствовать, например. Коробка 500x400

  3. Это почти идеально, но граница (штрих) растягивается с размером. Я хочу, чтобы граница всегда была шириной 1 пиксель, независимо от масштаба.

Я также попытался сделать еще одну копию фигуры в виде тени (залитой черным цветом и слегка смещенной, с более низким z-индексом), но она не идеальна (граница не везде имеет одинаковую ширину):

введите здесь описание изображения

03.02.2021

Ответы:


1

Вероятно, моё сердце будет работать лучше, даже если всё ещё не идеально

.heart {
  width:200px;
  height:200px;
  background:
   radial-gradient(90% 90% at 60% 65%, transparent calc(64% - 1px), black 64%, transparent calc(64% + 1px)) top left,
   radial-gradient(90% 90% at 40% 65%, transparent calc(64% - 1px), black 64%, transparent calc(64% + 1px)) top right,
   linear-gradient(to bottom left,     transparent calc(43% - 1px), black 43%, transparent calc(43% + 1px)) bottom left ,
   linear-gradient(to bottom right,    transparent calc(43% - 1px), black 43%, transparent calc(43% + 1px)) bottom right;
  background-size:50% 50%;
  background-repeat:no-repeat;
  border:2px solid red;
  overflow:hidden;
  resize:both;
}
<div class="heart">
</div>

04.02.2021
  • Это интересно! Спасибо 04.02.2021

  • 2

    Пример ниже основан на простом веб-компоненте, основанном на iconocss. Недостатком примера является то, что он использует CSS scale() для достижения желаемого эффекта, поэтому Javascript потребуется для динамического изменения части масштаба.

    html,
    body {
      height: 100%;
      width: 100%;
    }
    
    :host {
      display: block;
    }
    
    pd-indicator:not(:defined) {
      display: none;
    }
    
    pd-indicator,
    pd-indicator:defined {
      display: block;
      position: absolute;
      top: 20%;
      left: 30%;
      padding: .75rem;
    }
    pd-indicator:first-child {
      transform: scale(5);
    }
    pd-indicator:last-child {
      transform: scale(8);
    }
    <script type="module" src="https://unpkg.com/[email protected]/pd-indicator.js"></script>
    <div class="parent">
      <pd-indicator type="icon-heart" color="000099" active-color="990000"></pd-indicator>
      <pd-indicator type="icon-heart" color="000099" active-color="990000"></pd-indicator>
    </div>

    04.02.2021

    3

    Для SVG, если вы хотите, чтобы граница (ширина штриха) оставалась одного и того же относительного размера,
    затем пересчитайте эту ширину штриха при изменении размера.

    path.setAttribute("stroke-width", startWidth / divWidth());

    (требуется более точный расчет)

    Обернутый в веб-компонент W3C (поддерживаемый во всех современных браузерах) с shadowDOM,
    инкапсулированный CSS прост, и можно использовать несколько тегов <my-hearts>

    <style>
      my-heart { --heartwidth: 80px  }
    </style>
    
    <my-heart></my-heart>
    <my-heart style="--heartwidth:100px"></my-heart>
    <my-heart style="--heartwidth:150px"></my-heart>
    <my-heart></my-heart>
    
    <script>
      customElements.define("my-heart", class extends HTMLElement {
        constructor() {
          super() // super sets and returns this scope
            .attachShadow({mode:"open"}) // sets and return this.shadowRoot
            .innerHTML = // no need for a Template
            `<style>:host{display: inline-block}
              div {
                width:var(--heartwidth,100px); height:var(--heartwidth,100px);
                resize:both; overflow:auto;
              }
              svg{  
                width:100%; height:100%; background:#ddd; vertical-align:top;
              }
              </style><div><svg preserveAspectRatio="none" viewBox="0 0 34 34">
        <path fill='lightcoral' stroke='red' stroke-width='1' d='m25 2c-3 0-6 3-8 6c-1-3-4-6-8-6c-4 0-8 4-8 8c0 9 10 12 16 21c6-9 16-12 16-21c0-4-4-8-8-8z'/>
        </svg></div>`; // end innerHTML
          let div = this.shadowRoot.querySelector("div");
          let path = this.shadowRoot.querySelector("path");
          let divWidth = () => ~~getComputedStyle(div).width.replace("px", "");
          let startWidth = divWidth();
          div.onmousemove =e=> path.setAttribute("stroke-width", startWidth / divWidth());
        }
      });
    </script>

    04.02.2021
  • Спасибо, это приятно! 04.02.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..