Страницы

Поиск по вопросам

вторник, 22 января 2019 г.

Наезд одного div на другой при hover

Здравствуйте, есть такая задача. Несколько блоков на сайте расположены друг под другом, при наведении на первый, его высота увеличивается и нижний сьезжает вниз соотвтественно. Подскажите возможно ли сделать так? упрощенная схема как это работает сейчас внизу в коде. Возможно ли это сделать не оборачивая эти два блока в дополнительный?
div{ width:200px; height:100px; } .red{ background-color:red; } .green{ background-color:green; } .red:hover{ height:150px; }

1
2


Ответ

вот так можно но это грубо, хотя зависит от ситуации, что именно тебе надо и как...
div { position: absolute; width: 200px; height: 100px; } .red { background-color: red; } .green { top: 100px; background-color: green; } .red:hover { height: 150px; z-index: 11; }

1
2

Dictionary является ли потокобезопасным для чтения?

Является ли Dictionary потокобезопасным для чтения и перебора значений?
То есть записи в этот Dictionary не будет (инициализируется только при запуске проекта), и хочу понять можно ли его использовать в контексте singleton сервиса в ASP.NET Core 2.0?


Ответ

https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx
Thread Safety A Dictionary can support multiple readers concurrently, as long as the collection is not modified.
то есть
Потокобезопасность ... поддерживает несколько одновременных операций чтения, постольку поскольку данные не изменяются.

SVG-графика (.NET, C#)

Имеется xml-документ с несколькими элементами rect и line. Возможно ли получить доступ к редактированию любого из этих элементов при открытии соответствующего svg-файла в графических редакторах, "знающих" SVG?


Ответ

Вы просто попробуйте скачать Inkscape с официального сайта И открыть файл, затем редактируйте его по вашим потребностям. Уроков по Inscape достаточно много, да и без них интуитивно понятно, что делать, тем более интерфейс редактора на русском. Далее сохраняете файл в нужном вам формате. В файле очень много служебной информации, его можно использовать и так, но лучше оптимизировать. Для оптимизации есть очень хороший редактор онлайн SVG-Editor Всё бесплатно, пользуйтесь.
Upd по комментариям автора вопроса
Пример анимации простейших фигур SVG (Рисование спирали с одновременным движением шарика)
Mouseover
Пояснения как это сделать
Учитесь на примерах, правьте их, пишите свои, самые элементарные

Как избежать множественного перечисления IEnumerable?

Есть метод, возвращающий последовательность, состоящую из пар соседних элементов. Например, по последовательности {1,2,3} метод должен вернуть две пары: (1,2) и (2,3).
Решение, которое сразу пришло в голову:
return items .Take(items.Count() - 1) .Zip(items.Skip(1), Tuple.Create);
Но в данном случае IEnumerable перечисляется больше одного раза. Как можно решить задачу без нескольких перечислений (сохранив метод ленивым)?


Ответ

Например, так. Объявим метод расширения, который выдаёт последовательные пары:
public static class EnumerableExtensions { public static IEnumerable Pairwise( this IEnumerable sequence, Func selector) { using (var it = sequence.GetEnumerator()) { if (!it.MoveNext()) yield break; T prev = it.Current; while (it.MoveNext()) yield return selector(prev, prev = it.Current); } } }
И пользуемся:
return items.Pairwise(Tuple.Create);

Указатели, небольшое недопонимание

Изучаю указатели на указатели в Си и возникли небольшие "непонятки".
int **pp, *p, A = 10, B = 20; p = &A, pp = &p; /* сейчас *p = **pp = 10 */ *pp = &B; /* теперь *p = **pp = 20 */
Кто-нибудь может мне объяснить, почему можно делать так, как мы сделали в строчке 3? Я экспериментально определил, что *pp и p лежат по одному адресу (но для вас это вряд ли новость), но почему так происходит я не совсем понимаю.


Ответ

int **pp, *p, A = 10, B = 20; p = &A
В p записан адрес переменной A
pp = &p;
В pp записан адрес переменной p. Значит, *pp - это по сути переменная p, в которой хранится адрес A. Ну, а **pp - это то же, что и *p, т.е. значение по адресу, хранящемуся в p - а там хранится адрес A. Значит, это значение A, т.е. 10.
*pp = &B;
Вспомним, что в pp хранится адрес переменной p, так что *pp по сути получается тем же, что и p. Т.е. запись в *pp сейчас - когда в pp хранится адрес p - то же самое, что запись в переменную p. А записываем мы туда адрес переменной B
А дальше применимы все те же рассуждения, что были сделаны выше, когда в p хранился адрес переменной A...

Как изменить цвет svg иконки

Подскажите как изменить цвет svg иконки? Код получен из photoshop c помощью плагина. Добавление атрибута style="fill: #000;" тегу image не помогает.


Ответ

Иконка сделана в растровом редакторе, скорее всего в плагине Фотошопа, а затем сохранена в формате data:image/png;base64. Иконка на самом деле осталась растровой, обернутой в SVG оболочку, поэтому через CSS ей невозможно поменять стили привычными методами.
Вот так иконка выглядит при десятикратном увеличении. На мой взгляд совсем не отличается от растра. Такие простые изображения лучше делать в векторных редакторах, в Inkscape например. Он бесплатен, но достаточно богат по реализованным функциям и одновременно прост, и интуитивно понятен в изучении.

Но, что есть, то есть. И в случае формата изображения base64 есть способы стилизации:
Применяя фильтры
Используя


 
 
        
    

 

 
 


И даже изменять цвет при наведении курсора:

 


        
     
 
        
     
	

 

 
 


Как вычислить координаты html элемента

Как вычислить (получить) позицию html елемента. offsetTop и offsetLeft даёт относительное значение (не всегда отчёт от точки [x=0,y=0] начала координат). Гугл даёт "недоделанный" вариант http://javascript.ru/ui/offset.
Не "как динамический во время scroll определить текущее местоположение элемента по отношению к родителю", а как получить абсолютные координаты относительно левого верхнего угла содержимого страницы.
Второй вопрос "определить текущее местоположение элемента по отношению к родителю" ещё раз повторяю, абсолютные координаты относительно левого верхнего угла содержимого страницы.
Нужно для "подвешивания" элементов к текущей верстке (что бы вывести на/возле определённого элемента подсказку, сообщение, рекламу и т.п.) например так:
document.getElementById("act_holder").style.position= "absolute"; document.getElementById("act_holder").style.display = "block"; document.getElementById("act_holder").style.top = (getOffset(document.getElementById("act_hlp")).top - 75 ) + "px"; document.getElementById("act_holder").innerHTML = "элемент занят";
при использовании absolute нужны координаты относительно левого верхнего угла.


Ответ

Вот код с javascript.ru собраный до кучи.
function getOffset(elem) { if (elem.getBoundingClientRect) { var box = elem.getBoundingClientRect(); var body = document.body; var docElem = document.documentElement; var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop; var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft; var clientTop = docElem.clientTop || body.clientTop || 0; var clientLeft = docElem.clientLeft || body.clientLeft || 0; return { top: Math.round(box.top + scrollTop - clientTop), left: Math.round(box.left + scrollLeft - clientLeft) } } else { var top=0, left=0 while(elem) { top = top + parseFloat(elem.offsetTop); left = left + parseFloat(elem.offsetLeft); elem = elem.offsetParent ; } return {top: top, left: left}; } }
Немного комментариев: ф-ция getBoundingClientRect вызвала спор, mozilla цитата
Возвращаемое значение getBoundingClientRect — это объект TextRectangle, содержащий свойства только для чтения left, top, right и bottom, описывающие бокс с границами в пиксельном измерении. Значения top и left даются относительно верхнего левого угла порта просмотра.
т.е. уже с учётом скролла и отступов документа, которые приходится вычитать если нужны координаты относительно начала системы координат листа (левый верхний угол документа). Даная функция getBoundingClientRect даст верный результат, если выполняется два условия: 1) позиция скроллинга ноль (на старте часто так), 2) если у документа (body) отступы не заданы, или заданы в ноль. Так как эти условия не всегда соблюдены - приходится использывать более сложные решения.
От себя добавлю, что если используется система отчёта position=fixed то getBoundingClientRect выдаст координаты которые подойдут к этой системе отчёта, но fixed редко используется, поскольку при изменении позиции скрола - позиция на экране сохраняется и елемент будет "плавать". А для absolute и static прийдётся делать пересчёт коодинат. Система relative - просто относительные координаты, в отдельных случаях её можно использовать.